(* Proof of lem_reunion_couple                                             *)
unfold couple in |- *.
elim (axs_reunion (paire (singleton a) (paire a b)) v2); intros.
elim (axs_paire a b v2); intros.
unfold iff in |- *; split; intros.
elim H; clear H H0; intros; [ clear H3 | auto with zfc ].
elim H; clear H; intros.
apply H2; clear H1 H2; intros.
elim (axs_paire (singleton a) (paire a b) x); intros.
elim H1; clear H1 H2; intros; [ clear H | clear H | auto with zfc ].
left; generalize H0; rewrite H1; clear H1 H0; intros.
unfold singleton in H0.
elim (axs_paire a a v2); intros.
apply lem_or_contract; apply H; auto with zfc.
generalize H0; rewrite H1; clear H1 H0; intros.
elim (axs_paire a b v2); auto with zfc.
apply H0; clear H0 H; intros.
exists (paire a b); split; [ idtac | auto with zfc ].
clear H1 H2 H3; elim (axs_paire (singleton a) (paire a b) (paire a b));
auto with zfc.
Qed.
(* End of proof of lem_reunion_couple                                      *)
(* Definitions des projections par comprehension                           *)
Definition first (c : E) :=
subset
(fun x : E => exists a : E, (exists b : E, c = couple a b /\ In x a))
(reunion (reunion c)).
Definition second (c : E) :=
subset
(fun x : E => exists a : E, (exists b : E, c = couple a b /\ In x b))
(reunion (reunion c)).

(* Specifications: *)
Lemma lem_first_propertie : forall a b : E, first (couple a b) = a.
intros; apply axs_extensionnalite; intros; unfold iff in |- *; split; intros.