(* surprinsingly, the predicative and impredicative definitions of the   *)
(* intersection do not seem equivalent.                                  *)
(* to be checked...                                                      *)



(* This is a step towards inaccessible cardinals                *)
(* We can define "small" sets, using the Type's hierarchy       *)
(* Since Coq does not support universe polymorphism, we need    *)
(* to duplicate some definitions here.                          *)



(* The small sets  *)

Inductive Ens' : Type :=
    sup' : forall A : Type, (A -> Ens') -> Ens'.(* surprinsingly, the predicative and impredicative definitions of the   *)
(* intersection do not seem equivalent.                                  *)
(* to be checked...                                                      *)



(* This is a step towards inaccessible cardinals                *)
(* We can define "small" sets, using the Type's hierarchy       *)
(* Since Coq does not support universe polymorphism, we need    *)
(* to duplicate some definitions here.                          *)



(* The small sets  *)

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.(* small sets can be injected into big sets             *)

Definition inj : Ens' -> Ens.

(* Specifications: *)
Theorem inj_sound : forall E1 E2 : Ens', EQ' E1 E2 -> EQ (inj E1) (inj E2).