diff options
Diffstat (limited to 'theories')
| -rw-r--r-- | theories/FSets/FSetAVL.v | 46 | ||||
| -rw-r--r-- | theories/FSets/FSetBridge.v | 80 | ||||
| -rw-r--r-- | theories/FSets/FSetInterface.v | 17 | ||||
| -rw-r--r-- | theories/FSets/FSetList.v | 38 |
4 files changed, 174 insertions, 7 deletions
diff --git a/theories/FSets/FSetAVL.v b/theories/FSets/FSetAVL.v index bbb29158df..8bd51abec3 100644 --- a/theories/FSets/FSetAVL.v +++ b/theories/FSets/FSetAVL.v @@ -2542,6 +2542,38 @@ Proof. apply subset'_2; auto. Qed. +Lemma choose_equal: forall s s', bst s -> avl s -> bst s' -> avl s' -> + (equal' s s')=true -> + match choose s, choose s' with + | Some x, Some x' => X.eq x x' + | None, None => True + | _, _ => False + end. +Proof. + unfold choose; intros s s' Hb Ha Hb' Ha' H. + generalize (equal'_2 s s' Hb Ha Hb' Ha' H); clear H; intros. + generalize (@min_elt_1 s) (@min_elt_2 s) (@min_elt_3 s). + generalize (@min_elt_1 s') (@min_elt_2 s') (@min_elt_3 s'). + destruct (min_elt s) as [x|]; destruct (min_elt s') as [x'|]; auto. + + intros H1 H2 _ H1' H2' _. + destruct (X.compare x x'); auto. + assert (In x s) by auto. + rewrite (H x) in H0. + destruct (H2 x' x); auto. + assert (In x' s') by auto. + rewrite <- (H x') in H0. + destruct (H2' x x'); auto. + + intros _ _ H3 H1' _ _. + destruct (H3 (refl_equal _) x). + rewrite <- (H x); auto. + + intros H1 _ _ _ _ H3'. + destruct (H3' (refl_equal _) x'). + rewrite (H x'); auto. +Qed. + End Raw. (** * Encapsulation @@ -2877,6 +2909,20 @@ Module IntMake (I:Int)(X: OrderedType) <: S with Module E := X. Lemma choose_2 : choose s = None -> Empty s. Proof. exact (Raw.choose_2 s). Qed. + Lemma choose_equal: (equal s s')=true -> + match choose s, choose s' with + | Some x, Some x' => E.eq x x' + | None, None => True + | _, _ => False + end. + Proof. + intros. + unfold choose. + apply Raw.choose_equal; auto. + apply Raw.equal'_1; auto. + exact (equal_2 H). + Qed. + Lemma eq_refl : eq s s. Proof. exact (Raw.eq_refl s). Qed. Lemma eq_sym : eq s s' -> eq s' s. diff --git a/theories/FSets/FSetBridge.v b/theories/FSets/FSetBridge.v index 9ac7b9c7cb..f517898e14 100644 --- a/theories/FSets/FSetBridge.v +++ b/theories/FSets/FSetBridge.v @@ -247,14 +247,71 @@ Module DepOfNodep (M: S) <: Sdep with Module E := M.E. eapply (filter_1 (s:=s) (x:=x) H3); elim (H x); intros B _; apply B; auto. Qed. + Definition choose_aux: forall s : t, + { x : elt | M.choose s = Some x } + { M.choose s = None }. + Proof. + intros. + destruct (M.choose s); [left | right]; auto. + exists e; auto. + Qed. + Definition choose : forall s : t, {x : elt | In x s} + {Empty s}. - Proof. - intros. - generalize (choose_1 (s:=s)) (choose_2 (s:=s)). - case (choose s); [ left | right ]; auto. - exists e; auto. + Proof. + intros; destruct (choose_aux s) as [(x,Hx)|H]. + left; exists x; apply choose_1; auto. + right; apply choose_2; auto. + Defined. + + Lemma choose_ok1 : + forall s x, M.choose s = Some x <-> exists H:In x s, + choose s = inleft _ (exist (fun x => In x s) x H). + Proof. + intros s x. + unfold choose; split; intros. + destruct (choose_aux s) as [(y,Hy)|H']; try congruence. + replace x with y in * by congruence. + exists (choose_1 Hy); auto. + destruct H. + destruct (choose_aux s) as [(y,Hy)|H']; congruence. + Qed. + + Lemma choose_ok2 : + forall s, M.choose s = None <-> exists H:Empty s, + choose s = inright _ H. + Proof. + intros s. + unfold choose; split; intros. + destruct (choose_aux s) as [(y,Hy)|H']; try congruence. + exists (choose_2 H'); auto. + destruct H. + destruct (choose_aux s) as [(y,Hy)|H']; congruence. Qed. + Lemma choose_equal : forall s s', Equal s s' -> + match choose s, choose s' with + | inleft (exist x _), inleft (exist x' _) => E.eq x x' + | inright _, inright _ => True + | _, _ => False + end. + Proof. + intros. + generalize (M.choose_equal (M.equal_1 H)); clear H; intros Heq. + generalize (choose_ok1 s) (choose_ok2 s) (choose_ok1 s') (choose_ok2 s'). + destruct (choose s) as [(x,Hx)|Hx]; destruct (choose s') as [(x',Hx')|Hx']; auto. + + intros H _ H' _; generalize (H x) (H' x'); clear H H'; intros H H'. + destruct H as (_,H); rewrite H in Heq; simpl in Heq; [|exists Hx]; auto. + destruct H' as (_,H'); rewrite H' in Heq; simpl in Heq; [|exists Hx']; auto. + + intros H _ _ H'; generalize (H x); clear H; intros H. + destruct H as (_,H); rewrite H in Heq; simpl in Heq; [|exists Hx]; auto. + destruct H' as (_,H'); rewrite H' in Heq; simpl in Heq;[|exists Hx']; auto. + + intros _ H H' _; generalize (H' x'); clear H'; intros H'. + destruct H as (_,H); rewrite H in Heq; simpl in Heq; [|exists Hx]; auto. + destruct H' as (_,H'); rewrite H' in Heq; simpl in Heq; [|exists Hx']; auto. + Qed. + Definition min_elt : forall s : t, {x : elt | In x s /\ For_all (fun y => ~ E.lt y x) s} + {Empty s}. @@ -391,6 +448,19 @@ Module NodepOfDep (M: Sdep) <: S with Module E := M.E. intro s; unfold choose in |- *; case (M.choose s); auto. simple destruct s0; intros; discriminate H. Qed. + + Lemma choose_equal: forall s s', (equal s s')=true -> + match choose s, choose s' with + | Some x, Some x' => E.eq x x' + | None, None => True + | _, _ => False + end. + Proof. + unfold choose; intros. + generalize (M.choose_equal (equal_2 H)); clear H. + destruct (M.choose s) as [(x,Hx)|Hx]; destruct (M.choose s') as [(x',Hx')|Hx']; + simpl; auto. + Qed. Definition elements (s : t) : list elt := let (l, _) := elements s in l. diff --git a/theories/FSets/FSetInterface.v b/theories/FSets/FSetInterface.v index 9d5f2ad76f..50e6fb5395 100644 --- a/theories/FSets/FSetInterface.v +++ b/theories/FSets/FSetInterface.v @@ -274,8 +274,12 @@ Module Type S. (** Specification of [choose] *) Parameter choose_1 : choose s = Some x -> In x s. Parameter choose_2 : choose s = None -> Empty s. -(* Parameter choose_equal: - (equal s s')=true -> E.eq (choose s) (choose s'). *) + Parameter choose_equal: (equal s s')=true -> + match choose s, choose s' with + | Some x, Some x' => E.eq x x' + | None, None => True + | _, _ => False + end. End Spec. @@ -418,4 +422,13 @@ Module Type Sdep. Parameter choose : forall s : t, {x : elt | In x s} + {Empty s}. + (** The [choose_equal] specification of [S] cannot be packed + in the dependent version of [choose], so we leave it separate. *) + Parameter choose_equal : forall s s', Equal s s' -> + match choose s, choose s' with + | inleft (exist x _), inleft (exist x' _) => E.eq x x' + | inright _, inright _ => True + | _, _ => False + end. + End Sdep. diff --git a/theories/FSets/FSetList.v b/theories/FSets/FSetList.v index 51771fc41c..a9f81008d2 100644 --- a/theories/FSets/FSetList.v +++ b/theories/FSets/FSetList.v @@ -718,6 +718,37 @@ Module Raw (X: OrderedType). Definition choose_2 : forall s : t, choose s = None -> Empty s := min_elt_3. + Lemma choose_equal: forall s s', Sort s -> Sort s' -> (equal s s')=true -> + match choose s, choose s' with + | Some x, Some x' => X.eq x x' + | None, None => True + | _, _ => False + end. + Proof. + unfold choose; intros s s' Hs Hs' H. + generalize (equal_2 H); clear H; intros. + generalize (@min_elt_1 s) (@min_elt_2 _ Hs) (@min_elt_3 s). + generalize (@min_elt_1 s') (@min_elt_2 _ Hs') (@min_elt_3 s'). + destruct (min_elt s) as [x|]; destruct (min_elt s') as [x'|]; auto. + + intros H1 H2 _ H1' H2' _. + destruct (X.compare x x'); auto. + assert (In x s) by auto. + rewrite (H x) in H0. + destruct (H2 x' x); auto. + assert (In x' s') by auto. + rewrite <- (H x') in H0. + destruct (H2' x x'); auto. + + intros _ _ H3 H1' _ _. + destruct (H3 (refl_equal _) x). + rewrite <- (H x); auto. + + intros H1 _ _ _ _ H3'. + destruct (H3' (refl_equal _) x'). + rewrite (H x'); auto. + Qed. + Lemma fold_1 : forall (s : t) (Hs : Sort s) (A : Set) (i : A) (f : elt -> A -> A), fold f s i = fold_left (fun a e => f e a) (elements s) i. @@ -1221,6 +1252,13 @@ Module Make (X: OrderedType) <: S with Module E := X. Proof. exact (fun H => Raw.choose_1 H). Qed. Lemma choose_2 : choose s = None -> Empty s. Proof. exact (fun H => Raw.choose_2 H). Qed. + Lemma choose_equal : (equal s s')=true -> + match choose s, choose s' with + | Some x, Some x' => E.eq x x' + | None, None => True + | _, _ => False + end. + Proof. exact (Raw.choose_equal s.(sorted) s'.(sorted)). Qed. Lemma eq_refl : eq s s. Proof. exact (Raw.eq_refl s). Qed. |
