Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
Require Import Ensembles Finite_sets. Require Import FSetInterface FSetProperties OrderedTypeEx DecidableTypeEx.
Module WS_to_Finite_set (U:UsualDecidableType)(M: WSfun U). Module MP:= WProperties_fun U M. Import M MP FM Ensembles Finite_sets. Definition mkEns : M.t -> Ensemble M.elt := fun s x => M.In x s. Notation " !! " := mkEns.forall (s : t) (x : elt), M.In x s <-> In elt (!! s) xunfold In; compute; auto with extcore. Qed.forall (s : t) (x : elt), M.In x s <-> In elt (!! s) xforall s s' : t, s [<=] s' <-> Included elt (!! s) (!! s')unfold Subset, Included, In, mkEns; intuition. Qed. Notation " a === b " := (Same_set M.elt a b) (at level 70, no associativity).forall s s' : t, s [<=] s' <-> Included elt (!! s) (!! s')forall s s' : t, s [=] s' <-> !! s === !! s'forall s s' : t, s [=] s' <-> !! s === !! s's, s':ts [=] s' <-> !! s === !! s'unfold Subset, Included, Same_set, In, mkEns; intuition. Qed.s, s':ts [<=] s' /\ s' [<=] s <-> !! s === !! s'!! empty === Empty_set elt!! empty === Empty_set eltsplit; intro; set_iff; inversion 1. Qed.(forall x : elt, M.In x empty -> Empty_set elt x) /\ (forall x : elt, Empty_set elt x -> M.In x empty)forall s : t, Empty s -> !! s === Empty_set eltforall s : t, Empty s -> !! s === Empty_set eltforall s : t, Empty s -> (forall x : elt, M.In x s -> Empty_set elt x) /\ (forall x : elt, Empty_set elt x -> M.In x s)s:tH:Empty sx:eltH0:M.In x sEmpty_set elt xs:tH:Empty sx:eltH0:Empty_set elt xM.In x sinversion H0. Qed.s:tH:Empty sx:eltH0:Empty_set elt xM.In x sforall x : elt, !! (singleton x) === Singleton elt xforall x : elt, !! (singleton x) === Singleton elt xsplit; intro; set_iff; inversion 1; try constructor; auto. Qed.forall x : elt, (forall x0 : elt, M.In x0 (singleton x) -> Singleton elt x x0) /\ (forall x0 : elt, Singleton elt x x0 -> M.In x0 (singleton x))forall s s' : t, !! (union s s') === Union elt (!! s) (!! s')forall s s' : t, !! (union s s') === Union elt (!! s) (!! s')split; intro; set_iff; inversion 1; [ constructor 1 | constructor 2 | | ]; auto. Qed.forall s s' : t, (forall x : elt, M.In x (union s s') -> Union elt (fun x0 : elt => M.In x0 s) (fun x0 : elt => M.In x0 s') x) /\ (forall x : elt, Union elt (fun x0 : elt => M.In x0 s) (fun x0 : elt => M.In x0 s') x -> M.In x (union s s'))forall s s' : t, !! (inter s s') === Intersection elt (!! s) (!! s')forall s s' : t, !! (inter s s') === Intersection elt (!! s) (!! s')split; intro; set_iff; inversion 1; try constructor; auto. Qed.forall s s' : t, (forall x : elt, M.In x (inter s s') -> Intersection elt (fun x0 : elt => M.In x0 s) (fun x0 : elt => M.In x0 s') x) /\ (forall x : elt, Intersection elt (fun x0 : elt => M.In x0 s) (fun x0 : elt => M.In x0 s') x -> M.In x (inter s s'))forall (x : elt) (s : t), !! (add x s) === Add elt (!! s) xforall (x : elt) (s : t), !! (add x s) === Add elt (!! s) xforall (x : elt) (s : t), (forall x0 : elt, M.In x0 (add x s) -> Add elt (fun x1 : elt => M.In x1 s) x x0) /\ (forall x0 : elt, Add elt (fun x1 : elt => M.In x1 s) x x0 -> M.In x0 (add x s))x:elts:tx0:eltH:x = x0 \/ M.In x0 sH0:x = x0Add elt (fun x1 : elt => M.In x1 s) x x0x:elts:tx0:eltH:x = x0 \/ M.In x0 sH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0x:elts:tx0:eltH:x = x0 \/ M.In x0 sH0, H1:x = x0Add elt (fun x1 : elt => M.In x1 s) x0 x0x:elts:tx0:eltH:x = x0 \/ M.In x0 sH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0constructor 1; auto. Qed.x:elts:tx0:eltH:x = x0 \/ M.In x0 sH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0forall (x : U.t) (s s' : t), MP.Add x s s' -> !! s' === Add elt (!! s) xforall (x : U.t) (s s' : t), MP.Add x s s' -> !! s' === Add elt (!! s) xforall (x : U.t) (s s' : t), MP.Add x s s' -> (forall x0 : elt, M.In x0 s' -> Add elt (fun x1 : elt => M.In x1 s) x x0) /\ (forall x0 : elt, Add elt (fun x1 : elt => M.In x1 s) x x0 -> M.In x0 s')x:U.ts, s':tH:MP.Add x s s'x0:eltH0:M.In x0 s'Add elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:x = x0 \/ M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:x = x0Add elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0, H1:x = x0Add elt (fun x1 : elt => M.In x1 s) x0 x0x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:M.In x0 sAdd elt (fun x1 : elt => M.In x1 s) x x0x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:MP.Add x s s'x0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0M.In x0 s'x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:Add elt (fun x1 : elt => M.In x1 s) x x0x = x0 \/ M.In x0 sinversion H1; auto. Qed.x:U.ts, s':tH:forall y : elt, M.In y s' <-> x = y \/ M.In y sx0:eltH0:Add elt (fun x2 : elt => M.In x2 s) x x0x1:eltH1:In elt (Singleton elt x) x0H2:x1 = x0x = x0 \/ M.In x0 sforall (x : elt) (s : t), !! (remove x s) === Subtract elt (!! s) xforall (x : elt) (s : t), !! (remove x s) === Subtract elt (!! s) xforall (x : elt) (s : t), (forall x0 : elt, M.In x0 (remove x s) -> Subtract elt (fun x1 : elt => M.In x1 s) x x0) /\ (forall x0 : elt, Subtract elt (fun x1 : elt => M.In x1 s) x x0 -> M.In x0 (remove x s))x:elts:tx0:eltH:M.In x0 s /\ x <> x0H0:M.In x0 sH1:x <> x0Subtract elt (fun x1 : elt => M.In x1 s) x x0x:elts:tx0:eltH:M.In x0 s /\ x <> x0H0:M.In x0 sH1:x <> x0~ In elt (Singleton elt x) x0inversion H1; auto. Qed.x:elts:tx0:eltH:M.In x0 s /\ x <> x0H0:M.In x0 sH1:In elt (Singleton elt x) x0x = x0forall s : t, Finite elt (!! s)forall s : t, Finite elt (!! s)s:tH:Empty sFinite elt (!! s)s, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Finite elt (!! s')s:tH:Empty sEmpty_set elt = !! ss, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Finite elt (!! s')s:tH:Empty s!! s === Empty_set elts, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Finite elt (!! s')s, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Finite elt (!! s')s, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Finite elt (Add elt (!! s) x)s, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Add elt (!! s) x = !! s's, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'Add elt (!! s) x = !! s'apply Add_Add; auto. Qed.s, s':tH:Finite elt (!! s)x:eltH0:~ M.In x sH1:MP.Add x s s'!! s' === Add elt (!! s) xforall s : t, cardinal elt (!! s) (M.cardinal s)forall s : t, cardinal elt (!! s) (M.cardinal s)s:tH:Empty scardinal elt (!! s) (M.cardinal s)s, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (!! s') (M.cardinal s')s:tH:Empty scardinal elt (Empty_set elt) (M.cardinal s)s:tH:Empty sEmpty_set elt = !! ss, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (!! s') (M.cardinal s')s:tH:Empty sEmpty_set elt = !! ss, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (!! s') (M.cardinal s')s:tH:Empty s!! s === Empty_set elts, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (!! s') (M.cardinal s')s, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (!! s') (M.cardinal s')s, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'cardinal elt (Add elt (!! s) x) (M.cardinal s')s, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'Add elt (!! s) x = !! s's, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'Add elt (!! s) x = !! s'apply Add_Add; auto. Qed.s, s':tH:cardinal elt (!! s) (M.cardinal s)x:eltH0:~ M.In x sH1:MP.Add x s s'!! s' === Add elt (!! s) x
we can even build a function from Finite Ensemble to FSet
... at least in Prop.
forall e : Ensemble elt, Finite elt e -> exists s : t, !! s === eforall e : Ensemble elt, Finite elt e -> exists s : t, !! s === eexists s : t, !! s === Empty_set eltA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xIHFinite:exists s : t, !! s === Aexists s : t, !! s === Add elt A x!! empty === Empty_set eltA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xIHFinite:exists s : t, !! s === Aexists s : t, !! s === Add elt A xA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xIHFinite:exists s : t, !! s === Aexists s : t, !! s === Add elt A xA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xs:tHs:!! s === Aexists s0 : t, !! s0 === Add elt A xA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xs:tHs:!! s === A!! (add x s) === Add elt A xA:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xs:tHs:!! s = A!! (add x s) === Add elt A xapply add_Add. Qed. End WS_to_Finite_set. Module S_to_Finite_set (U:UsualOrderedType)(M: Sfun U) := WS_to_Finite_set U M.A:Ensemble eltH:Finite elt Ax:eltH0:~ In elt A xs:tHs:!! s = A!! (add x s) === Add elt (!! s) x