1
Definition ifte (T : Set) (A B : Prop) (s : {A} + {B})
2
(th el : T) := if s then th else el.
4
Implicit Arguments ifte.
6
Lemma Reflexivity_provable :
7
forall (A : Set) (a : A) (s : {a = a} + {a <> a}),
8
exists x : _, s = left _ x.
12
split with x; reflexivity.
19
Lemma Disequality_provable :
20
forall (A : Set) (a b : A),
21
a <> b -> forall s : {a = b} + {a <> b}, exists x : _, s = right _ x.
28
split with b0; reflexivity.
34
Parameter eq_dec : forall a a' : T, {a = a'} + {a <> a'}.
37
Module Type SET (Elt: ELEM).
40
Parameter add : Elt.T -> T -> T.
41
Parameter find : Elt.T -> T -> bool.
45
Axiom find_empty_false : forall e : Elt.T, find e empty = false.
47
Axiom find_add_true : forall (s : T) (e : Elt.T), find e (add e s) = true.
51
forall (s : T) (e e' : Elt.T), e <> e' -> find e (add e' s) = find e s.
55
Module FuncDict (E: ELEM).
56
Definition T := E.T -> bool.
57
Definition empty (e' : E.T) := false.
58
Definition find (e' : E.T) (s : T) := s e'.
59
Definition add (e : E.T) (s : T) (e' : E.T) :=
60
ifte (E.eq_dec e e') true (find e' s).
62
Lemma find_empty_false : forall e : E.T, find e empty = false.
66
Lemma find_add_true : forall (s : T) (e : E.T), find e (add e s) = true.
69
unfold find, add in |- *.
70
elim (Reflexivity_provable _ _ (E.eq_dec e e)).
77
Lemma find_add_false :
78
forall (s : T) (e e' : E.T), e <> e' -> find e (add e' s) = find e s.
80
unfold add, find in |- *.
81
cut (exists x : _, E.eq_dec e' e = right _ x).
89
apply Disequality_provable.
96
Module F : SET := FuncDict.
101
Lemma eq_dec : forall a a' : T, {a = a'} + {a <> a'}.
107
Module SetNat := F Nat.
110
Lemma no_zero_in_empty : SetNat.find 0 SetNat.empty = false.
111
apply SetNat.find_empty_false.
114
(***************************************************************************)
115
Module Lemmas (G: SET) (E: ELEM).
120
forall (S : ESet.T) (a1 a2 : E.T),
121
let S1 := ESet.add a1 (ESet.add a2 S) in
122
let S2 := ESet.add a2 (ESet.add a1 S) in
123
forall a : E.T, ESet.find a S1 = ESet.find a S2.
126
unfold S1, S2 in |- *.
127
elim (E.eq_dec a a1); elim (E.eq_dec a a2); intros H1 H2;
128
try rewrite <- H1; try rewrite <- H2;
130
(try ( rewrite ESet.find_add_true; auto);
131
try ( rewrite ESet.find_add_false; auto); auto).
136
Inductive list (A : Set) : Set :=
138
| cons : A -> list A -> list A.
140
Module ListDict (E: ELEM).
141
Definition T := list E.T.
142
Definition elt := E.T.
144
Definition empty := nil elt.
145
Definition add (e : elt) (s : T) := cons elt e s.
146
Fixpoint find (e : elt) (s : T) {struct s} : bool :=
149
| cons e' s' => ifte (E.eq_dec e e') true (find e s')
152
Definition find_empty_false (e : elt) := refl_equal false.
154
Lemma find_add_true : forall (s : T) (e : E.T), find e (add e s) = true.
157
elim (Reflexivity_provable _ _ (E.eq_dec e e)).
165
Lemma find_add_false :
166
forall (s : T) (e e' : E.T), e <> e' -> find e (add e' s) = find e s.
169
elim (Disequality_provable _ _ _ H (E.eq_dec e e')).
180
Module L : SET := ListDict.