(* Proof of lem_fun_recip_is_bij_under_bij                                 *)
intros.
generalize (lem_bij_is_inj f (dom f) (Img f) H); intros.
elim (lem_fun_recip_is_fun_under_inj f Af); intros; generalize (H1 H0);
clear H0 H1 H2; intros.
unfold fun_bij in H.
elim H; clear H; intros; clear H; elim H1; clear H1; intros; clear H; elim H1;
clear H1; intros; clear H.
unfold fun_bij in |- *.
split; [ auto with zfc | split ].
apply axs_extensionnalite; unfold iff in |- *; split; intros.
unfold dom in H.
elim
(axs_comprehension
(fun v0 : E =>
fun_ (fun_recip f Af) ->
exists v1 : E, In (couple v0 v1) (fun_recip f Af))
(reunion (reunion (fun_recip f Af))) v2); intros;
generalize (H2 H); clear H H2 H3; intros.
elim H; clear H; intros; generalize (H2 H0); clear H2; intros; elim H2;
clear H2; intros.
unfold fun_recip in H2.
elim
(axs_comprehension
(fun c : E =>
exists x0 : E, (exists y : E, In (couple x0 y) f /\ c = couple y x0))
(cartesien (Img f) (dom f)) (couple v2 x)); intros;
generalize (H3 H2); clear H2 H3 H4; intros.
elim H2; clear H2; intros.
elim (lem_cartesian_propertie (Img f) (dom f) (couple v2 x)); intros;
generalize (H4 H2); clear H2 H4 H5; intros.
elim H2; clear H2; intros; elim H2; clear H2; intros; elim H2; clear H2;
intros; elim H4; clear H4; intros.
elim (lem_couple_propertie v2 x0 x x1); intros; generalize (H6 H5);
clear H5 H6 H7; intros.
elim H5; clear H5; intros.
rewrite H5; auto with zfc.
generalize (H1 v2 H); intros.
unfold exUniq in H2.
elim H2; clear H2; intros; elim H2; clear H2; intros.
generalize (lem_xyinf_yxinrecipf f Af x v2 H2); intros.
exact (lem_fun_and_dom (fun_recip f Af) v2 x H0 H4).
split.
apply axs_extensionnalite; unfold iff in |- *; split; intros.
unfold Img in H.
elim
(axs_comprehension
(fun v1 : E =>
fun_ (fun_recip f Af) ->
exists v0 : E, In (couple v0 v1) (fun_recip f Af))
(reunion (reunion (fun_recip f Af))) v2); intros;
generalize (H2 H); clear H H2 H3; intros.
elim H; clear H; intros; generalize (H2 H0); clear H2; intros; elim H2;
clear H2; intros.
unfold fun_recip in H2.
elim
(axs_comprehension
(fun c : E =>
exists x0 : E, (exists y : E, In (couple x0 y) f /\ c = couple y x0))
(cartesien (Img f) (dom f)) (couple x v2)); intros;
generalize (H3 H2); clear H2 H3 H4; intros.
elim H2; clear H2; intros.
elim (lem_cartesian_propertie (Img f) (dom f) (couple x v2)); intros;
generalize (H4 H2); clear H2 H4 H5; intros.
elim H2; clear H2; intros; elim H2; clear H2; intros; elim H2; clear H2;
intros; elim H4; clear H4; intros.
elim (lem_couple_propertie x x0 v2 x1); intros; generalize (H6 H5);
clear H5 H6 H7; intros.
elim H5; clear H5; intros; rewrite H6; auto with zfc.
generalize (lem_App f v2 Af H); intros.
elim H2; clear H2; intros; elim H2; clear H2; intros.
generalize (lem_xyinf_yxinrecipf f Af v2 x H3); intros.
exact (lem_fun_and_img (fun_recip f Af) x v2 H0 H4).
intros.
unfold exUniq in |- *; intros.
unfold Img in H.
elim
(axs_comprehension
(fun v1 : E =>
fun_ (fun_recip f Af) ->
exists v0 : E, In (couple v0 v1) (fun_recip f Af))
(reunion (reunion (fun_recip f Af))) b); intros;
generalize (H2 H); clear H H2 H3; intros.
elim H; clear H; intros; generalize (H2 H0); clear H2; intros; elim H2;
clear H2; intros.
exists x; split; [ auto with zfc | intros ].
unfold fun_recip in H2; unfold fun_recip in H3.
elim
(axs_comprehension
(fun c : E =>
exists x0 : E, (exists y : E, In (couple x0 y) f /\ c = couple y x0))
(cartesien (Img f) (dom f)) (couple x b)); intros;
generalize (H4 H2); clear H2 H4 H5; intros.
elim
(axs_comprehension
(fun c : E =>
exists x : E, (exists y0 : E, In (couple x y0) f /\ c = couple y0 x))
(cartesien (Img f) (dom f)) (couple y b)); intros;
generalize (H4 H3); clear H3 H4 H5; intros.
elim H2; clear H2; intros; elim H4; clear H4; intros; elim H4; clear H4;
intros; elim H4; clear H4; intros.
elim H3; clear H3; intros; elim H6; clear H6; intros; elim H6; clear H6;
intros; elim H6; clear H6; intros.
elim (lem_couple_propertie x x1 b x0); intros; generalize (H8 H5);
clear H5 H8 H9; intros; elim H5; clear H5; intros.
elim (lem_couple_propertie y x3 b x2); intros; generalize (H9 H7);
clear H7 H9 H10; intros; elim H7; clear H7; intros.
generalize H4 H6; clear H4 H6; rewrite <- H8; rewrite <- H9; rewrite <- H5;
rewrite <- H7; clear H5 H7 H8 H9; intros.
generalize Af; intros.
elim Af0; clear Af0; intros.
exact (H7 b x y H4 H6).
Qed.
(* End of proof of lem_fun_recip_is_bij_under_bij                          *)

(* Specifications: *)
(***************************************************************************)
(* Si f est une injection de (dom f) dans (Img f) alors c'est une          *)
(* bijection de (dom f) dans (Img f)                                       *)
(***************************************************************************)
Lemma lem_fun_inj_dom_img_is_bij :
forall (f : E) (Af : fun_ f),
fun_inj f (dom f) (Img f) -> fun_bij f (dom f) (Img f).