(* Proof of lem_projQuotient_equiv_fun                                     *)
intros; apply axs_extensionnalite; unfold iff in |- *; split; intros.
unfold equiv_fun in H.
elim
(axs_comprehension
(fun x : E =>
exists a0 : E,
(exists b : E,
x = couple a0 b /\
App (projQuotient r a rRel rEqv rD)
(lem_projQuotient_is_fun r a rRel rEqv rD) a0 =
App (projQuotient r a rRel rEqv rD)
(lem_projQuotient_is_fun r a rRel rEqv rD) b))
(cartesien (dom (projQuotient r a rRel rEqv rD))
(dom (projQuotient r a rRel rEqv rD))) v2);
intros; generalize (H0 H); clear H H0 H1; intros.
elim H; clear H; rewrite (lem_projQuotient_dom r a rRel rEqv rD); intros.
elim H0; clear H0; intros; elim H0; clear H0; intros; elim H0; clear H0;
intros.
generalize H; rewrite H0; clear H H0; intros.
elim (lem_cartesian_propertie a a (couple x x0)); intros; generalize (H0 H);
clear H H0 H2; intros.
elim H; clear H; intros; elim H; clear H; intros; elim H; clear H; intros;
elim H0; clear H0; intros.
elim (lem_couple_propertie x x1 x0 x2); intros; generalize (H3 H2);
clear H2 H3 H4; intros.
elim H2; clear H2; intros.
generalize H H0; rewrite <- H2; rewrite <- H3; clear H H0 H2 H3; intros.
generalize H1; rewrite (lem_projQuotient_eval r a rRel rEqv rD x H);
rewrite (lem_projQuotient_eval r a rRel rEqv rD x0 H0);
clear H1; intros.
generalize (lem_x_in_equivClass_x r a rRel rEqv rD x0 H0); intros.
generalize H2; rewrite <- H1; clear H1 H2; intros.
unfold equivClass in H2.
elim (axs_comprehension (fun y : E => In (couple x y) r) a x0); intros;
generalize (H1 H2); clear H1 H2 H3; intros.
elim H1; clear H1; intros; auto with zfc.
unfold equiv_fun in |- *.
elim
(axs_comprehension
(fun x : E =>
exists a0 : E,
(exists b : E,
x = couple a0 b /\
App (projQuotient r a rRel rEqv rD)
(lem_projQuotient_is_fun r a rRel rEqv rD) a0 =
App (projQuotient r a rRel rEqv rD)
(lem_projQuotient_is_fun r a rRel rEqv rD) b))
(cartesien (dom (projQuotient r a rRel rEqv rD))
(dom (projQuotient r a rRel rEqv rD))) v2);
intros; apply H1; clear H0 H1; intros.
elim rEqv; intros.
elim H1; clear H1; intros.
split.
rewrite (lem_projQuotient_dom r a rRel rEqv rD).
unfold rel_sig in rRel; unfold inc in rRel.
exact (rRel v2 H).
generalize rRel; intros.
unfold rel_sig in rRel0; unfold inc in rRel0.
generalize (rRel v2 H); intros.
elim (lem_cartesian_propertie a a v2); intros; generalize (H4 H3);
clear H3 H4 H5; intros.
elim H3; clear H3; intros; elim H3; clear H3; intros; elim H3; clear H3;
intros; elim H4; clear H4; intros.
exists x; exists x0; split; [ auto with zfc | idtac ].
rewrite (lem_projQuotient_eval r a rRel0 rEqv rD x H3).
rewrite (lem_projQuotient_eval r a rRel0 rEqv rD x0 H4).
generalize H; rewrite H5; intros.
exact (lem_equivClass_eq r a rRel rEqv x x0 H6).
Qed.
(* End of proof of lem_projQuotient_equiv_fun                              *)

(* Specifications: *)
(***************************************************************************)
(* D'ou la signature de projQuotient                                       *)
(***************************************************************************)
Lemma lem_projQuotient_sig :
forall (r a : E) (rRel : rel_sig r a a) (rEqv : equivalence r a rRel)
(rD : rdom r a a rRel = a),
fun_sig (projQuotient r a rRel rEqv rD) a (quotient r a rRel rEqv rD).