1
(* This example, submitted by A. Appel, checks the efficiency of
2
injection (see bug #1173) *)
3
(* Expected time < 1.50s *)
5
Set Implicit Arguments.
7
Record joinable (t: Type) : Type := Joinable {
9
join: t -> t -> t -> Prop;
10
join_com: forall a b c, join a b c -> join b a c;
11
join_empty: forall e a b, is_empty e -> join e a b -> a=b;
12
exists_empty: forall a, exists e, is_empty e /\ join e a a;
13
join_empty2: forall a b c, join a b c -> is_empty c -> is_empty a;
14
join_empty3: forall e a, join e a a -> is_empty e;
15
join_assoc: forall a b c d e, join a b d -> join d c e ->
16
exists f, join b c f /\ join a f e;
17
join_eq: forall x y z z', join x y z -> join x y z' -> z = z';
18
cancellation: forall a1 a2 b c, join a1 b c -> join a2 b c -> a1=a2
21
Record joinmap (key: Type) (t: Type) (j : joinable t) : Type
25
lookup: jm_t -> key -> t;
26
prim : forall (f: key -> t) (e: t),
27
(forall k, j.(join) e (f k) (f k)) ->
29
join_rule: forall s1 s2 s,
30
jm_j.(join) s1 s2 s <->
31
forall x, j.(join) (lookup s1 x) (lookup s2 x) (lookup s x);
32
empty_rule: forall e x, jm_j.(is_empty) e -> j.(is_empty) (lookup e x);
33
prim_rule: forall f e pf k, lookup (prim f e pf) k = f k;
35
(forall x, lookup s1 x = lookup s2 x) <-> s1 = s2;
36
can_join: forall s1 s2,
38
j.(join) (lookup s1 x) (lookup s2 x) v) ->
39
exists s3, jm_j.(join) s1 s2 s3;
40
can_split: forall s1 s3,
42
j.(join) (lookup s1 x) v (lookup s3 x)) ->
43
exists s2, jm_j.(join) s1 s2 s3
46
Parameter mkJoinmap : forall (key: Type) (t: Type) (j: joinable t),
49
Parameter ADMIT: forall p: Prop, p.
50
Implicit Arguments ADMIT [p].
53
Parameter jb : joinable bool.
54
Definition jm: joinmap nat jb := mkJoinmap nat jb.
55
Definition t := jm.(jm_t).
56
Definition j := jm.(jm_j).
57
Parameter nonempty: t -> Prop.
64
Inductive own : Type :=
66
| VAL' : forall sh, Share.nonempty sh -> own
67
| LK : forall sh, Share.nonempty sh -> Share.t -> inv -> own
68
| CT : forall sh, Share.nonempty sh -> own
69
| FUN: forall sh, Share.nonempty sh -> inv -> own.
71
Definition own_join (a b c: own) : Prop :=
75
| VAL' sa _ , VAL' sb _, VAL' sc _ => Share.j.(join) sa sb sc
76
| LK sa pa ha fa, LK sb pb hb fb, LK sc pc hc fc =>
77
Share.j.(join) sa sb sc /\
78
Share.j.(join) ha hb hc /\
81
| CT sa pa , CT sb pb, CT sc pc => Share.j.(join) sa sb sc
82
| FUN sa pa fa, FUN sb pb fb, FUN sc pc fc =>
83
Share.j.(join) sa sb sc /\ fa=fc /\ fb=fc
87
Definition own_is_empty (a: own) := a=NO.
89
Definition jown : joinable own :=
90
Joinable own_is_empty own_join
91
ADMIT ADMIT ADMIT ADMIT ADMIT ADMIT ADMIT ADMIT .
94
Fixpoint sinv (n: nat) : Type :=
97
| S n => prodT (sinv n) (own (sinv n) -> unit -> Prop)
100
Parameter address: Set.
102
Definition jm (n: nat) := mkJoinmap address (jown (sinv n)).
104
Definition worldfun (n: nat) := (jm n).(jm_t).
106
Inductive world : Type :=
107
mk_world: forall n, worldfun n -> world.
109
Lemma test: forall n1 w1 n2 w2, mk_world n1 w1 = mk_world n2 w2 ->