diff options
author | letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2006-03-15 10:42:08 +0000 |
---|---|---|
committer | letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2006-03-15 10:42:08 +0000 |
commit | e2152605c47212265f896f0625effc5beaef8842 (patch) | |
tree | 7a2315d766cb752dde33b27c63ced78e6d9d2892 /theories/FSets/FSetProperties.v | |
parent | 150d190dfc60e462dfacafcfed3cabb58ff95365 (diff) |
reparation des $
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@8629 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/FSets/FSetProperties.v')
-rw-r--r-- | theories/FSets/FSetProperties.v | 396 |
1 files changed, 198 insertions, 198 deletions
diff --git a/theories/FSets/FSetProperties.v b/theories/FSets/FSetProperties.v index b67c1245e..afdc20250 100644 --- a/theories/FSets/FSetProperties.v +++ b/theories/FSets/FSetProperties.v @@ -6,7 +6,7 @@ (* * GNU Lesser General Public License Version 2.1 *) (***********************************************************************) -(* $Id: FSetProperties.v,v 1.16 2006/03/13 04:59:24 letouzey Exp $ *) +(* $Id$ *) (** * Finite sets library *) @@ -22,47 +22,47 @@ Set Implicit Arguments. Unset Strict Implicit. Section Misc. -Variable A B : Set. -Variable eqA : A -> A -> Prop. -Variable eqB : B -> B -> Prop. +Variable A B Set. +Variable eqA A -> A -> Prop. +Variable eqB B -> B -> Prop. (** Two-argument functions that allow to reorder its arguments. *) -Definition transpose (f : A -> B -> B) := - forall (x y : A) (z : B), eqB (f x (f y z)) (f y (f x z)). +Definition transpose (f A -> B -> B) := + forall (x y A) (z : B), eqB (f x (f y z)) (f y (f x z)). (** Compatibility of a two-argument function with respect to two equalities. *) -Definition compat_op (f : A -> B -> B) := - forall (x x' : A) (y y' : B), eqA x x' -> eqB y y' -> eqB (f x y) (f x' y'). +Definition compat_op (f A -> B -> B) := + forall (x x' A) (y y' : B), eqA x x' -> eqB y y' -> eqB (f x y) (f x' y'). (** Compatibility of a function upon natural numbers. *) -Definition compat_nat (f : A -> nat) := - forall x x' : A, eqA x x' -> f x = f x'. +Definition compat_nat (f A -> nat) := + forall x x' A, eqA x x' -> f x = f x'. End Misc. Hint Unfold transpose compat_op compat_nat. Hint Extern 1 (Setoid_Theory _ _) => constructor; congruence. -Ltac trans_st x := match goal with - | H : Setoid_Theory _ ?eqA |- ?eqA _ _ => +Ltac trans_st x = match goal with + | H Setoid_Theory _ ?eqA |- ?eqA _ _ => apply (Seq_trans _ _ H) with x; auto end. -Ltac sym_st := match goal with - | H : Setoid_Theory _ ?eqA |- ?eqA _ _ => +Ltac sym_st = match goal with + | H Setoid_Theory _ ?eqA |- ?eqA _ _ => apply (Seq_sym _ _ H); auto end. -Ltac refl_st := match goal with - | H : Setoid_Theory _ ?eqA |- ?eqA _ _ => +Ltac refl_st = match goal with + | H Setoid_Theory _ ?eqA |- ?eqA _ _ => apply (Seq_refl _ _ H); auto end. -Definition gen_st : forall A : Set, Setoid_Theory _ (@eq A). +Definition gen_st forall A : Set, Setoid_Theory _ (@eq A). Proof. auto. Qed. -Module Properties (M: S). - Module ME := OrderedTypeFacts M.E. +Module Properties (M S). + Module ME = OrderedTypeFacts M.E. Import ME. Import M. Import Logic. (* to unmask [eq] *) @@ -70,106 +70,106 @@ Module Properties (M: S). (** Results about lists without duplicates *) - Module FM := Facts M. + Module FM = Facts M. Import FM. - Definition Add (x : elt) (s s' : t) := - forall y : elt, In y s' <-> E.eq x y \/ In y s. + Definition Add (x elt) (s s' : t) := + forall y elt, In y s' <-> E.eq x y \/ In y s. - Lemma In_dec : forall x s, {In x s} + {~ In x s}. + Lemma In_dec forall x s, {In x s} + {~ In x s}. Proof. intros; generalize (mem_iff s x); case (mem x s); intuition. Qed. Section BasicProperties. - Variable s s' s'' s1 s2 s3 : t. - Variable x : elt. + Variable s s' s'' s1 s2 s3 t. + Variable x elt. (** properties of [Equal] *) - Lemma equal_refl : s[=]s. + Lemma equal_refl s[=]s. Proof. apply eq_refl. Qed. - Lemma equal_sym : s[=]s' -> s'[=]s. + Lemma equal_sym s[=]s' -> s'[=]s. Proof. apply eq_sym. Qed. - Lemma equal_trans : s1[=]s2 -> s2[=]s3 -> s1[=]s3. + Lemma equal_trans s1[=]s2 -> s2[=]s3 -> s1[=]s3. Proof. intros; apply eq_trans with s2; auto. Qed. (** properties of [Subset] *) - Lemma subset_refl : s[<=]s. + Lemma subset_refl s[<=]s. Proof. unfold Subset; intuition. Qed. - Lemma subset_antisym : s[<=]s' -> s'[<=]s -> s[=]s'. + Lemma subset_antisym s[<=]s' -> s'[<=]s -> s[=]s'. Proof. unfold Subset, Equal; intuition. Qed. - Lemma subset_trans : s1[<=]s2 -> s2[<=]s3 -> s1[<=]s3. + Lemma subset_trans s1[<=]s2 -> s2[<=]s3 -> s1[<=]s3. Proof. unfold Subset; intuition. Qed. - Lemma subset_equal : s[=]s' -> s[<=]s'. + Lemma subset_equal s[=]s' -> s[<=]s'. Proof. unfold Subset, Equal; firstorder. Qed. - Lemma subset_empty : empty[<=]s. + Lemma subset_empty empty[<=]s. Proof. unfold Subset; intros a; set_iff; intuition. Qed. - Lemma subset_remove_3 : s1[<=]s2 -> remove x s1 [<=] s2. + Lemma subset_remove_3 s1[<=]s2 -> remove x s1 [<=] s2. Proof. unfold Subset; intros H a; set_iff; intuition. Qed. - Lemma subset_diff : s1[<=]s3 -> diff s1 s2 [<=] s3. + Lemma subset_diff s1[<=]s3 -> diff s1 s2 [<=] s3. Proof. unfold Subset; intros H a; set_iff; intuition. Qed. - Lemma subset_add_3 : In x s2 -> s1[<=]s2 -> add x s1 [<=] s2. + Lemma subset_add_3 In x s2 -> s1[<=]s2 -> add x s1 [<=] s2. Proof. unfold Subset; intros H H0 a; set_iff; intuition. rewrite <- H2; auto. Qed. - Lemma subset_add_2 : s1[<=]s2 -> s1[<=] add x s2. + Lemma subset_add_2 s1[<=]s2 -> s1[<=] add x s2. Proof. unfold Subset; intuition. Qed. - Lemma in_subset : In x s1 -> s1[<=]s2 -> In x s2. + Lemma in_subset In x s1 -> s1[<=]s2 -> In x s2. Proof. unfold Subset; intuition. Qed. (** properties of [empty] *) - Lemma empty_is_empty_1 : Empty s -> s[=]empty. + Lemma empty_is_empty_1 Empty s -> s[=]empty. Proof. unfold Empty, Equal; intros; generalize (H a); set_iff; tauto. Qed. - Lemma empty_is_empty_2 : s[=]empty -> Empty s. + Lemma empty_is_empty_2 s[=]empty -> Empty s. Proof. unfold Empty, Equal; intros; generalize (H a); set_iff; tauto. Qed. (** properties of [add] *) - Lemma add_equal : In x s -> add x s [=] s. + Lemma add_equal In x s -> add x s [=] s. Proof. unfold Equal; intros; set_iff; intuition. rewrite <- H1; auto. @@ -177,26 +177,26 @@ Module Properties (M: S). (** properties of [remove] *) - Lemma remove_equal : ~ In x s -> remove x s [=] s. + Lemma remove_equal ~ In x s -> remove x s [=] s. Proof. unfold Equal; intros; set_iff; intuition. rewrite H1 in H; auto. Qed. - Lemma Equal_remove : s[=]s' -> remove x s [=] remove x s'. + Lemma Equal_remove s[=]s' -> remove x s [=] remove x s'. Proof. intros; rewrite H; apply eq_refl. Qed. (** properties of [add] and [remove] *) - Lemma add_remove : In x s -> add x (remove x s) [=] s. + Lemma add_remove In x s -> add x (remove x s) [=] s. Proof. unfold Equal; intros; set_iff; elim (eq_dec x a); intuition. rewrite <- H1; auto. Qed. - Lemma remove_add : ~In x s -> remove x (add x s) [=] s. + Lemma remove_add ~In x s -> remove x (add x s) [=] s. Proof. unfold Equal; intros; set_iff; elim (eq_dec x a); intuition. rewrite H1 in H; auto. @@ -204,148 +204,148 @@ Module Properties (M: S). (** properties of [singleton] *) - Lemma singleton_equal_add : singleton x [=] add x empty. + Lemma singleton_equal_add singleton x [=] add x empty. Proof. unfold Equal; intros; set_iff; intuition. Qed. (** properties of [union] *) - Lemma union_sym : union s s' [=] union s' s. + Lemma union_sym union s s' [=] union s' s. Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma union_subset_equal : s[<=]s' -> union s s' [=] s'. + Lemma union_subset_equal s[<=]s' -> union s s' [=] s'. Proof. unfold Subset, Equal; intros; set_iff; intuition. Qed. - Lemma union_equal_1 : s[=]s' -> union s s'' [=] union s' s''. + Lemma union_equal_1 s[=]s' -> union s s'' [=] union s' s''. Proof. intros; rewrite H; apply eq_refl. Qed. - Lemma union_equal_2 : s'[=]s'' -> union s s' [=] union s s''. + Lemma union_equal_2 s'[=]s'' -> union s s' [=] union s s''. Proof. intros; rewrite H; apply eq_refl. Qed. - Lemma union_assoc : union (union s s') s'' [=] union s (union s' s''). + Lemma union_assoc union (union s s') s'' [=] union s (union s' s''). Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma add_union_singleton : add x s [=] union (singleton x) s. + Lemma add_union_singleton add x s [=] union (singleton x) s. Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma union_add : union (add x s) s' [=] add x (union s s'). + Lemma union_add union (add x s) s' [=] add x (union s s'). Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma union_subset_1 : s [<=] union s s'. + Lemma union_subset_1 s [<=] union s s'. Proof. unfold Subset; intuition. Qed. - Lemma union_subset_2 : s' [<=] union s s'. + Lemma union_subset_2 s' [<=] union s s'. Proof. unfold Subset; intuition. Qed. - Lemma union_subset_3 : s[<=]s'' -> s'[<=]s'' -> union s s' [<=] s''. + Lemma union_subset_3 s[<=]s'' -> s'[<=]s'' -> union s s' [<=] s''. Proof. unfold Subset; intros H H0 a; set_iff; intuition. Qed. - Lemma empty_union_1 : Empty s -> union s s' [=] s'. + Lemma empty_union_1 Empty s -> union s s' [=] s'. Proof. unfold Equal, Empty; intros; set_iff; firstorder. Qed. - Lemma empty_union_2 : Empty s -> union s' s [=] s'. + Lemma empty_union_2 Empty s -> union s' s [=] s'. Proof. unfold Equal, Empty; intros; set_iff; firstorder. Qed. - Lemma not_in_union : ~In x s -> ~In x s' -> ~In x (union s s'). + Lemma not_in_union ~In x s -> ~In x s' -> ~In x (union s s'). Proof. intros; set_iff; intuition. Qed. (** properties of [inter] *) - Lemma inter_sym : inter s s' [=] inter s' s. + Lemma inter_sym inter s s' [=] inter s' s. Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma inter_subset_equal : s[<=]s' -> inter s s' [=] s. + Lemma inter_subset_equal s[<=]s' -> inter s s' [=] s. Proof. unfold Equal; intros; set_iff; intuition. Qed. - Lemma inter_equal_1 : s[=]s' -> inter s s'' [=] inter s' s''. + Lemma inter_equal_1 s[=]s' -> inter s s'' [=] inter s' s''. Proof. intros; rewrite H; apply eq_refl. Qed. - Lemma inter_equal_2 : s'[=]s'' -> inter s s' [=] inter s s''. + Lemma inter_equal_2 s'[=]s'' -> inter s s' [=] inter s s''. Proof. intros; rewrite H; apply eq_refl. Qed. - Lemma inter_assoc : inter (inter s s') s'' [=] inter s (inter s' s''). + Lemma inter_assoc inter (inter s s') s'' [=] inter s (inter s' s''). Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma union_inter_1 : inter (union s s') s'' [=] union (inter s s'') (inter s' s''). + Lemma union_inter_1 inter (union s s') s'' [=] union (inter s s'') (inter s' s''). Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma union_inter_2 : union (inter s s') s'' [=] inter (union s s'') (union s' s''). + Lemma union_inter_2 union (inter s s') s'' [=] inter (union s s'') (union s' s''). Proof. unfold Equal; intros; set_iff; tauto. Qed. - Lemma inter_add_1 : In x s' -> inter (add x s) s' [=] add x (inter s s'). + Lemma inter_add_1 In x s' -> inter (add x s) s' [=] add x (inter s s'). Proof. unfold Equal; intros; set_iff; intuition. rewrite <- H1; auto. Qed. - Lemma inter_add_2 : ~ In x s' -> inter (add x s) s' [=] inter s s'. + Lemma inter_add_2 ~ In x s' -> inter (add x s) s' [=] inter s s'. Proof. unfold Equal; intros; set_iff; intuition. destruct H; rewrite H0; auto. Qed. - Lemma empty_inter_1 : Empty s -> Empty (inter s s'). + Lemma empty_inter_1 Empty s -> Empty (inter s s'). Proof. unfold Empty; intros; set_iff; firstorder. Qed. - Lemma empty_inter_2 : Empty s' -> Empty (inter s s'). + Lemma empty_inter_2 Empty s' -> Empty (inter s s'). Proof. unfold Empty; intros; set_iff; firstorder. Qed. - Lemma inter_subset_1 : inter s s' [<=] s. + Lemma inter_subset_1 inter s s' [<=] s. Proof. unfold Subset; intro a; set_iff; tauto. Qed. - Lemma inter_subset_2 : inter s s' [<=] s'. + Lemma inter_subset_2 inter s s' [<=] s'. Proof. unfold Subset; intro a; set_iff; tauto. Qed. - Lemma inter_subset_3 : + Lemma inter_subset_3 s''[<=]s -> s''[<=]s' -> s''[<=] inter s s'. Proof. unfold Subset; intros H H' a; set_iff; intuition. @@ -353,38 +353,38 @@ Module Properties (M: S). (** properties of [diff] *) - Lemma empty_diff_1 : Empty s -> Empty (diff s s'). + Lemma empty_diff_1 Empty s -> Empty (diff s s'). Proof. unfold Empty, Equal; intros; set_iff; firstorder. Qed. - Lemma empty_diff_2 : Empty s -> diff s' s [=] s'. + Lemma empty_diff_2 Empty s -> diff s' s [=] s'. Proof. unfold Empty, Equal; intros; set_iff; firstorder. Qed. - Lemma diff_subset : diff s s' [<=] s. + Lemma diff_subset diff s s' [<=] s. Proof. unfold Subset; intros a; set_iff; tauto. Qed. - Lemma diff_subset_equal : s[<=]s' -> diff s s' [=] empty. + Lemma diff_subset_equal s[<=]s' -> diff s s' [=] empty. Proof. unfold Subset, Equal; intros; set_iff; intuition; absurd (In a empty); auto. Qed. - Lemma remove_diff_singleton : + Lemma remove_diff_singleton remove x s [=] diff s (singleton x). Proof. unfold Equal; intros; set_iff; intuition. Qed. - Lemma diff_inter_empty : inter (diff s s') (inter s s') [=] empty. + Lemma diff_inter_empty inter (diff s s') (inter s s') [=] empty. Proof. unfold Equal; intros; set_iff; intuition; absurd (In a empty); auto. Qed. - Lemma diff_inter_all : union (diff s s') (inter s s') [=] s. + Lemma diff_inter_all union (diff s s') (inter s s') [=] s. Proof. unfold Equal; intros; set_iff; intuition. elim (In_dec a s'); auto. @@ -392,38 +392,38 @@ Module Properties (M: S). (** properties of [Add] *) - Lemma Add_add : Add x s (add x s). + Lemma Add_add Add x s (add x s). Proof. unfold Add; intros; set_iff; intuition. Qed. - Lemma Add_remove : In x s -> Add x (remove x s) s. + Lemma Add_remove In x s -> Add x (remove x s) s. Proof. unfold Add; intros; set_iff; intuition. elim (eq_dec x y); auto. rewrite <- H1; auto. Qed. - Lemma union_Add : Add x s s' -> Add x (union s s'') (union s' s''). + Lemma union_Add Add x s s' -> Add x (union s s'') (union s' s''). Proof. unfold Add; intros; set_iff; rewrite H; tauto. Qed. - Lemma inter_Add : + Lemma inter_Add In x s'' -> Add x s s' -> Add x (inter s s'') (inter s' s''). Proof. unfold Add; intros; set_iff; rewrite H0; intuition. rewrite <- H2; auto. Qed. - Lemma union_Equal : + Lemma union_Equal In x s'' -> Add x s s' -> union s s'' [=] union s' s''. Proof. unfold Add, Equal; intros; set_iff; rewrite H0; intuition. rewrite <- H1; auto. Qed. - Lemma inter_Add_2 : + Lemma inter_Add_2 ~In x s'' -> Add x s s' -> inter s s'' [=] inter s' s''. Proof. unfold Add, Equal; intros; set_iff; rewrite H0; intuition. @@ -432,10 +432,10 @@ Module Properties (M: S). End BasicProperties. - Hint Immediate equal_sym: set. - Hint Resolve equal_refl equal_trans : set. + Hint Immediate equal_sym set. + Hint Resolve equal_refl equal_trans set. - Hint Immediate add_remove remove_add union_sym inter_sym: set. + Hint Immediate add_remove remove_add union_sym inter_sym set. Hint Resolve subset_refl subset_equal subset_antisym subset_trans subset_empty subset_remove_3 subset_diff subset_add_3 subset_add_2 in_subset empty_is_empty_1 empty_is_empty_2 add_equal @@ -447,18 +447,18 @@ Module Properties (M: S). empty_diff_2 union_Add inter_Add union_Equal inter_Add_2 not_in_union inter_subset_1 inter_subset_2 inter_subset_3 diff_subset diff_subset_equal remove_diff_singleton diff_inter_empty diff_inter_all Add_add Add_remove - Equal_remove : set. + Equal_remove set. - Notation NoRedun := (noredunA E.eq). + Notation NoRedun = (noredunA E.eq). Section noredunA_Remove. - Definition remove_list x l := MoreList.filter (fun y => negb (eqb x y)) l. + Definition remove_list x l = MoreList.filter (fun y => negb (eqb x y)) l. - Lemma remove_list_correct : + Lemma remove_list_correct forall s x, NoRedun s -> NoRedun (remove_list x s) /\ - (forall y : elt, ME.In y (remove_list x s) <-> ME.In y s /\ ~ E.eq x y). + (forall y elt, ME.In y (remove_list x s) <-> ME.In y s /\ ~ E.eq x y). Proof. simple induction s; simpl; intros. repeat (split; trivial). @@ -483,11 +483,11 @@ Module Properties (M: S). constructor 2; rewrite H4; auto. Qed. - Let ListEq l l' := forall y : elt, ME.In y l <-> ME.In y l'. + Let ListEq l l' = forall y : elt, ME.In y l <-> ME.In y l'. - Lemma remove_list_equal : - forall s s' x, NoRedun (x :: s) -> NoRedun s' -> - ListEq (x :: s) s' -> ListEq s (remove_list x s'). + Lemma remove_list_equal + forall s s' x, NoRedun (x : s) -> NoRedun s' -> + ListEq (x : s) s' -> ListEq s (remove_list x s'). Proof. unfold ListEq; intros. inversion_clear H. @@ -502,12 +502,12 @@ Module Properties (M: S). destruct H9; auto. Qed. - Let ListAdd x l l' := forall y : elt, ME.In y l' <-> E.eq x y \/ ME.In y l. + Let ListAdd x l l' = forall y : elt, ME.In y l' <-> E.eq x y \/ ME.In y l. - Lemma remove_list_add : - forall s s' x x', NoRedun s -> NoRedun (x' :: s') -> + Lemma remove_list_add + forall s s' x x', NoRedun s -> NoRedun (x' : s') -> ~ E.eq x x' -> ~ ME.In x s -> - ListAdd x s (x' :: s') -> ListAdd x (remove_list x' s) s'. + ListAdd x s (x' : s') -> ListAdd x (remove_list x' s) s'. Proof. unfold ListAdd; intros. inversion_clear H0. @@ -520,20 +520,20 @@ Module Properties (M: S). right; apply H8; split; auto. swap H4; apply In_eq with y; auto. destruct H3. - assert (ME.In y (x' :: s')). auto. + assert (ME.In y (x' : s')). auto. inversion_clear H10; auto. destruct H1; order. destruct (H7 H3). - assert (ME.In y (x' :: s')). auto. + assert (ME.In y (x' : s')). auto. inversion_clear H12; auto. destruct H11; auto. Qed. - Variables (A:Set)(eqA:A->A->Prop)(st:Setoid_Theory _ eqA). - Variables (f:elt->A->A)(Comp:compat_op E.eq eqA f)(Ass:transpose eqA f). - Variables (i:A). + Variables (ASet)(eqA:A->A->Prop)(st:Setoid_Theory _ eqA). + Variables (felt->A->A)(Comp:compat_op E.eq eqA f)(Ass:transpose eqA f). + Variables (iA). - Lemma remove_list_fold_right_0 : + Lemma remove_list_fold_right_0 forall s x, NoRedun s -> ~ME.In x s -> eqA (fold_right f i s) (fold_right f i (remove_list x s)). Proof. @@ -545,7 +545,7 @@ Module Properties (M: S). apply Comp; auto. Qed. - Lemma remove_list_fold_right : + Lemma remove_list_fold_right forall s x, NoRedun s -> ME.In x s -> eqA (fold_right f i s) (f x (fold_right f i (remove_list x s))). Proof. @@ -562,7 +562,7 @@ Module Properties (M: S). trans_st (f a (f x (fold_right f i (remove_list x l)))). Qed. - Lemma fold_right_equal : + Lemma fold_right_equal forall s s', NoRedun s -> NoRedun s' -> ListEq s s' -> eqA (fold_right f i s) (fold_right f i s'). Proof. @@ -571,7 +571,7 @@ Module Properties (M: S). intros; refl_st; auto. unfold ListEq; intros. destruct (H1 t0). - assert (X : ME.In t0 nil); auto; inversion X. + assert (X ME.In t0 nil); auto; inversion X. intros x l Hrec s' N N' E; simpl in *. trans_st (f x (fold_right f i (remove_list x s'))). apply Comp; auto. @@ -585,14 +585,14 @@ Module Properties (M: S). rewrite <- E; auto. Qed. - Lemma fold_right_add : + Lemma fold_right_add forall s' s x, NoRedun s -> NoRedun s' -> ~ ME.In x s -> ListAdd x s s' -> eqA (fold_right f i s') (f x (fold_right f i s)). Proof. simple induction s'. unfold ListAdd; intros. destruct (H2 x); clear H2. - assert (X : ME.In x nil); auto; inversion X. + assert (X ME.In x nil); auto; inversion X. intros x' l' Hrec s x N N' IN EQ; simpl. (* if x=x' *) destruct (eq_dec x x'). @@ -605,7 +605,7 @@ Module Properties (M: S). destruct H; auto. inversion_clear N'. destruct H2; apply In_eq with y; auto; order. - assert (X:ME.In y (x' :: l')); auto; inversion_clear X; auto. + assert (XME.In y (x' :: l')); auto; inversion_clear X; auto. destruct IN; apply In_eq with y; auto; order. (* else x<>x' *) trans_st (f x' (f x (fold_right f i (remove_list x' s)))). @@ -632,14 +632,14 @@ Module Properties (M: S). Section Old_Spec_Now_Properties. (** When [FSets] was first designed, the order in which Ocaml's [Set.fold] - takes the set elements was unspecified. This specification reflects this fact: + takes the set elements was unspecified. This specification reflects this fact *) - Lemma fold_0 : - forall s (A : Set) (i : A) (f : elt -> A -> A), - exists l : list elt, + Lemma fold_0 + forall s (A Set) (i : A) (f : elt -> A -> A), + exists l list elt, NoRedun l /\ - (forall x : elt, In x s <-> InA E.eq x l) /\ + (forall x elt, In x s <-> InA E.eq x l) /\ fold f s i = fold_right f i l. Proof. intros; exists (rev (elements s)); split. @@ -656,9 +656,9 @@ Module Properties (M: S). the recursive structure of a set. It is now lemmas [fold_1] and [fold_2]. *) - Lemma fold_1 : - forall s (A : Set) (eqA : A -> A -> Prop) - (st : Setoid_Theory A eqA) (i : A) (f : elt -> A -> A), + Lemma fold_1 + forall s (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. unfold Empty; intros; destruct (fold_0 s i f) as (l,(H1, (H2, H3))). @@ -669,9 +669,9 @@ Module Properties (M: S). elim (H2 e); intuition. Qed. - Lemma fold_2 : - forall s s' x (A : Set) (eqA : A -> A -> Prop) - (st : Setoid_Theory A eqA) (i : A) (f : elt -> A -> A), + Lemma fold_2 + forall s s' x (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)). @@ -679,34 +679,34 @@ Module Properties (M: S). intros; destruct (fold_0 s i f) as (l,(Hl, (Hl1, Hl2))); destruct (fold_0 s' i f) as (l',(Hl', (Hl'1, Hl'2))). rewrite Hl2; rewrite Hl'2; clear Hl2 Hl'2. - apply fold_right_add with (eqA := eqA); auto. + apply fold_right_add with (eqA = eqA); auto. rewrite <- Hl1; auto. intros; rewrite <- Hl1; rewrite <- Hl'1; auto. Qed. (** Similar specifications for [cardinal]. *) - Lemma cardinal_fold : forall s, cardinal s = fold (fun _ => S) s 0. + Lemma cardinal_fold forall s, cardinal s = fold (fun _ => S) s 0. Proof. intros; rewrite cardinal_1; rewrite M.fold_1. symmetry; apply fold_left_length; auto. Qed. - Lemma cardinal_0 : - forall s, exists l : list elt, + Lemma cardinal_0 + forall s, exists l list elt, noredunA E.eq l /\ - (forall x : elt, In x s <-> InA E.eq x l) /\ + (forall x elt, In x s <-> InA E.eq x l) /\ cardinal s = length l. Proof. intros; exists (elements s); intuition; apply cardinal_1. Qed. - Lemma cardinal_1 : forall s, Empty s -> cardinal s = 0. + Lemma cardinal_1 forall s, Empty s -> cardinal s = 0. Proof. intros; rewrite cardinal_fold; apply fold_1; auto. Qed. - Lemma cardinal_2 : + Lemma cardinal_2 forall s s' x, ~ In x s -> Add x s s' -> cardinal s' = S (cardinal s). Proof. intros; do 2 rewrite cardinal_fold. @@ -718,7 +718,7 @@ Module Properties (M: S). (** * Induction principle over sets *) - Lemma cardinal_inv_1 : forall s, cardinal s = 0 -> Empty s. + Lemma cardinal_inv_1 forall s, cardinal s = 0 -> Empty s. Proof. intros s; rewrite M.cardinal_1; intros H a; red. rewrite elements_iff. @@ -726,16 +726,16 @@ Module Properties (M: S). Qed. Hint Resolve cardinal_inv_1. - Lemma cardinal_inv_2 : - forall s n, cardinal s = S n -> { x : elt | In x s }. + Lemma cardinal_inv_2 + forall s n, cardinal s = S n -> { x elt | In x s }. Proof. intros; rewrite M.cardinal_1 in H. - generalize (elements_2 (s:=s)). + generalize (elements_2 (s=s)). destruct (elements s); try discriminate. exists e; auto. Qed. - Lemma Equal_cardinal_aux : + Lemma Equal_cardinal_aux forall n s s', cardinal s = n -> s[=]s' -> cardinal s = cardinal s'. Proof. simple induction n; intros. @@ -744,25 +744,25 @@ Module Properties (M: S). rewrite <- H0; auto. destruct (cardinal_inv_2 H0) as (x,H2). revert H0. - rewrite (cardinal_2 (s:=remove x s) (s':=s) (x:=x)); auto with set. - rewrite (cardinal_2 (s:=remove x s') (s':=s') (x:=x)); auto with set. + rewrite (cardinal_2 (s=remove x s) (s':=s) (x:=x)); auto with set. + rewrite (cardinal_2 (s=remove x s') (s':=s') (x:=x)); auto with set. rewrite H1 in H2; auto with set. Qed. - Lemma Equal_cardinal : forall s s', s[=]s' -> cardinal s = cardinal s'. + Lemma Equal_cardinal forall s s', s[=]s' -> cardinal s = cardinal s'. Proof. intros; apply Equal_cardinal_aux with (cardinal s); auto. Qed. - Add Morphism cardinal : cardinal_m. + Add Morphism cardinal cardinal_m. Proof. exact Equal_cardinal. Qed. Hint Resolve Add_add Add_remove Equal_remove cardinal_inv_1 Equal_cardinal. - Lemma cardinal_induction : - forall P : t -> Type, + Lemma cardinal_induction + forall P t -> Type, (forall s, Empty s -> P s) -> (forall s s', P s -> forall x, ~In x s -> Add x s s' -> P s') -> forall n s, cardinal s = n -> P s. @@ -771,14 +771,14 @@ Module Properties (M: S). destruct (cardinal_inv_2 H) as (x,H0). apply X0 with (remove x s) x; auto. apply X1; auto. - rewrite (cardinal_2 (x:=x)(s:=remove x s)(s':=s)) in H; auto. + rewrite (cardinal_2 (x=x)(s:=remove x s)(s':=s)) in H; auto. Qed. - Lemma set_induction : - forall P : t -> Type, - (forall s : t, Empty s -> P s) -> - (forall s s' : t, P s -> forall x : elt, ~In x s -> Add x s s' -> P s') -> - forall s : t, P s. + Lemma set_induction + forall P t -> Type, + (forall s t, Empty s -> P s) -> + (forall s s' t, P s -> forall x : elt, ~In x s -> Add x s s' -> P s') -> + forall s t, P s. Proof. intros; apply cardinal_induction with (cardinal s); auto. Qed. @@ -786,18 +786,18 @@ Module Properties (M: S). (** Other properties of [fold]. *) Section Fold. - Variables (A:Set)(eqA:A->A->Prop)(st:Setoid_Theory _ eqA). - Variables (f:elt->A->A)(Comp:compat_op E.eq eqA f)(Ass:transpose eqA f). + Variables (ASet)(eqA:A->A->Prop)(st:Setoid_Theory _ eqA). + Variables (felt->A->A)(Comp:compat_op E.eq eqA f)(Ass:transpose eqA f). Section Fold_1. - Variable i i':A. + Variable i i'A. - Lemma fold_empty : eqA (fold f empty i) i. + Lemma fold_empty eqA (fold f empty i) i. Proof. apply fold_1; auto. Qed. - Lemma fold_equal : + Lemma fold_equal forall s s', s[=]s' -> eqA (fold f s i) (fold f s' i). Proof. intros s; pattern s; apply set_induction; clear s; intros. @@ -806,40 +806,40 @@ Module Properties (M: S). sym_st; apply fold_1; auto. rewrite <- H0; auto. trans_st (f x (fold f s i)). - apply fold_2 with (eqA := eqA); auto. - sym_st; apply fold_2 with (eqA := eqA); auto. + apply fold_2 with (eqA = eqA); auto. + sym_st; apply fold_2 with (eqA = eqA); auto. unfold Add in *; intros. rewrite <- H2; auto. Qed. - Lemma fold_add : forall s x, ~In x s -> + Lemma fold_add forall s x, ~In x s -> eqA (fold f (add x s) i) (f x (fold f s i)). Proof. - intros; apply fold_2 with (eqA := eqA); auto. + intros; apply fold_2 with (eqA = eqA); auto. Qed. - Lemma add_fold : forall s x, In x s -> + Lemma add_fold forall s x, In x s -> eqA (fold f (add x s) i) (fold f s i). Proof. intros; apply fold_equal; auto with set. Qed. - Lemma remove_fold_1: forall s x, In x s -> + Lemma remove_fold_1 forall s x, In x s -> eqA (f x (fold f (remove x s) i)) (fold f s i). Proof. intros. sym_st. - apply fold_2 with (eqA:=eqA); auto. + apply fold_2 with (eqA=eqA); auto. Qed. - Lemma remove_fold_2: forall s x, ~In x s -> + Lemma remove_fold_2 forall s x, ~In x s -> eqA (fold f (remove x s) i) (fold f s i). Proof. intros. apply fold_equal; auto with set. Qed. - Lemma fold_commutes : forall s x, + Lemma fold_commutes forall s x, eqA (fold f s (f x i)) (f x (fold f s i)). Proof. intros; pattern s; apply set_induction; clear s; intros. @@ -849,15 +849,15 @@ Module Properties (M: S). apply Comp; auto. apply fold_1; auto. trans_st (f x0 (fold f s (f x i))). - apply fold_2 with (eqA:=eqA); auto. + apply fold_2 with (eqA=eqA); auto. trans_st (f x0 (f x (fold f s i))). trans_st (f x (f x0 (fold f s i))). apply Comp; auto. sym_st. - apply fold_2 with (eqA:=eqA); auto. + apply fold_2 with (eqA=eqA); auto. Qed. - Lemma fold_init : forall s, eqA i i' -> + Lemma fold_init forall s, eqA i i' -> eqA (fold f s i) (fold f s i'). Proof. intros; pattern s; apply set_induction; clear s; intros. @@ -866,16 +866,16 @@ Module Properties (M: S). trans_st i'. sym_st; apply fold_1; auto. trans_st (f x (fold f s i)). - apply fold_2 with (eqA:=eqA); auto. + apply fold_2 with (eqA=eqA); auto. trans_st (f x (fold f s i')). - sym_st; apply fold_2 with (eqA:=eqA); auto. + sym_st; apply fold_2 with (eqA=eqA); auto. Qed. End Fold_1. Section Fold_2. - Variable i:A. + Variable iA. - Lemma fold_union_inter : forall s s', + Lemma fold_union_inter forall s s', eqA (fold f (union s s') (fold f (inter s s') i)) (fold f s (fold f s' i)). Proof. @@ -891,7 +891,7 @@ Module Properties (M: S). (* In x s' *) trans_st (fold f (union s'' s') (f x (fold f (inter s s') i))); auto with set. apply fold_init; auto. - apply fold_2 with (eqA:=eqA); auto with set. + apply fold_2 with (eqA=eqA); auto with set. rewrite inter_iff; intuition. trans_st (f x (fold f s (fold f s' i))). trans_st (fold f (union s s') (f x (fold f (inter s s') i))). @@ -899,24 +899,24 @@ Module Properties (M: S). apply equal_sym; apply union_Equal with x; auto with set. trans_st (f x (fold f (union s s') (fold f (inter s s') i))). apply fold_commutes; auto. - sym_st; apply fold_2 with (eqA:=eqA); auto. + sym_st; apply fold_2 with (eqA=eqA); auto. (* ~(In x s') *) trans_st (f x (fold f (union s s') (fold f (inter s'' s') i))). - apply fold_2 with (eqA:=eqA); auto with set. + apply fold_2 with (eqA=eqA); auto with set. trans_st (f x (fold f (union s s') (fold f (inter s s') i))). apply Comp;auto. apply fold_init;auto. apply fold_equal;auto. apply equal_sym; apply inter_Add_2 with x; auto with set. trans_st (f x (fold f s (fold f s' i))). - sym_st; apply fold_2 with (eqA:=eqA); auto. + sym_st; apply fold_2 with (eqA=eqA); auto. Qed. End Fold_2. Section Fold_3. - Variable i:A. + Variable iA. - Lemma fold_diff_inter : forall s s', + Lemma fold_diff_inter forall s s', eqA (fold f (diff s s') (fold f (inter s s') i)) (fold f s i). Proof. intros. @@ -929,7 +929,7 @@ Module Properties (M: S). apply fold_1; auto with set. Qed. - Lemma fold_union: forall s s', (forall x, ~In x s\/~In x s') -> + Lemma fold_union forall s s', (forall x, ~In x s\/~In x s') -> eqA (fold f (union s s') i) (fold f s (fold f s' i)). Proof. intros. @@ -943,12 +943,12 @@ Module Properties (M: S). End Fold_3. End Fold. - Lemma fold_plus : + Lemma fold_plus forall s p, fold (fun _ => S) s p = fold (fun _ => S) s 0 + p. Proof. - assert (st := gen_st nat). - assert (fe : compat_op E.eq (@eq _) (fun _ => S)) by unfold compat_op; auto. - assert (fp : transpose (@eq _) (fun _:elt => S)) by unfold transpose; auto. + assert (st = gen_st nat). + assert (fe compat_op E.eq (@eq _) (fun _ => S)) by unfold compat_op; auto. + assert (fp transpose (@eq _) (fun _:elt => S)) by unfold transpose; auto. intros s p; pattern s; apply set_induction; clear s; intros. rewrite (fold_1 st p (fun _ => S) H). rewrite (fold_1 st 0 (fun _ => S) H); trivial. @@ -963,14 +963,14 @@ Module Properties (M: S). (** properties of [cardinal] *) - Lemma empty_cardinal : cardinal empty = 0. + Lemma empty_cardinal cardinal empty = 0. Proof. rewrite cardinal_fold; apply fold_1; auto. Qed. - Hint Immediate empty_cardinal cardinal_1 : set. + Hint Immediate empty_cardinal cardinal_1 set. - Lemma singleton_cardinal : forall x, cardinal (singleton x) = 1. + Lemma singleton_cardinal forall x, cardinal (singleton x) = 1. Proof. intros. rewrite (singleton_equal_add x). @@ -978,17 +978,17 @@ Module Properties (M: S). apply cardinal_2 with x; auto with set. Qed. - Hint Resolve singleton_cardinal: set. + Hint Resolve singleton_cardinal set. - Lemma diff_inter_cardinal : + Lemma diff_inter_cardinal forall s s', cardinal (diff s s') + cardinal (inter s s') = cardinal s . Proof. intros; do 3 rewrite cardinal_fold. rewrite <- fold_plus. - apply fold_diff_inter with (eqA:=@eq nat); auto. + apply fold_diff_inter with (eqA=@eq nat); auto. Qed. - Lemma union_cardinal: + Lemma union_cardinal forall s s', (forall x, ~In x s\/~In x s') -> cardinal (union s s')=cardinal s+cardinal s'. Proof. @@ -997,7 +997,7 @@ Module Properties (M: S). apply fold_union; auto. Qed. - Lemma subset_cardinal : + Lemma subset_cardinal forall s s', s[<=]s' -> cardinal s <= cardinal s' . Proof. intros. @@ -1006,47 +1006,47 @@ Module Properties (M: S). rewrite (inter_subset_equal H); auto with arith. Qed. - Lemma union_inter_cardinal : + Lemma union_inter_cardinal forall s s', cardinal (union s s') + cardinal (inter s s') = cardinal s + cardinal s' . Proof. intros. do 4 rewrite cardinal_fold. do 2 rewrite <- fold_plus. - apply fold_union_inter with (eqA:=@eq nat); auto. + apply fold_union_inter with (eqA=@eq nat); auto. Qed. - Lemma union_cardinal_le : + Lemma union_cardinal_le forall s s', cardinal (union s s') <= cardinal s + cardinal s'. Proof. intros; generalize (union_inter_cardinal s s'). intros; rewrite <- H; auto with arith. Qed. - Lemma add_cardinal_1 : + Lemma add_cardinal_1 forall s x, In x s -> cardinal (add x s) = cardinal s. Proof. auto with set. Qed. - Lemma add_cardinal_2 : + Lemma add_cardinal_2 forall s x, ~In x s -> cardinal (add x s) = S (cardinal s). Proof. intros. do 2 rewrite cardinal_fold. change S with ((fun _ => S) x); - apply fold_add with (eqA:=@eq nat); auto. + apply fold_add with (eqA=@eq nat); auto. Qed. - Lemma remove_cardinal_1 : + Lemma remove_cardinal_1 forall s x, In x s -> S (cardinal (remove x s)) = cardinal s. Proof. intros. do 2 rewrite cardinal_fold. change S with ((fun _ =>S) x). - apply remove_fold_1 with (eqA:=@eq nat); auto. + apply remove_fold_1 with (eqA=@eq nat); auto. Qed. - Lemma remove_cardinal_2 : + Lemma remove_cardinal_2 forall s x, ~In x s -> cardinal (remove x s) = cardinal s. Proof. auto with set. |