aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/FSets/FSetBridge.v
diff options
context:
space:
mode:
authorGravatar filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7>2003-06-13 12:12:08 +0000
committerGravatar filliatr <filliatr@85f007b7-540e-0410-9357-904b9bb8a0f7>2003-06-13 12:12:08 +0000
commitf314c2a91775739f581ab8bacbeb58f57e2d4871 (patch)
tree8aaf92ed9e400d27cb4d37abca015eb4cf062e4a /theories/FSets/FSetBridge.v
parentfb7e6748d9b02fff8da1335dc3f4dedeb23a8f5d (diff)
FSets, mais pas compile' par make world
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@4150 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/FSets/FSetBridge.v')
-rw-r--r--theories/FSets/FSetBridge.v720
1 files changed, 720 insertions, 0 deletions
diff --git a/theories/FSets/FSetBridge.v b/theories/FSets/FSetBridge.v
new file mode 100644
index 000000000..257aa9e8b
--- /dev/null
+++ b/theories/FSets/FSetBridge.v
@@ -0,0 +1,720 @@
+(***********************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * INRIA-Rocquencourt & LRI-CNRS-Orsay *)
+(* \VV/ *************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+(** This module implements bridges (as functors) from dependent
+ to/from non-dependent set signature. *)
+
+Require Export FSetInterface.
+Set Implicit Arguments.
+
+(** * From non-dependent signature [S] to dependent signature [Sdep]. *)
+
+Module DepOfNodep [M:S] <: Sdep with Module E := M.E.
+ Import M.
+
+ Module ME := MoreOrderedType E.
+
+ Definition empty: { s:t | Empty s }.
+ Proof.
+ Exists empty; Auto.
+ Save.
+
+ Definition is_empty: (s:t){ Empty s }+{ ~(Empty s) }.
+ Proof.
+ Intros; Generalize (!is_empty_1 s) (!is_empty_2 s).
+ Case (is_empty s); Intuition.
+ Save.
+
+
+ Definition mem : (x:elt) (s:t) { (In x s) } + { ~(In x s) }.
+ Proof.
+ Intros; Generalize (!mem_1 s x) (!mem_2 s x).
+ Case (mem x s); Intuition.
+ Save.
+
+ Definition add : (x:elt) (s:t){ s':t | (Add x s s') }.
+ Proof.
+ Intros; Exists (add x s); Auto.
+ Unfold Add; Intuition.
+ Elim (ME.eq_dec x y); Auto.
+ Intros; Right.
+ EApply add_3; EAuto.
+ Apply In_1 with x; Auto.
+ Save.
+
+ Definition singleton : (x:elt){ s:t | (y:elt)(In y s) <-> (E.eq x y)}.
+ Proof.
+ Intros; Exists (singleton x); Intuition.
+ Save.
+
+ Definition remove : (x:elt)(s:t)
+ { s':t | (y:elt)(In y s') <-> (~(E.eq y x) /\ (In y s))}.
+ Proof.
+ Intros; Exists (remove x s); Intuition.
+ Absurd (In x (remove x s)); Auto.
+ Apply In_1 with y; Auto.
+ Elim (ME.eq_dec x y); Intros; Auto.
+ Absurd (In x (remove x s)); Auto.
+ Apply In_1 with y; Auto.
+ EAuto.
+ Save.
+
+ Definition union : (s,s':t)
+ { s'':t | (x:elt)(In x s'') <-> ((In x s)\/(In x s'))}.
+ Proof.
+ Intros; Exists (union s s'); Intuition.
+ Save.
+
+ Definition inter : (s,s':t)
+ { s'':t | (x:elt)(In x s'') <-> ((In x s)/\(In x s'))}.
+ Proof.
+ Intros; Exists (inter s s'); Intuition; EAuto.
+ Save.
+
+ Definition diff : (s,s':t)
+ { s'':t | (x:elt)(In x s'') <-> ((In x s)/\~(In x s'))}.
+ Proof.
+ Intros; Exists (diff s s'); Intuition; EAuto.
+ Absurd (In x s'); EAuto.
+ Save.
+
+ Definition equal : (s,s':t){ Equal s s' } + { ~(Equal s s') }.
+ Proof.
+ Intros.
+ Generalize (!equal_1 s s') (!equal_2 s s').
+ Case (equal s s');Intuition.
+ Save.
+
+ Definition subset : (s,s':t) { Subset s s' } + { ~(Subset s s') }.
+ Proof.
+ Intros.
+ Generalize (!subset_1 s s') (!subset_2 s s').
+ Case (subset s s');Intuition.
+ Save.
+
+ Definition fold :
+ (A:Set)
+ (f:elt->A->A)
+ { fold:t -> A -> A | (s,s':t)(a:A)
+ (eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
+ ((Empty s) -> (eqA (fold s a) a)) /\
+ ((compat_op E.eq eqA f)->(transpose eqA f) ->
+ (x:elt) (Add x s s') -> ~(In x s) -> (eqA (fold s' a) (f x (fold s a)))) }.
+ Proof.
+ Intros; Exists (!fold A f); Intros.
+ Split; Intros.
+ Apply fold_1; Auto.
+ Apply (!fold_2 s s' x A eqA); Auto.
+ Save.
+
+ Definition cardinal :
+ {cardinal : t -> nat | (s,s':t)
+ ((Empty s) -> (cardinal s)=O) /\
+ ((x:elt) (Add x s s') -> ~(In x s) ->
+ (cardinal s')=(S (cardinal s))) }.
+ Proof.
+ Intros; Exists cardinal; EAuto.
+ Save.
+
+ Definition fdec :=
+ [P:elt->Prop; Pdec:(x:elt){P x}+{~(P x)}; x:elt]
+ if (Pdec x) then [_]true else [_]false.
+
+ Lemma compat_P_aux :
+ (P:elt->Prop)(Pdec:(x:elt){P x}+{~(P x)})(compat_P E.eq P) ->
+ (compat_bool E.eq (fdec Pdec)).
+ Proof.
+ Unfold compat_P compat_bool fdec; Intros.
+ Generalize (E.eq_sym H0); Case (Pdec x); Case (Pdec y); Ground.
+ Qed.
+
+ Hints Resolve compat_P_aux.
+
+ Definition filter : (P:elt->Prop)(Pdec:(x:elt){P x}+{~(P x)})(s:t)
+ { s':t | (compat_P E.eq P) -> (x:elt)(In x s') <-> ((In x s)/\(P x)) }.
+ Proof.
+ Intros.
+ Exists (filter (fdec Pdec) s).
+ Intro H; Assert (compat_bool E.eq (fdec Pdec)); Auto.
+ Intuition.
+ EAuto.
+ Generalize (filter_2 H0 H1).
+ Unfold fdec.
+ Case (Pdec x); Intuition.
+ Inversion H2.
+ Apply filter_3; Auto.
+ Unfold fdec; Simpl.
+ Case (Pdec x); Intuition.
+ Save.
+
+ Definition for_all : (P:elt->Prop)(Pdec:(x:elt){P x}+{~(P x)})(s:t)
+ { (compat_P E.eq P) -> (For_all P s) } +
+ { (compat_P E.eq P) -> ~(For_all P s) }.
+ Proof.
+ Intros.
+ Generalize (!for_all_1 s (fdec Pdec)) (!for_all_2 s (fdec Pdec)).
+ Case (for_all (fdec Pdec) s); Unfold For_all; [Left|Right]; Intros.
+ Assert (compat_bool E.eq (fdec Pdec)); Auto.
+ Generalize (H0 H3 (refl_equal ??) ? H2).
+ Unfold fdec.
+ Case (Pdec x); Intuition.
+ Inversion H4.
+ Intuition.
+ Absurd false=true; [Auto with bool|Apply H; Auto].
+ Intro.
+ Unfold fdec.
+ Case (Pdec x); Intuition.
+ Save.
+
+ Definition exists : (P:elt->Prop)(Pdec:(x:elt){P x}+{~(P x)})(s:t)
+ { (compat_P E.eq P) -> (Exists P s) } +
+ { (compat_P E.eq P) -> ~(Exists P s) }.
+ Proof.
+ Intros.
+ Generalize (!exists_1 s (fdec Pdec)) (!exists_2 s (fdec Pdec)).
+ Case (exists (fdec Pdec) s); Unfold Exists; [Left|Right]; Intros.
+ Elim H0; Auto; Intros.
+ Exists x; Intuition.
+ Generalize H4.
+ Unfold fdec.
+ Case (Pdec x); Intuition.
+ Inversion H2.
+ Intuition.
+ Elim H2; Intros.
+ Absurd false=true; [Auto with bool|Apply H; Auto].
+ Exists x; Intuition.
+ Unfold fdec.
+ Case (Pdec x); Intuition.
+ Save.
+
+ Definition partition : (P:elt->Prop)(Pdec:(x:elt){P x}+{~(P x)})(s:t)
+ { partition : t*t |
+ let (s1,s2) = partition in
+ (compat_P E.eq P) ->
+ ((For_all P s1) /\
+ (For_all ([x]~(P x)) s2) /\
+ (x:elt)(In x s)<->((In x s1)\/(In x s2))) }.
+ Proof.
+ Intros.
+ Exists (partition (fdec Pdec) s).
+ Generalize (!partition_1 s (fdec Pdec)) (!partition_2 s (fdec Pdec)).
+ Case (partition (fdec Pdec) s).
+ Intros s1 s2; Simpl.
+ Intros; Assert (compat_bool E.eq (fdec Pdec)); Auto.
+ Intros; Assert (compat_bool E.eq [x](negb (fdec Pdec x))).
+ Generalize H2; Unfold compat_bool;Intuition; Apply (f_equal ?? negb); Auto.
+ Intuition.
+ Generalize H4; Unfold For_all Equal; Intuition.
+ Elim (H0 x); Intros.
+ Assert (fdec Pdec x)=true.
+ EAuto.
+ Generalize H8; Unfold fdec; Case (Pdec x); Intuition.
+ Inversion H9.
+ Generalize H; Unfold For_all Equal; Intuition.
+ Elim (H0 x); Intros.
+ Cut ([x](negb (fdec Pdec x)) x)=true.
+ Unfold fdec; Case (Pdec x); Intuition.
+ Change ([x](negb (fdec Pdec x)) x)=true.
+ Apply (!filter_2 s x); Auto.
+ LetTac b := (fdec Pdec x); Generalize (refl_equal ? b);
+ Pattern -1 b; Case b; Unfold b; [Left|Right].
+ Elim (H4 x); Intros _ B; Apply B; Auto.
+ Elim (H x); Intros _ B; Apply B; Auto.
+ Apply filter_3; Auto.
+ Rewrite H5; Auto.
+ EApply (filter_1 1!s 2!x H2); Elim (H4 x); Intros B _; Apply B; Auto.
+ EApply (filter_1 1!s 2!x H3); Elim (H x); Intros B _; Apply B; Auto.
+ Save.
+
+ Definition choose : (s:t) {x:elt | (In x s)} + { Empty s }.
+ Proof.
+ Intros.
+ Generalize (!choose_1 s) (!choose_2 s).
+ Case (choose s); [Left|Right]; Auto.
+ Exists e; Auto.
+ Save.
+
+ Definition elements :
+ (s:t){ l:(list elt) | (sort E.lt l)/\(x:elt)(In x s)<->(InList E.eq x l)}.
+ Proof.
+ Intros; Exists (elements s); Intuition.
+ Save.
+
+ Definition min_elt :
+ (s:t){ x:elt | (In x s) /\ (For_all [y]~(E.lt y x) s) } + { Empty s }.
+ Proof.
+ Intros; Generalize (!min_elt_1 s) (!min_elt_2 s) (!min_elt_3 s).
+ Case (min_elt s); [Left|Right]; Auto.
+ Exists e; Unfold For_all; EAuto.
+ Save.
+
+ Definition max_elt :
+ (s:t){ x:elt | (In x s) /\ (For_all [y]~(E.lt x y) s) } + { Empty s }.
+ Proof.
+ Intros; Generalize (!max_elt_1 s) (!max_elt_2 s) (!max_elt_3 s).
+ Case (max_elt s); [Left|Right]; Auto.
+ Exists e; Unfold For_all; EAuto.
+ Save.
+
+ Module E:=E.
+
+ Definition elt := elt.
+ Definition t := t.
+
+ Definition In := In.
+ Definition Equal := [s,s'](a:elt)(In a s)<->(In a s').
+ Definition Subset := [s,s'](a:elt)(In a s)->(In a s').
+ Definition Add := [x:elt;s,s':t](y:elt)(In y s') <-> ((E.eq y x)\/(In y s)).
+ Definition Empty := [s](a:elt)~(In a s).
+ Definition For_all := [P:elt->Prop; s:t](x:elt)(In x s)->(P x).
+ Definition Exists := [P:elt->Prop; s:t](EX x:elt | (In x s)/\(P x)).
+
+ Definition eq_In := In_1.
+
+ Definition eq := eq.
+ Definition lt := lt.
+ Definition eq_refl := eq_refl.
+ Definition eq_sym := eq_sym.
+ Definition eq_trans := eq_trans.
+ Definition lt_trans := lt_trans.
+ Definition lt_not_eq := lt_not_eq.
+ Definition compare := compare.
+
+End DepOfNodep.
+
+
+(** * From dependent signature [Sdep] to non-dependent signature [S]. *)
+
+Module NodepOfDep [M:Sdep] <: S with Module E := M.E.
+ Import M.
+
+ Module ME := MoreOrderedType E.
+
+ Definition empty : t := let (s,_) = M.empty in s.
+
+ Lemma empty_1 : (Empty empty).
+ Proof.
+ Unfold empty; Case M.empty; Auto.
+ Save.
+
+ Definition is_empty : t -> bool :=
+ [s:t]if (M.is_empty s) then [_]true else [_]false.
+
+ Lemma is_empty_1 : (s:t)(Empty s) -> (is_empty s)=true.
+ Proof.
+ Intros; Unfold is_empty; Case (M.is_empty s); Auto.
+ Save.
+
+ Lemma is_empty_2 : (s:t)(is_empty s)=true -> (Empty s).
+ Proof.
+ Intro s; Unfold is_empty; Case (M.is_empty s); Auto.
+ Intros; Discriminate H.
+ Save.
+
+ Definition mem : elt -> t -> bool :=
+ [x:elt][s:t]if (M.mem x s) then [_]true else [_]false.
+
+ Lemma mem_1 : (s:t)(x:elt)(In x s) -> (mem x s)=true.
+ Proof.
+ Intros; Unfold mem; Case (M.mem x s); Auto.
+ Save.
+
+ Lemma mem_2 : (s:t)(x:elt)(mem x s)=true -> (In x s).
+ Proof.
+ Intros s x; Unfold mem; Case (M.mem x s); Auto.
+ Intros; Discriminate H.
+ Save.
+
+ Definition equal : t -> t -> bool :=
+ [s,s']if (M.equal s s') then [_]true else [_]false.
+
+ Lemma equal_1 : (s,s':t)(Equal s s') -> (equal s s')=true.
+ Proof.
+ Intros; Unfold equal; Case M.equal; Intuition.
+ Save.
+
+ Lemma equal_2 : (s,s':t)(equal s s')=true -> (Equal s s').
+ Proof.
+ Intros s s'; Unfold equal; Case (M.equal s s'); Intuition; Inversion H.
+ Save.
+
+ Definition subset : t -> t -> bool :=
+ [s,s']if (M.subset s s') then [_]true else [_]false.
+
+ Lemma subset_1 : (s,s':t)(Subset s s') -> (subset s s')=true.
+ Proof.
+ Intros; Unfold subset; Case M.subset; Intuition.
+ Save.
+
+ Lemma subset_2 : (s,s':t)(subset s s')=true -> (Subset s s').
+ Proof.
+ Intros s s'; Unfold subset; Case (M.subset s s'); Intuition; Inversion H.
+ Save.
+
+ Definition choose : t -> (option elt) :=
+ [s:t]Cases (M.choose s) of (inleft (exist x _)) => (Some ? x)
+ | (inright _) => (None ?) end.
+
+ Lemma choose_1 : (s:t)(x:elt) (choose s)=(Some ? x) -> (In x s).
+ Proof.
+ Intros s x; Unfold choose; Case (M.choose s).
+ Destruct s0; Intros; Injection H; Intros; Subst; Auto.
+ Intros; Discriminate H.
+ Save.
+
+ Lemma choose_2 : (s:t)(choose s)=(None ?) -> (Empty s).
+ Proof.
+ Intro s; Unfold choose; Case (M.choose s); Auto.
+ Destruct s0; Intros; Discriminate H.
+ Save.
+
+ Definition elements : t -> (list elt) := [s] let (l,_) = (M.elements s) in l.
+
+ Lemma elements_1: (s:t)(x:elt)(In x s) -> (InList E.eq x (elements s)).
+ Proof.
+ Intros; Unfold elements; Case (M.elements s); Ground.
+ Save.
+
+ Lemma elements_2: (s:t)(x:elt)(InList E.eq x (elements s)) -> (In x s).
+ Proof.
+ Intros s x; Unfold elements; Case (M.elements s); Ground.
+ Save.
+
+ Lemma elements_3: (s:t)(sort E.lt (elements s)).
+ Proof.
+ Intros; Unfold elements; Case (M.elements s); Ground.
+ Save.
+
+ Definition min_elt : t -> (option elt) :=
+ [s:t]Cases (M.min_elt s) of (inleft (exist x _)) => (Some ? x)
+ | (inright _) => (None ?) end.
+
+ Lemma min_elt_1: (s:t)(x:elt)(min_elt s) = (Some ? x) -> (In x s).
+ Proof.
+ Intros s x; Unfold min_elt; Case (M.min_elt s).
+ Destruct s0; Intros; Injection H; Intros; Subst; Intuition.
+ Intros; Discriminate H.
+ Save.
+
+ Lemma min_elt_2: (s:t)(x,y:elt)(min_elt s) = (Some ? x) -> (In y s) -> ~(E.lt y x).
+ Proof.
+ Intros s x y; Unfold min_elt; Case (M.min_elt s).
+ Unfold For_all; Destruct s0; Intros; Injection H; Intros; Subst; Ground.
+ Intros; Discriminate H.
+ Save.
+
+ Lemma min_elt_3 : (s:t)(min_elt s) = (None ?) -> (Empty s).
+ Proof.
+ Intros s; Unfold min_elt; Case (M.min_elt s); Auto.
+ Destruct s0; Intros; Discriminate H.
+ Save.
+
+ Definition max_elt : t -> (option elt) :=
+ [s:t]Cases (M.max_elt s) of (inleft (exist x _)) => (Some ? x)
+ | (inright _) => (None ?) end.
+
+ Lemma max_elt_1: (s:t)(x:elt)(max_elt s) = (Some ? x) -> (In x s).
+ Proof.
+ Intros s x; Unfold max_elt; Case (M.max_elt s).
+ Destruct s0; Intros; Injection H; Intros; Subst; Intuition.
+ Intros; Discriminate H.
+ Save.
+
+ Lemma max_elt_2: (s:t)(x,y:elt)(max_elt s) = (Some ? x) -> (In y s) -> ~(E.lt x y).
+ Proof.
+ Intros s x y; Unfold max_elt; Case (M.max_elt s).
+ Unfold For_all; Destruct s0; Intros; Injection H; Intros; Subst; Ground.
+ Intros; Discriminate H.
+ Save.
+
+ Lemma max_elt_3 : (s:t)(max_elt s) = (None ?) -> (Empty s).
+ Proof.
+ Intros s; Unfold max_elt; Case (M.max_elt s); Auto.
+ Destruct s0; Intros; Discriminate H.
+ Save.
+
+ Definition add : elt -> t -> t :=
+ [x:elt][s:t]let (s',_) = (M.add x s) in s'.
+
+ Lemma add_1 : (s:t)(x:elt)(In x (add x s)).
+ Proof.
+ Intros; Unfold add; Case (M.add x s); Unfold Add; Ground.
+ Save.
+
+ Lemma add_2 : (s:t)(x,y:elt)(In y s) -> (In y (add x s)).
+ Proof.
+ Intros; Unfold add; Case (M.add x s); Unfold Add; Ground.
+ Save.
+
+ Lemma add_3 : (s:t)(x,y:elt)~(E.eq x y) -> (In y (add x s)) -> (In y s).
+ Proof.
+ Intros s x y; Unfold add; Case (M.add x s); Unfold Add; Ground.
+ Generalize (a y); Intuition; Absurd (E.eq x y); Auto.
+ Save.
+
+ Definition remove : elt -> t -> t :=
+ [x:elt][s:t]let (s',_) = (M.remove x s) in s'.
+
+ Lemma remove_1 : (s:t)(x:elt)~(In x (remove x s)).
+ Proof.
+ Intros; Unfold remove; Case (M.remove x s); Ground.
+ Save.
+
+ Lemma remove_2 : (s:t)(x,y:elt)
+ ~(E.eq x y) ->(In y s) -> (In y (remove x s)).
+ Proof.
+ Intros; Unfold remove; Case (M.remove x s); Ground.
+ Save.
+
+ Lemma remove_3 : (s:t)(x,y:elt)(In y (remove x s)) -> (In y s).
+ Proof.
+ Intros s x y; Unfold remove; Case (M.remove x s); Ground.
+ Save.
+
+ Definition singleton : elt -> t := [x]let (s,_) = (M.singleton x) in s.
+
+ Lemma singleton_1 : (x,y:elt)(In y (singleton x)) -> (E.eq x y).
+ Proof.
+ Intros x y; Unfold singleton; Case (M.singleton x); Ground.
+ Save.
+
+ Lemma singleton_2: (x,y:elt)(E.eq x y) -> (In y (singleton x)).
+ Proof.
+ Intros x y; Unfold singleton; Case (M.singleton x); Ground.
+ Save.
+
+ Definition union : t -> t -> t :=
+ [s,s']let (s'',_) = (M.union s s') in s''.
+
+ Lemma union_1: (s,s':t)(x:elt)(In x (union s s')) -> (In x s)\/(In x s').
+ Proof.
+ Intros s s' x; Unfold union; Case (M.union s s'); Ground.
+ Save.
+
+ Lemma union_2: (s,s':t)(x:elt)(In x s) -> (In x (union s s')).
+ Proof.
+ Intros s s' x; Unfold union; Case (M.union s s'); Ground.
+ Save.
+
+ Lemma union_3: (s,s':t)(x:elt)(In x s') -> (In x (union s s')).
+ Proof.
+ Intros s s' x; Unfold union; Case (M.union s s'); Ground.
+ Save.
+
+ Definition inter : t -> t -> t :=
+ [s,s']let (s'',_) = (M.inter s s') in s''.
+
+ Lemma inter_1: (s,s':t)(x:elt)(In x (inter s s')) -> (In x s).
+ Proof.
+ Intros s s' x; Unfold inter; Case (M.inter s s'); Ground.
+ Save.
+
+ Lemma inter_2: (s,s':t)(x:elt)(In x (inter s s')) -> (In x s').
+ Proof.
+ Intros s s' x; Unfold inter; Case (M.inter s s'); Ground.
+ Save.
+
+ Lemma inter_3: (s,s':t)(x:elt)(In x s) -> (In x s') -> (In x (inter s s')).
+ Proof.
+ Intros s s' x; Unfold inter; Case (M.inter s s'); Ground.
+ Save.
+
+ Definition diff : t -> t -> t :=
+ [s,s']let (s'',_) = (M.diff s s') in s''.
+
+ Lemma diff_1: (s,s':t)(x:elt)(In x (diff s s')) -> (In x s).
+ Proof.
+ Intros s s' x; Unfold diff; Case (M.diff s s'); Ground.
+ Save.
+
+ Lemma diff_2: (s,s':t)(x:elt)(In x (diff s s')) -> ~(In x s').
+ Proof.
+ Intros s s' x; Unfold diff; Case (M.diff s s'); Ground.
+ Save.
+
+ Lemma diff_3: (s,s':t)(x:elt)(In x s) -> ~(In x s') -> (In x (diff s s')).
+ Proof.
+ Intros s s' x; Unfold diff; Case (M.diff s s'); Ground.
+ Save.
+
+ Definition cardinal : t -> nat := let (f,_)= M.cardinal in f.
+
+ Lemma cardinal_1 : (s:t)(Empty s) -> (cardinal s)=O.
+ Proof.
+ Intros; Unfold cardinal; Case M.cardinal; Ground.
+ Qed.
+
+ Lemma cardinal_2 :
+ (s,s':t)(x:elt)~(In x s) -> (Add x s s') ->
+ (cardinal s')=(S (cardinal s)).
+ Proof.
+ Intros; Unfold cardinal; Case M.cardinal; Ground.
+ Qed.
+
+ Definition fold : (B:Set)(elt->B->B)->t->B->B :=
+ [B,f]let (fold,_)= (M.fold f) in fold.
+
+ Lemma fold_1:
+ (s:t)(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))(i:A)(f:elt->A->A)
+ (Empty s) -> (eqA (fold f s i) i).
+ Proof.
+ Intros; Unfold fold; Case (M.fold f); Ground.
+ Save.
+
+ Lemma fold_2:
+ (s,s':t)(x:elt)(A:Set)(eqA:A->A->Prop)(st:(Setoid_Theory A eqA))
+ (i:A)(f:elt->A->A)(compat_op E.eq eqA f) -> (transpose eqA f) ->
+ ~(In x s) -> (Add x s s') -> (eqA (fold f s' i) (f x (fold f s i))).
+ Proof.
+ Intros; Unfold fold; Case (M.fold f); Ground.
+ Save.
+
+ Definition f_dec :
+ (f: elt -> bool)(x:elt){ (f x)=true } + { (f x)<>true }.
+ Proof.
+ Intros; Case (f x); Auto with bool.
+ Defined.
+
+ Lemma compat_P_aux :
+ (f:elt -> bool)(compat_bool E.eq f) -> (compat_P E.eq [x](f x)=true).
+ Proof.
+ Unfold compat_bool compat_P; Intros; Rewrite <- H1; Ground.
+ Qed.
+
+ Hints Resolve compat_P_aux.
+
+ Definition filter : (elt -> bool) -> t -> t :=
+ [f,s]let (s',_) = (!M.filter [x](f x)=true (f_dec f) s) in s'.
+
+ Lemma filter_1: (s:t)(x:elt)(f:elt->bool)(compat_bool E.eq f) ->
+ (In x (filter f s)) -> (In x s).
+ Proof.
+ Intros s x f; Unfold filter; Case M.filter; Intuition.
+ Generalize (i (compat_P_aux H)); Ground.
+ Save.
+
+ Lemma filter_2:
+ (s:t)(x:elt)(f:elt->bool)(compat_bool E.eq f) ->(In x (filter f s)) -> (f x)=true.
+ Proof.
+ Intros s x f; Unfold filter; Case M.filter; Intuition.
+ Generalize (i (compat_P_aux H)); Ground.
+ Save.
+
+ Lemma filter_3:
+ (s:t)(x:elt)(f:elt->bool)(compat_bool E.eq f) ->
+ (In x s) -> (f x)=true -> (In x (filter f s)).
+ Proof.
+ Intros s x f; Unfold filter; Case M.filter; Intuition.
+ Generalize (i (compat_P_aux H)); Ground.
+ Save.
+
+ Definition for_all: (elt -> bool) -> t -> bool :=
+ [f,s]if (!M.for_all [x](f x)=true (f_dec f) s) then [_]true else [_]false.
+
+ Lemma for_all_1:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) ->
+ (For_all [x](f x)=true s) -> (for_all f s)=true.
+ Proof.
+ Intros s f; Unfold for_all; Case M.for_all; Intuition; Elim n; Auto.
+ Qed.
+
+ Lemma for_all_2:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) ->(for_all f s)=true -> (For_all [x](f x)=true s).
+ Proof.
+ Intros s f; Unfold for_all; Case M.for_all; Intuition; Inversion H0.
+ Qed.
+
+ Definition exists: (elt -> bool) -> t -> bool :=
+ [f,s]if (!M.exists [x](f x)=true (f_dec f) s) then [_]true else [_]false.
+
+ Lemma exists_1:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) ->
+ (Exists [x](f x)=true s) -> (exists f s)=true.
+ Proof.
+ Intros s f; Unfold exists; Case M.exists; Intuition; Elim n; Auto.
+ Qed.
+
+ Lemma exists_2:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) ->
+ (exists f s)=true -> (Exists [x](f x)=true s).
+ Proof.
+ Intros s f; Unfold exists; Case M.exists; Intuition; Inversion H0.
+ Qed.
+
+ Definition partition : (elt -> bool) -> t -> t*t :=
+ [f,s]let (p,_) = (!M.partition [x](f x)=true (f_dec f) s) in p.
+
+ Lemma partition_1:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) -> (Equal (fst ? ? (partition f s)) (filter f s)).
+ Proof.
+ Intros s f; Unfold partition; Case M.partition.
+ Intro p; Case p; Clear p; Intros s1 s2 H C.
+ Generalize (H (compat_P_aux C)); Clear H; Intro H.
+ Simpl; Unfold Equal; Intuition.
+ Apply filter_3; Ground.
+ Apply (H0 a); Auto.
+ Elim (H2 a); Intros.
+ Assert (In a s).
+ EApply filter_1; EAuto.
+ Elim H3; Intros; Auto.
+ Absurd (f a)=true.
+ Exact (H a H6).
+ EApply filter_2; EAuto.
+ Qed.
+
+ Lemma partition_2:
+ (s:t)(f:elt->bool)(compat_bool E.eq f) ->
+ (Equal (snd ? ? (partition f s)) (filter [x](negb (f x)) s)).
+ Proof.
+ Intros s f; Unfold partition; Case M.partition.
+ Intro p; Case p; Clear p; Intros s1 s2 H C.
+ Generalize (H (compat_P_aux C)); Clear H; Intro H.
+ Assert D: (compat_bool E.eq [x](negb (f x))).
+ Generalize C; Unfold compat_bool; Intros; Apply (f_equal ?? negb); Auto.
+ Simpl; Unfold Equal; Intuition.
+ Apply filter_3; Ground.
+ Generalize (H a H1); Case (f a); Intuition.
+ Elim (H2 a); Intros.
+ Assert (In a s).
+ EApply filter_1; EAuto.
+ Elim H3; Intros; Auto.
+ Absurd (f a)=true.
+ Intro.
+ Generalize (filter_2 D H1).
+ Rewrite H7; Intros H8; Inversion H8.
+ Exact (H0 a H6).
+ Qed.
+
+
+ Module E:=E.
+ Definition elt := elt.
+ Definition t := t.
+
+ Definition In := In.
+ Definition Equal := [s,s'](a:elt)(In a s)<->(In a s').
+ Definition Subset := [s,s'](a:elt)(In a s)->(In a s').
+ Definition Add := [x:elt;s,s':t](y:elt)(In y s') <-> ((E.eq y x)\/(In y s)).
+ Definition Empty := [s](a:elt)~(In a s).
+ Definition For_all := [P:elt->Prop; s:t](x:elt)(In x s)->(P x).
+ Definition Exists := [P:elt->Prop; s:t](EX x:elt | (In x s)/\(P x)).
+
+ Definition In_1 := eq_In.
+
+ Definition eq := eq.
+ Definition lt := lt.
+ Definition eq_refl := eq_refl.
+ Definition eq_sym := eq_sym.
+ Definition eq_trans := eq_trans.
+ Definition lt_trans := lt_trans.
+ Definition lt_not_eq := lt_not_eq.
+ Definition compare := compare.
+
+End NodepOfDep.
+