(****************************************************************************)
(*                                                                          *)
(*                         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 Classical_Type.

Hint Unfold not.

Section Ensembles_classical.
Variable U: Type.

Lemma not_included_empty_Inhabited: 
  (A: (Ensemble  U)) ~ (Included U A (Empty_set U)) -> (Inhabited U A).
Proof.
Intros A NI.
Elim (not_all_ex_not U [x:U]~(In U A x)).
Intros x H; Apply Inhabited_intro with x.
Apply NNPP; Auto.
Red; Intro.
Apply NI; Red.
Intros x H'; Elim (H x); Trivial.
Qed.
Hint not_included_empty_Inhabited.

Lemma not_empty_Inhabited: 
  (A: (Ensemble  U)) ~ A == (Empty_set U) -> (Inhabited U A).
Proof.
Intros; Apply not_included_empty_Inhabited.
Red; Auto.
Qed.

Lemma Inhabited_Setminus :
(X, Y: (Ensemble U)) (Included U X Y) -> ~ (Included U Y X) ->
       (Inhabited U (Setminus U Y X)).
Proof.
Intros X Y I NI. 
Elim (not_all_ex_not U [x:U](In U Y x)->(In U X x) NI).
Intros x YX.
Apply Inhabited_intro with x.
Apply Setminus_intro.
Apply not_imply_elim with (In U X x); Trivial.
Auto.
Qed.
Hint Inhabited_Setminus.

Lemma Strict_super_set_contains_new_element:
  (X, Y: (Ensemble U)) (Included U X Y) -> ~ X == Y ->
   (Inhabited U (Setminus U Y X)).
Proof.
Auto 7.
Qed.
Hint Strict_super_set_contains_new_element.

Lemma Subtract_intro:
  (A: (Ensemble U)) (x, y: U) (In U A y) -> ~ x == y ->
   (In U (Subtract U A x) y).
Proof.
Unfold 1 Subtract; Auto.
Qed.
Hint Subtract_intro.

Lemma Subtract_inv:
  (A: (Ensemble U)) (x, y: U) (In U (Subtract U A x) y) ->
   (In U A y) /\ ~ x == y.
Proof.
Intros A x y H'; Elim H'; Auto.
Qed.

Lemma Included_Strict_Included:
  (X, Y: (Ensemble U)) (Included U X Y) -> (Strict_Included U X Y) \/ X == Y.
Proof.
Intros X Y H'; Try Assumption.
Elim (classic X == Y); Auto.
Qed.

Lemma Strict_Included_inv:
  (X, Y: (Ensemble U)) (Strict_Included U X Y) ->
   (Included U X Y) /\ (Inhabited U (Setminus U Y X)).
Proof.
Intros X Y H'; Red in H'.
Split; [Tauto | Idtac].
Elim H'; Intros H'0 H'1; Try Exact H'1; Clear H'.
Apply Strict_super_set_contains_new_element; Auto.
Qed.

Lemma not_SIncl_empty: 
    (X: (Ensemble U)) ~ (Strict_Included U X (Empty_set U)).
Proof.
Intro X; Red; Intro H'; Try Exact H'.
LApply (Strict_Included_inv X (Empty_set U)); Auto.
Intro H'0; Elim H'0; Intros H'1 H'2; Elim H'2; Clear H'0.
Intros x H'0; Elim H'0.
Intro H'3; Elim H'3.
Qed.

Lemma Complement_Complement :
  (A: (Ensemble U)) (Complement U (Complement U A)) == A.
Proof.
Unfold Complement; Intros; Apply Extensionality_Ensembles; Auto.
Red; Split; Auto.
Red; Intros; Apply NNPP; Auto.
Qed.

End Ensembles_classical.

Hint Strict_super_set_contains_new_element.
Hint Subtract_intro.
Hint not_SIncl_empty.

(* $Id: Classical_sets.v,v 1.2 1996/09/26 14:03:16 jcfillia Exp $ *)
