(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \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)         *)
(************************************************************************)
(****************************************************************************)
(*                                                                          *)
(*                         Naive Set Theory in Coq                          *)
(*                                                                          *)
(*                     INRIA                        INRIA                   *)
(*              Rocquencourt                        Sophia-Antipolis        *)
(*                                                                          *)
(*                                 Coq V6.1                                 *)
(*									    *)
(*			         Gilles Kahn 				    *)
(*				 Gerard Huet				    *)
(*									    *)
(*									    *)
(*                                                                          *)
(* Acknowledgments: This work was started in July 1993 by F. Prost. Thanks  *)
(* to the Newton Institute for providing an exceptional work environment    *)
(* in Summer 1995. Several developments by E. Ledinot were an inspiration.  *)
(****************************************************************************)
Require Export Ensembles.
Require Export Constructive_sets.
Require Export Relations_1.
Require Export Relations_1_facts.
Require Export Partial_Order.
Require Export Cpo.
Require Export Powerset.
Local Ltac Tauto.intuition_solver ::= auto with sets.
Section Sets_as_an_algebra.
Variable U : Type.

(* Specifications: *)
Theorem Empty_set_zero : forall X:Ensemble U, Union U (Empty_set U) X = X.
Theorem Empty_set_zero_right : forall X:Ensemble U, Union U X (Empty_set U) = X.
Theorem Empty_set_zero' : forall x:U, Add U (Empty_set U) x = Singleton U x.
Lemma less_than_empty :
forall X:Ensemble U, Included U X (Empty_set U) -> X = Empty_set U.
Theorem Union_commutative : forall A B:Ensemble U, Union U A B = Union U B A.
Theorem Union_associative :
forall A B C:Ensemble U, Union U (Union U A B) C = Union U A (Union U B C).
Theorem Union_idempotent : forall A:Ensemble U, Union U A A = A.
Lemma Union_absorbs :
forall A B:Ensemble U, Included U B A -> Union U A B = A.
Theorem Couple_as_union :
forall x y:U, Union U (Singleton U x) (Singleton U y) = Couple U x y.
Theorem Triple_as_union :
forall x y z:U,
Union U (Union U (Singleton U x) (Singleton U y)) (Singleton U z) =
Triple U x y z.
Theorem Triple_as_Couple : forall x y:U, Couple U x y = Triple U x x y.
Theorem Triple_as_Couple_Singleton :
forall x y z:U, Triple U x y z = Union U (Couple U x y) (Singleton U z).
Theorem Intersection_commutative :
forall A B:Ensemble U, Intersection U A B = Intersection U B A.
Theorem Distributivity :
forall A B C:Ensemble U,
Intersection U A (Union U B C) =
Union U (Intersection U A B) (Intersection U A C).
Lemma Distributivity_l
: forall (A B C : Ensemble U),
Intersection U (Union U A B) C =
Union U (Intersection U A C) (Intersection U B C).
Theorem Distributivity' :
forall A B C:Ensemble U,
Union U A (Intersection U B C) =
Intersection U (Union U A B) (Union U A C).
Theorem Union_add :
forall (A B:Ensemble U) (x:U), Add U (Union U A B) x = Union U A (Add U B x).
Theorem Non_disjoint_union :
forall (X:Ensemble U) (x:U), In U X x -> Add U X x = X.
Theorem Non_disjoint_union' :
forall (X:Ensemble U) (x:U), ~ In U X x -> Subtract U X x = X.
Lemma singlx : forall x y:U, In U (Add U (Empty_set U) x) y -> x = y.
Lemma incl_add :
forall (A B:Ensemble U) (x:U),
Included U A B -> Included U (Add U A x) (Add U B x).
Lemma incl_add_x :
forall (A B:Ensemble U) (x:U),
~ In U A x -> Included U (Add U A x) (Add U B x) -> Included U A B.
Lemma Add_commutative :
forall (A:Ensemble U) (x y:U), Add U (Add U A x) y = Add U (Add U A y) x.
Lemma Add_commutative' :
forall (A:Ensemble U) (x y z:U),
Add U (Add U (Add U A x) y) z = Add U (Add U (Add U A z) x) y.
Lemma Add_distributes :
forall (A B:Ensemble U) (x y:U),
Included U B A -> Add U (Add U A x) y = Union U (Add U A x) (Add U B y).
Lemma setcover_intro :
forall (U:Type) (A x y:Ensemble U),
Strict_Included U x y ->
~ (exists z : _, Strict_Included U x z /\ Strict_Included U z y) ->
covers (Ensemble U) (Power_set_PO U A) y x.
Lemma Disjoint_Intersection:
forall A s1 s2, Disjoint A s1 s2 -> Intersection A s1 s2 = Empty_set A.
Lemma Intersection_Empty_set_l:
forall A s, Intersection A (Empty_set A) s = Empty_set A.
Lemma Intersection_Empty_set_r:
forall A s, Intersection A s (Empty_set A) = Empty_set A.
Lemma Seminus_Empty_set_l:
forall A s, Setminus A (Empty_set A) s = Empty_set A.
Lemma Seminus_Empty_set_r:
forall A s, Setminus A s (Empty_set A) = s.
Lemma Setminus_Union_l:
forall A s1 s2 s3,
Setminus A (Union A s1 s2) s3 = Union A (Setminus A s1 s3)  (Setminus A s2 s3).
Lemma Setminus_Union_r:
forall A s1 s2 s3,
Setminus A s1 (Union A s2 s3) = Setminus A (Setminus A s1 s2) s3.
Lemma Setminus_Disjoint_noop:
forall A s1 s2,
Intersection A s1 s2 = Empty_set A -> Setminus A s1 s2 = s1.
Lemma Setminus_Included_empty:
forall A s1 s2,
Included A s1 s2 -> Setminus A s1 s2 = Empty_set A.