(* Proof of lem_projQuotient_dom                                           *)
intros; apply axs_extensionnalite; unfold iff in |- *; split; intros.
unfold dom in H.
elim
(axs_comprehension
(fun v0 : E =>
fun_ (projQuotient r a rRel rEqv rD) ->
exists v1 : E, In (couple v0 v1) (projQuotient r a rRel rEqv rD))
(reunion (reunion (projQuotient r a rRel rEqv rD))) v2);
intros; generalize (H0 H); clear H H0 H1; intros.
elim H; clear H; intros.
generalize (H0 (lem_projQuotient_is_fun r a rRel rEqv rD)); clear H0; intros.
elim H0; clear H0; intros.
unfold projQuotient in H0.
elim
(axs_comprehension
(fun x0 : E =>
exists z : E,
(exists t : E, x0 = couple z t /\ t = equivClass r a rRel rEqv z))
(cartesien a (quotient r a rRel rEqv rD)) (couple v2 x));
intros; generalize (H1 H0); clear H0 H1 H2; intros.
elim H0; clear H0; intros.
clear H1;
elim (lem_cartesian_propertie a (quotient r a rRel rEqv rD) (couple v2 x));
intros; generalize (H1 H0); clear H0 H1 H2; intros.
elim H0; clear H0; intros; elim H0; clear H0; intros; elim H0; clear H0;
intros; elim H1; clear H1; intros.
elim (lem_couple_propertie v2 x0 x x1); intros; generalize (H3 H2);
clear H2 H3 H4; intros; elim H2; clear H2; intros.
rewrite H2; auto with zfc.
unfold dom in |- *.
elim
(axs_comprehension
(fun v0 : E =>
fun_ (projQuotient r a rRel rEqv rD) ->
exists v1 : E, In (couple v0 v1) (projQuotient r a rRel rEqv rD))
(reunion (reunion (projQuotient r a rRel rEqv rD))) v2);
intros; apply H1; clear H0 H1; intros.
split; intros.
elim (axs_reunion (reunion (projQuotient r a rRel rEqv rD)) v2); intros;
apply H1; clear H0 H1; intros.
exists (singleton v2); split; [ idtac | apply lem_x_in_sing_x ].
elim (axs_reunion (projQuotient r a rRel rEqv rD) (singleton v2)); intros;
apply H1; clear H0 H1; intros.
exists (couple v2 (equivClass r a rRel rEqv v2)); split;
[ idtac
| elim
(axs_paire (singleton v2) (paire v2 (equivClass r a rRel rEqv v2))
(singleton v2)); intros; apply H1; left; reflexivity ].
unfold projQuotient in |- *.
elim
(axs_comprehension
(fun x : E =>
exists z : E,
(exists t : E, x = couple z t /\ t = equivClass r a rRel rEqv z))
(cartesien a (quotient r a rRel rEqv rD))
(couple v2 (equivClass r a rRel rEqv v2))); intros;
apply H1; clear H0 H1; intros.
split;
[ idtac
| exists v2; exists (equivClass r a rRel rEqv v2); split; reflexivity ].
elim
(lem_cartesian_propertie a (quotient r a rRel rEqv rD)
(couple v2 (equivClass r a rRel rEqv v2))); intros;
apply H1; clear H0 H1; intros.
exists v2; exists (equivClass r a rRel rEqv v2); split;
[ auto with zfc | split; [ idtac | reflexivity ] ].
unfold quotient in |- *.
elim
(axs_comprehension
(fun x : E => exists y : E, In y a /\ x = equivClass r a rRel rEqv y)
(parties a) (equivClass r a rRel rEqv v2)); intros;
apply H1; clear H0 H1; intros.
split;
[ exact (lem_equivClass_in_parties_a r a rRel rEqv v2)
| exists v2; split; [ auto with zfc | reflexivity ] ].
exists (equivClass r a rRel rEqv v2); unfold projQuotient in |- *.
elim
(axs_comprehension
(fun x : E =>
exists z : E,
(exists t : E, x = couple z t /\ t = equivClass r a rRel rEqv z))
(cartesien a (quotient r a rRel rEqv rD))
(couple v2 (equivClass r a rRel rEqv v2))); intros;
apply H2; clear H1 H2; intros.
split;
[ idtac
| exists v2; exists (equivClass r a rRel rEqv v2); split; reflexivity ].
elim
(lem_cartesian_propertie a (quotient r a rRel rEqv rD)
(couple v2 (equivClass r a rRel rEqv v2))); intros;
apply H2; clear H1 H2; intros.
exists v2; exists (equivClass r a rRel rEqv v2); split;
[ auto with zfc | split; [ idtac | reflexivity ] ].
unfold quotient in |- *.
elim
(axs_comprehension
(fun x : E => exists y : E, In y a /\ x = equivClass r a rRel rEqv y)
(parties a) (equivClass r a rRel rEqv v2)); intros;
apply H2; clear H1 H2; intros.
split;
[ exact (lem_equivClass_in_parties_a r a rRel rEqv v2)
| exists v2; split; [ auto with zfc | reflexivity ] ].
Qed.
(* End of proof of lem_projQuotient_dom                                    *)

(* Specifications: *)
(***************************************************************************)
(* L'image de projQuotient est l'ensemble quotient                         *)
(***************************************************************************)
Lemma lem_projQuotient_img :
forall (r a : E) (rRel : rel_sig r a a) (rEqv : equivalence r a rRel)
(rD : rdom r a a rRel = a),
Img (projQuotient r a rRel rEqv rD) = quotient r a rRel rEqv rD.