diff options
author | letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2006-05-22 16:58:50 +0000 |
---|---|---|
committer | letouzey <letouzey@85f007b7-540e-0410-9357-904b9bb8a0f7> | 2006-05-22 16:58:50 +0000 |
commit | 4a44b2833255f8f2a3927dac2123bbeae4421662 (patch) | |
tree | f3d4bb93f9667f9720681e4094f901a5486e4367 /theories/FSets/FSetAVL.v | |
parent | b63b9a091be8533a5da60304c767ab881ca7db41 (diff) |
suite des marquages de types et opacifications de lemmes dans les wrappers Make
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@8843 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'theories/FSets/FSetAVL.v')
-rw-r--r-- | theories/FSets/FSetAVL.v | 276 |
1 files changed, 149 insertions, 127 deletions
diff --git a/theories/FSets/FSetAVL.v b/theories/FSets/FSetAVL.v index cb2a03cf2..05ccff5d7 100644 --- a/theories/FSets/FSetAVL.v +++ b/theories/FSets/FSetAVL.v @@ -2558,94 +2558,93 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. Module E := X. Module Raw := Raw I X. - Import Raw. - Record bbst : Set := Bbst {this :> t; is_bst : bst this; is_avl: avl this}. + Record bbst : Set := Bbst {this :> Raw.t; is_bst : Raw.bst this; is_avl: Raw.avl this}. Definition t := bbst. - Definition elt := X.t. + Definition elt := E.t. - Definition In (x : elt) (s : t) := In x s. - Definition Equal s s' := forall a : elt, In a s <-> In a s'. - Definition Subset s s' := forall a : elt, In a s -> In a s'. - Definition Empty s := forall a : elt, ~ In a s. - Definition For_all (P : elt -> Prop) s := forall x, In x s -> P x. - Definition Exists (P : elt -> Prop) s := exists x, In x s /\ P x. - - Implicit Types s : t. - Implicit Types x y : elt. + Definition In (x : elt) (s : t) : Prop := Raw.In x s. + Definition Equal (s s':t) : Prop := forall a : elt, In a s <-> In a s'. + Definition Subset (s s':t) : Prop := forall a : elt, In a s -> In a s'. + Definition Empty (s:t) : Prop := forall a : elt, ~ In a s. + Definition For_all (P : elt -> Prop) (s:t) : Prop := forall x, In x s -> P x. + Definition Exists (P : elt -> Prop) (s:t) : Prop := exists x, In x s /\ P x. - Definition In_1 s := In_1 s. + Lemma In_1 : forall (s:t)(x y:elt), E.eq x y -> In x s -> In y s. + Proof. intro s; exact (Raw.In_1 s). Qed. - Definition mem x s := mem x s. - - Definition empty := Bbst _ empty_bst empty_avl. - Definition is_empty s := is_empty s. - Definition singleton x := Bbst _ (singleton_bst x) (singleton_avl x). - Definition add x s := - Bbst _ (add_bst s x (is_bst s) (is_avl s)) - (add_avl s x (is_avl s)). - Definition remove x s := - Bbst _ (remove_bst s x (is_bst s) (is_avl s)) - (remove_avl s x (is_avl s)). - Definition inter s s' := - Bbst _ (inter_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) - (inter_avl _ _ (is_avl s) (is_avl s')). - Definition diff s s' := - Bbst _ (diff_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) - (diff_avl _ _ (is_avl s) (is_avl s')). - Definition elements s := elements s. - Definition min_elt s := min_elt s. - Definition max_elt s := max_elt s. - Definition choose s := choose s. - Definition fold (B : Set) (f : elt -> B -> B) s := fold f s. - Definition cardinal s := cardinal s. - Definition filter (f : elt -> bool) s := - Bbst _ (filter_bst f _ (is_bst s) (is_avl s)) - (filter_avl f _ (is_avl s)). - Definition for_all (f : elt -> bool) s := for_all f s. - Definition exists_ (f : elt -> bool) s := exists_ f s. - Definition partition (f : elt -> bool) s := - let p := partition f s in - (Bbst (fst p) (partition_bst_1 f _ (is_bst s) (is_avl s)) - (partition_avl_1 f _ (is_avl s)), - Bbst (snd p) (partition_bst_2 f _ (is_bst s) (is_avl s)) - (partition_avl_2 f _ (is_avl s))). - - Definition union s s' := - let (u,p) := union _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s') in + Definition mem (x:elt)(s:t) : bool := Raw.mem x s. + + Definition empty : t := Bbst _ Raw.empty_bst Raw.empty_avl. + Definition is_empty (s:t) : bool := Raw.is_empty s. + Definition singleton (x:elt) : t := Bbst _ (Raw.singleton_bst x) (Raw.singleton_avl x). + Definition add (x:elt)(s:t) : t := + Bbst _ (Raw.add_bst s x (is_bst s) (is_avl s)) + (Raw.add_avl s x (is_avl s)). + Definition remove (x:elt)(s:t) : t := + Bbst _ (Raw.remove_bst s x (is_bst s) (is_avl s)) + (Raw.remove_avl s x (is_avl s)). + Definition inter (s s':t) : t := + Bbst _ (Raw.inter_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) + (Raw.inter_avl _ _ (is_avl s) (is_avl s')). + Definition diff (s s':t) : t := + Bbst _ (Raw.diff_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) + (Raw.diff_avl _ _ (is_avl s) (is_avl s')). + Definition elements (s:t) : list elt := Raw.elements s. + Definition min_elt (s:t) : option elt := Raw.min_elt s. + Definition max_elt (s:t) : option elt := Raw.max_elt s. + Definition choose (s:t) : option elt := Raw.choose s. + Definition fold (B : Set) (f : elt -> B -> B) (s:t) : B -> B := Raw.fold f s. + Definition cardinal (s:t) : nat := Raw.cardinal s. + Definition filter (f : elt -> bool) (s:t) : t := + Bbst _ (Raw.filter_bst f _ (is_bst s) (is_avl s)) + (Raw.filter_avl f _ (is_avl s)). + Definition for_all (f : elt -> bool) (s:t) : bool := Raw.for_all f s. + Definition exists_ (f : elt -> bool) (s:t) : bool := Raw.exists_ f s. + Definition partition (f : elt -> bool) (s:t) : t * t := + let p := Raw.partition f s in + (Bbst (fst p) (Raw.partition_bst_1 f _ (is_bst s) (is_avl s)) + (Raw.partition_avl_1 f _ (is_avl s)), + Bbst (snd p) (Raw.partition_bst_2 f _ (is_bst s) (is_avl s)) + (Raw.partition_avl_2 f _ (is_avl s))). + + Definition union (s s':t) : t := + let (u,p) := Raw.union _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s') in let (b,p) := p in let (a,_) := p in Bbst u b a. - Definition union' s s' := - Bbst _ (union'_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) - (union'_avl _ _ (is_avl s) (is_avl s')). + Definition union' (s s' : t) : t := + Bbst _ (Raw.union'_bst _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')) + (Raw.union'_avl _ _ (is_avl s) (is_avl s')). - Definition equal s s':= if equal _ _ (is_bst s) (is_bst s') then true else false. - Definition equal' s s' := equal' s s'. + Definition equal (s s': t) : bool := if Raw.equal _ _ (is_bst s) (is_bst s') then true else false. + Definition equal' (s s':t) : bool := Raw.equal' s s'. - Definition subset s s':= if subset _ _ (is_bst s) (is_bst s') then true else false. - Definition subset' s s' := subset' s s'. + Definition subset (s s':t) : bool := if Raw.subset _ _ (is_bst s) (is_bst s') then true else false. + Definition subset' (s s':t) : bool := Raw.subset' s s'. - Definition eq s s' := eq s s'. - Definition lt s s' := lt s s'. + Definition eq (s s':t) : Prop := Raw.eq s s'. + Definition lt (s s':t) : Prop := Raw.lt s s'. - Definition compare s s' : Compare lt eq s s'. + Definition compare (s s':t) : Compare lt eq s s'. Proof. - intros; elim (compare _ _ (is_bst s) (is_bst s')); + intros; elim (Raw.compare _ _ (is_bst s) (is_bst s')); [ constructor 1 | constructor 2 | constructor 3 ]; auto. Defined. (* specs *) Section Specs. - Variable s s' : t. + Variable s s' s'': t. Variable x y : elt. Hint Resolve is_bst is_avl. - Definition mem_1 := mem_1 s x (is_bst s). - Definition mem_2 := mem_2 s x. + Lemma mem_1 : In x s -> mem x s = true. + Proof. exact (Raw.mem_1 s x (is_bst s)). Qed. + Lemma mem_2 : mem x s = true -> In x s. + Proof. exact (Raw.mem_2 s x). Qed. Lemma equal_1 : Equal s s' -> equal s s' = true. Proof. @@ -2657,10 +2656,10 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. unfold equal; destruct (Raw.equal s s'); simpl; intuition; discriminate. Qed. - Definition equal'_1 s s' := - equal'_1 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s'). - Definition equal'_2 s s' := - equal'_2 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s'). + Lemma equal'_1 : Equal s s' -> equal' s s' = true. + Proof. exact (Raw.equal'_1 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')). Qed. + Lemma equal'_2 : equal' s s' = true -> Equal s s'. + Proof. exact (Raw.equal'_2 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')). Qed. Lemma subset_1 : Subset s s' -> subset s s' = true. Proof. @@ -2672,49 +2671,54 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. unfold subset; destruct (Raw.subset s s'); simpl; intuition discriminate. Qed. - Definition subset'_1 s s' := - subset'_1 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s'). - Definition subset'_2 s s' := - subset'_2 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s'). + Lemma subset'_1 : Subset s s' -> subset' s s' = true. + Proof. exact (Raw.subset'_1 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')). Qed. + Lemma subset'_2 : subset' s s' = true -> Subset s s'. + Proof. exact (Raw.subset'_2 _ _ (is_bst s) (is_avl s) (is_bst s') (is_avl s')). Qed. - Definition empty_1 : Empty empty := empty_1. + Lemma empty_1 : Empty empty. + Proof. exact Raw.empty_1. Qed. - Definition is_empty_1 : Empty s -> is_empty s = true := is_empty_1 s. - Definition is_empty_2 : is_empty s = true -> Empty s := is_empty_2 s. + Lemma is_empty_1 : Empty s -> is_empty s = true. + Proof. exact (Raw.is_empty_1 s). Qed. + Lemma is_empty_2 : is_empty s = true -> Empty s. + Proof. exact (Raw.is_empty_2 s). Qed. - Lemma add_1 : X.eq x y -> In y (add x s). + Lemma add_1 : E.eq x y -> In y (add x s). Proof. - unfold add, In; simpl; rewrite add_in; auto. + unfold add, In; simpl; rewrite Raw.add_in; auto. Qed. Lemma add_2 : In y s -> In y (add x s). Proof. - unfold add, In; simpl; rewrite add_in; auto. + unfold add, In; simpl; rewrite Raw.add_in; auto. Qed. - Lemma add_3 : ~ X.eq x y -> In y (add x s) -> In y s. + Lemma add_3 : ~ E.eq x y -> In y (add x s) -> In y s. Proof. - unfold add, In; simpl; rewrite add_in; intuition. + unfold add, In; simpl; rewrite Raw.add_in; intuition. elim H; auto. Qed. Lemma remove_1 : E.eq x y -> ~ In y (remove x s). Proof. - unfold remove, In; simpl; rewrite remove_in; intuition. + unfold remove, In; simpl; rewrite Raw.remove_in; intuition. Qed. Lemma remove_2 : ~ E.eq x y -> In y s -> In y (remove x s). Proof. - unfold remove, In; simpl; rewrite remove_in; intuition. + unfold remove, In; simpl; rewrite Raw.remove_in; intuition. Qed. Lemma remove_3 : In y (remove x s) -> In y s. Proof. - unfold remove, In; simpl; rewrite remove_in; intuition. + unfold remove, In; simpl; rewrite Raw.remove_in; intuition. Qed. - Definition singleton_1 := singleton_1 x y. - Definition singleton_2 := singleton_2 x y. + Lemma singleton_1 : In y (singleton x) -> E.eq x y. + Proof. exact (Raw.singleton_1 x y). Qed. + Lemma singleton_2 : E.eq x y -> In y (singleton x). + Proof. exact (Raw.singleton_2 x y). Qed. Lemma union_1 : In x (union s s') -> In x s \/ In x s'. Proof. @@ -2742,58 +2746,58 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. Lemma union'_1 : In x (union' s s') -> In x s \/ In x s'. Proof. - unfold union', In; simpl; rewrite union'_in; intuition. + unfold union', In; simpl; rewrite Raw.union'_in; intuition. Qed. Lemma union'_2 : In x s -> In x (union' s s'). Proof. - unfold union', In; simpl; rewrite union'_in; intuition. + unfold union', In; simpl; rewrite Raw.union'_in; intuition. Qed. Lemma union'_3 : In x s' -> In x (union' s s'). Proof. - unfold union', In; simpl; rewrite union'_in; intuition. + unfold union', In; simpl; rewrite Raw.union'_in; intuition. Qed. Lemma inter_1 : In x (inter s s') -> In x s. Proof. - unfold inter, In; simpl; rewrite inter_in; intuition. + unfold inter, In; simpl; rewrite Raw.inter_in; intuition. Qed. Lemma inter_2 : In x (inter s s') -> In x s'. Proof. - unfold inter, In; simpl; rewrite inter_in; intuition. + unfold inter, In; simpl; rewrite Raw.inter_in; intuition. Qed. Lemma inter_3 : In x s -> In x s' -> In x (inter s s'). Proof. - unfold inter, In; simpl; rewrite inter_in; intuition. + unfold inter, In; simpl; rewrite Raw.inter_in; intuition. Qed. Lemma diff_1 : In x (diff s s') -> In x s. Proof. - unfold diff, In; simpl; rewrite diff_in; intuition. + unfold diff, In; simpl; rewrite Raw.diff_in; intuition. Qed. Lemma diff_2 : In x (diff s s') -> ~ In x s'. Proof. - unfold diff, In; simpl; rewrite diff_in; intuition. + unfold diff, In; simpl; rewrite Raw.diff_in; intuition. Qed. Lemma diff_3 : In x s -> ~ In x s' -> In x (diff s s'). Proof. - unfold diff, In; simpl; rewrite diff_in; intuition. + unfold diff, In; simpl; rewrite Raw.diff_in; intuition. Qed. Lemma fold_1 : forall (A : Set) (i : A) (f : elt -> A -> A), fold A f s i = fold_left (fun a e => f e a) (elements s) i. Proof. - unfold fold, elements; intros; apply fold_1; auto. + unfold fold, elements; intros; apply Raw.fold_1; auto. Qed. Lemma cardinal_1 : cardinal s = length (elements s). Proof. - unfold cardinal, elements; intros; apply cardinal_elements_1; auto. + unfold cardinal, elements; intros; apply Raw.cardinal_elements_1; auto. Qed. Section Filter. @@ -2801,39 +2805,43 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. Lemma filter_1 : compat_bool E.eq f -> In x (filter f s) -> In x s. Proof. - intro; unfold filter, In; simpl; rewrite filter_in; intuition. + intro; unfold filter, In; simpl; rewrite Raw.filter_in; intuition. Qed. Lemma filter_2 : compat_bool E.eq f -> In x (filter f s) -> f x = true. Proof. - intro; unfold filter, In; simpl; rewrite filter_in; intuition. + intro; unfold filter, In; simpl; rewrite Raw.filter_in; intuition. Qed. Lemma filter_3 : compat_bool E.eq f -> In x s -> f x = true -> In x (filter f s). Proof. - intro; unfold filter, In; simpl; rewrite filter_in; intuition. + intro; unfold filter, In; simpl; rewrite Raw.filter_in; intuition. Qed. - Definition for_all_1 := for_all_1 f s. - Definition for_all_2 := for_all_2 f s. + Lemma for_all_1 : compat_bool E.eq f -> For_all (fun x => f x = true) s -> for_all f s = true. + Proof. exact (Raw.for_all_1 f s). Qed. + Lemma for_all_2 : compat_bool E.eq f -> for_all f s = true -> For_all (fun x => f x = true) s. + Proof. exact (Raw.for_all_2 f s). Qed. - Definition exists_1 := exists_1 f s. - Definition exists_2 := exists_2 f s. + Lemma exists_1 : compat_bool E.eq f -> Exists (fun x => f x = true) s -> exists_ f s = true. + Proof. exact (Raw.exists_1 f s). Qed. + Lemma exists_2 : compat_bool E.eq f -> exists_ f s = true -> Exists (fun x => f x = true) s. + Proof. exact (Raw.exists_2 f s). Qed. Lemma partition_1 : compat_bool E.eq f -> Equal (fst (partition f s)) (filter f s). Proof. unfold partition, filter, Equal, In; simpl ;intros H a. - rewrite partition_in_1; auto. - rewrite filter_in; intuition. + rewrite Raw.partition_in_1; auto. + rewrite Raw.filter_in; intuition. Qed. Lemma partition_2 : compat_bool E.eq f -> Equal (snd (partition f s)) (filter (fun x => negb (f x)) s). Proof. unfold partition, filter, Equal, In; simpl ;intros H a. - rewrite partition_in_2; auto. - rewrite filter_in; intuition. + rewrite Raw.partition_in_2; auto. + rewrite Raw.filter_in; intuition. red; intros. f_equal; auto. destruct (f a); auto. @@ -2844,33 +2852,47 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. Lemma elements_1 : In x s -> InA E.eq x (elements s). Proof. - unfold elements, In; rewrite elements_in; auto. + unfold elements, In; rewrite Raw.elements_in; auto. Qed. Lemma elements_2 : InA E.eq x (elements s) -> In x s. Proof. - unfold elements, In; rewrite elements_in; auto. + unfold elements, In; rewrite Raw.elements_in; auto. Qed. - Definition elements_3 : sort E.lt (elements s) := elements_sort _ (is_bst s). - - Definition min_elt_1 := min_elt_1 s x. - Definition min_elt_2 := min_elt_2 s x y (is_bst s). - Definition min_elt_3 := min_elt_3 s. - - Definition max_elt_1 := max_elt_1 s x. - Definition max_elt_2 := max_elt_2 s x y (is_bst s). - Definition max_elt_3 := max_elt_3 s. - - Definition choose_1 := choose_1 s x. - Definition choose_2 := choose_2 s. - - Definition eq_refl s := eq_refl s. - Definition eq_sym s s' := eq_sym s s'. - Definition eq_trans s s' s'' := eq_trans s s' s''. + Lemma elements_3 : sort E.lt (elements s). + Proof. exact (Raw.elements_sort _ (is_bst s)). Qed. + + Lemma min_elt_1 : min_elt s = Some x -> In x s. + Proof. exact (Raw.min_elt_1 s x). Qed. + Lemma min_elt_2 : min_elt s = Some x -> In y s -> ~ E.lt y x. + Proof. exact (Raw.min_elt_2 s x y (is_bst s)). Qed. + Lemma min_elt_3 : min_elt s = None -> Empty s. + Proof. exact (Raw.min_elt_3 s). Qed. + + Lemma max_elt_1 : max_elt s = Some x -> In x s. + Proof. exact (Raw.max_elt_1 s x). Qed. + Lemma max_elt_2 : max_elt s = Some x -> In y s -> ~ E.lt x y. + Proof. exact (Raw.max_elt_2 s x y (is_bst s)). Qed. + Lemma max_elt_3 : max_elt s = None -> Empty s. + Proof. exact (Raw.max_elt_3 s). Qed. + + Lemma choose_1 : choose s = Some x -> In x s. + Proof. exact (Raw.choose_1 s x). Qed. + Lemma choose_2 : choose s = None -> Empty s. + Proof. exact (Raw.choose_2 s). Qed. + + Lemma eq_refl : eq s s. + Proof. exact (Raw.eq_refl s). Qed. + Lemma eq_sym : eq s s' -> eq s' s. + Proof. exact (Raw.eq_sym s s'). Qed. + Lemma eq_trans : eq s s' -> eq s' s'' -> eq s s''. + Proof. exact (Raw.eq_trans s s' s''). Qed. - Definition lt_trans s s' s'' := lt_trans s s' s''. - Definition lt_not_eq s s' := lt_not_eq _ _ (is_bst s) (is_bst s'). + Lemma lt_trans : lt s s' -> lt s' s'' -> lt s s''. + Proof. exact (Raw.lt_trans s s' s''). Qed. + Lemma lt_not_eq : lt s s' -> ~eq s s'. + Proof. exact (Raw.lt_not_eq _ _ (is_bst s) (is_bst s')). Qed. End Specs. End IntMake. |