(* Proof of lem_rel_inv_Img                                                *)
unfold rImg in |- *; unfold rdom in |- *; intros; apply axs_extensionnalite;
unfold iff in |- *; split; intros.
elim
(axs_comprehension
(fun y : E => exists x : E, In (couple x y) (rel_inverse r a b rRel)) a
v2); intros; generalize (H0 H); clear H H0 H1;
intros; elim H; clear H; intros; elim H0; clear H0;
unfold rel_inverse in |- *; intros.
elim
(axs_comprehension
(fun c : E =>
exists x0 : E, (exists y : E, In (couple x0 y) r /\ c = couple y x0))
(cartesien b a) (couple x 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.
elim H1; clear H1; intros.
elim (lem_couple_propertie x x1 v2 x0); intros; generalize (H3 H2);
clear H2 H3 H4; intros; elim H2; clear H2; intros;
generalize H1; rewrite <- H2; rewrite <- H3; clear H1 H2 H3;
clear x0 x1; intros.
elim (axs_comprehension (fun x : E => exists y : E, In (couple x y) r) a v2);
intros; apply H3; clear H2 H3; intros.
split; [ auto with zfc | exists x; auto with zfc ].
elim (axs_comprehension (fun x : E => exists y : E, In (couple x y) r) a v2);
intros; generalize (H0 H); clear H H0 H1; intros;
elim H; clear H; intros; elim H0; clear H0; intros.
generalize (rRel (couple v2 x) H0); intros.
elim (lem_cartesian_propertie a b (couple v2 x)); intros; generalize (H2 H1);
clear H2 H3; intros.
elim H2; clear H2; intros; elim H2; clear H2; intros; elim H2; clear H2;
intros; elim H3; clear H3; intros.
elim (lem_couple_propertie v2 x0 x x1); intros; generalize (H5 H4);
clear H4 H5 H6; intros; elim H4; clear H4; intros;
generalize H2 H3; rewrite <- H4; rewrite <- H5; clear H2 H3 H4 H5;
clear x0 x1; intros.
elim
(axs_comprehension
(fun y : E => exists x : E, In (couple x y) (rel_inverse r a b rRel)) a
v2); intros; apply H5; clear H4 H5; intros.
split; [ auto with zfc | exists x; unfold rel_inverse in |- * ].
elim
(axs_comprehension
(fun c : E =>
exists x0 : E, (exists y : E, In (couple x0 y) r /\ c = couple y x0))
(cartesien b a) (couple x v2)); intros; apply H5;
clear H4 H5; intros.
split;
[ elim (lem_cartesian_propertie b a (couple x v2)); intros; apply H5;
exists x; exists v2; split;
[ auto with zfc | split; [ auto with zfc | reflexivity ] ]
| exists v2; exists x; split; [ auto with zfc | reflexivity ] ].
Qed.
(* End of proof of lem_rel_inv_Img                                         *)
(***************************************************************************)
(* Produit de relations                                                    *)
(***************************************************************************)
Definition rel_prod (r1 r2 a : E) (rRel1 : rel_sig r1 a a)
(rRel2 : rel_sig r2 a a) :=
subset
(fun c : E =>
exists x : E,
(exists y : E,
(exists z : E,
In (couple x y) r1 /\ In (couple y z) r2 /\ c = couple x z)))
(cartesien a a).

(* Specifications: *)
Lemma lem_rel_prod_rel_sig :
forall (r1 r2 a : E) (rRel1 : rel_sig r1 a a) (rRel2 : rel_sig r2 a a),
rel_sig (rel_prod r1 r2 a rRel1 rRel2) a a.