(* The type representing sets  (Ensemble = french for set) *)

Inductive Ens : Type :=
    sup : forall A : Type, (A -> Ens) -> Ens.(* The type representing sets  (Ensemble = french for set) *)

Inductive Ens : Type :=
    sup : forall A : Type, (A -> Ens) -> Ens.(* Existential quantification *)

Inductive EXType (P : Type) (Q : P -> Prop) : Prop :=
    EXTypei : forall x : P, Q x -> EXType P Q.(* Existential quantification *)

Inductive EXType (P : Type) (Q : P -> Prop) : Prop :=
    EXTypei : forall x : P, Q x -> EXType P Q.(* Cartesian product in Type *)

Inductive prod_t (A B : Type) : Type :=
    pair_t : A -> B -> prod_t A B.(* Cartesian product in Type *)

Inductive prod_t (A B : Type) : Type :=
    pair_t : A -> B -> prod_t A B.(* Existential on the Type level *)

Inductive depprod (A : Type) (P : A -> Type) : Type :=
    dep_i : forall x : A, P x -> depprod A P.(* Existential on the Type level *)

Inductive depprod (A : Type) (P : A -> Type) : Type :=
    dep_i : forall x : A, P x -> depprod A P.(* Recursive Definition of the extentional equality on sets *)

Definition EQ : Ens -> Ens -> Prop.(* Membership on sets *)

Definition IN (E1 E2 : Ens) : Prop :=
  match E2 with
  | sup A f => EXType _ (fun y : A => EQ E1 (f y))
  end.(* INCLUSION *)

Definition INC : Ens -> Ens -> Prop.

(* Specifications: *)
Theorem EQ_refl : forall E : Ens, EQ E E.
Theorem EQ_tran : forall E1 E2 E3 : Ens, EQ E1 E2 -> EQ E2 E3 -> EQ E1 E3.
Theorem EQ_sym : forall E1 E2 : Ens, EQ E1 E2 -> EQ E2 E1.
Theorem EQ_INC : forall E E' : Ens, EQ E E' -> INC E E'.
Theorem INC_EQ : forall E E' : Ens, INC E E' -> INC E' E -> EQ E E'.
Theorem IN_sound_left : forall E E' E'' : Ens, EQ E E' -> IN E E'' -> IN E' E''.
Theorem IN_sound_right : forall E E' E'' : Ens, EQ E' E'' -> IN E E' -> IN E E''.
Theorem INC_refl : forall E : Ens, INC E E.
Theorem INC_tran : forall E E' E'' : Ens, INC E E' -> INC E' E'' -> INC E E''.
Theorem INC_sound_left : forall E E' E'' : Ens, EQ E E' -> INC E E'' -> INC E' E''.
Theorem INC_sound_right : forall E E' E'' : Ens, EQ E' E'' -> INC E E' -> INC E E''.
Theorem EQ_refl : forall E : Ens, EQ E E.
Theorem EQ_tran : forall E1 E2 E3 : Ens, EQ E1 E2 -> EQ E2 E3 -> EQ E1 E3.
Theorem EQ_sym : forall E1 E2 : Ens, EQ E1 E2 -> EQ E2 E1.
Theorem EQ_INC : forall E E' : Ens, EQ E E' -> INC E E'.
Theorem INC_EQ : forall E E' : Ens, INC E E' -> INC E' E -> EQ E E'.
Theorem IN_sound_left : forall E E' E'' : Ens, EQ E E' -> IN E E'' -> IN E' E''.
Theorem IN_sound_right : forall E E' E'' : Ens, EQ E' E'' -> IN E E' -> IN E E''.
Theorem INC_refl : forall E : Ens, INC E E.
Theorem INC_tran : forall E E' E'' : Ens, INC E E' -> INC E' E'' -> INC E E''.
Theorem INC_sound_left : forall E E' E'' : Ens, EQ E E' -> INC E E'' -> INC E' E''.
Theorem INC_sound_right : forall E E' E'' : Ens, EQ E' E'' -> INC E E' -> INC E E''.