(* Proof of lem_projQuotient_img                                           *)
intros; apply axs_extensionnalite; unfold iff in |- *; split; intros.
unfold Img in H.
elim
(axs_comprehension
(fun v1 : E =>
fun_ (projQuotient r a rRel rEqv rD) ->
exists v0 : 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 x v2));
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 x v2));
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 x x0 v2 x1); intros; generalize (H3 H2);
clear H2 H3 H4; intros.
elim H2; clear H2; intros; generalize H1; rewrite H3; tauto.
generalize H; unfold quotient in |- *; intros.
elim
(axs_comprehension
(fun x : E => exists y : E, In y a /\ x = equivClass r a rRel rEqv y)
(parties a) v2); intros; generalize (H1 H0); clear H0 H1 H2;
intros.
elim H0; clear H0; intros; elim H1; clear H1; intros; elim H1; clear H1;
intros.
unfold Img in |- *.
elim
(axs_comprehension
(fun v1 : E =>
fun_ (projQuotient r a rRel rEqv rD) ->
exists v0 : E, In (couple v0 v1) (projQuotient r a rRel rEqv rD))
(reunion (reunion (projQuotient r a rRel rEqv rD))) v2);
intros; apply H4; clear H3 H4; intros.
split; intros.
elim (axs_reunion (reunion (projQuotient r a rRel rEqv rD)) v2); intros;
apply H4; clear H3 H4; intros.
exists (paire x v2); split;
[ idtac | elim (axs_paire x v2 v2); intros; apply H4; right; reflexivity ].
elim (axs_reunion (projQuotient r a rRel rEqv rD) (paire x v2)); intros;
apply H4; clear H3 H4; intros.
exists (couple x v2); split;
[ idtac
| elim (axs_paire (singleton x) (paire x v2) (paire x v2)); intros; apply H4;
right; reflexivity ].
unfold projQuotient in |- *.
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 x v2));
intros; apply H4; clear H3 H4; intros.
split;
[ idtac | exists x; exists v2; split; [ reflexivity | auto with zfc ] ].
elim (lem_cartesian_propertie a (quotient r a rRel rEqv rD) (couple x v2));
intros; apply H4; clear H3 H4; intros.
exists x; exists 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) v2); intros; apply H4; clear H3 H4;
intros.
split; [ auto with zfc | exists x; split; auto with zfc ].
exists x.
unfold projQuotient in |- *.
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 x v2));
intros; apply H5; clear H4 H5; intros.
split;
[ idtac | exists x; exists v2; split; [ reflexivity | auto with zfc ] ].
elim (lem_cartesian_propertie a (quotient r a rRel rEqv rD) (couple x v2));
intros; apply H5; clear H4 H5; intros.
exists x; exists 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) v2); intros; apply H5; clear H4 H5;
intros.
split; [ auto with zfc | exists x; split; auto with zfc ].
Qed.
(* End of proof of lem_projQuotient_img                                    *)

(***************************************************************************)
(* La projection sur l'ensemble quotient est une surjection                *)
(***************************************************************************)
Lemma lem_projQuotient_is_surj :
forall (r a : E) (rRel : rel_sig r a a) (rEqv : equivalence r a rRel)
(rD : rdom r a a rRel = a),
fun_surj (projQuotient r a rRel rEqv rD) a (quotient r a rRel rEqv rD).