(* We here need sigma types -- i.e. computational existentials *)

Inductive sig (A : Type) (P : A -> Prop) : Type :=
    exist : forall x : A, P x -> sig A P.(* We here need sigma types -- i.e. computational existentials *)

Inductive sig (A : Type) (P : A -> Prop) : Type :=
    exist : forall x : A, P x -> sig A P.(* The set obtained by the comprehension (or separation) axiom *)

Definition Comp : Ens -> (Ens -> Prop) -> Ens.

(* Specifications: *)
Theorem Comp_INC : forall (E : Ens) (P : Ens -> Prop), INC (Comp E P) E.
Theorem IN_Comp_P : forall (E A : Ens) (P : Ens -> Prop), (forall w1 w2 : Ens, P w1 -> EQ w1 w2 -> P w2) -> IN A (Comp E P) -> P A.
Theorem IN_P_Comp : forall (E A : Ens) (P : Ens -> Prop), (forall w1 w2 : Ens, P w1 -> EQ w1 w2 -> P w2) -> IN A E -> P A -> IN A (Comp E P).
Theorem Comp_INC : forall (E : Ens) (P : Ens -> Prop), INC (Comp E P) E.
Theorem IN_Comp_P : forall (E A : Ens) (P : Ens -> Prop), (forall w1 w2 : Ens, P w1 -> EQ w1 w2 -> P w2) -> IN A (Comp E P) -> P A.
Theorem IN_P_Comp : forall (E A : Ens) (P : Ens -> Prop), (forall w1 w2 : Ens, P w1 -> EQ w1 w2 -> P w2) -> IN A E -> P A -> IN A (Comp E P).