(* Proof of lem_fun_part_eval_prop                                         *)
intros; apply axs_extensionnalite; intros; unfold iff in |- *; split; intros.
unfold App in H0.
elim
(axs_comprehension
(fun z : E => exists y : E, In (couple x y) (fun_part f Af) /\ In z y)
(reunion (Img (fun_part f Af))) 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 fun_part in H1.
elim
(axs_comprehension
(fun x1 : E => exists y : E, x1 = couple y (fun_img_directe f Af y))
(cartesien (parties (dom f)) (parties (Img f)))
(couple x x0)); intros; generalize (H3 H1); clear H1 H3 H4;
intros.
elim H1; clear H1; intros; elim H3; clear H3; intros.
elim (lem_couple_propertie x x1 x0 (fun_img_directe f Af x1)); intros;
generalize (H4 H3); clear H3 H4 H5; intros.
elim H3; clear H3; intros; rewrite H3; rewrite <- H4; auto with zfc.
generalize H; rewrite (lem_fun_part_dom f Af); intros.
unfold fun_img_directe in H0.
elim
(axs_comprehension
(fun x0 : E =>
In x (parties (dom f)) -> exists y : E, In y x /\ x0 = App f Af y)
(Img f) v2); intros; generalize (H2 H0); clear H0 H2 H3;
intros.
elim H0; clear H0; intros; generalize (H2 H1); clear H2; intros.
elim H2; clear H2; intros; elim H2; clear H2; intros.
unfold App in |- *.
elim
(axs_comprehension
(fun z : E => exists y : E, In (couple x y) (fun_part f Af) /\ In z y)
(reunion (Img (fun_part f Af))) v2); intros; apply H5;
clear H4 H5; intros.
split.
rewrite (lem_fun_part_img f Af).
rewrite (lem_reunion_parties (Img f)).
auto with zfc.
generalize (lem_fun_part_is_fun f Af); intros.
generalize (lem_App (fun_part f Af) x H4 H); intros.
elim H5; clear H5; intros; elim H5; clear H5; intros.
exists x1; split; [ auto with zfc | idtac ].
unfold fun_part in H6.
elim
(axs_comprehension
(fun x0 : E => exists y : E, x0 = couple y (fun_img_directe f Af y))
(cartesien (parties (dom f)) (parties (Img f)))
(couple x x1)); intros; generalize (H7 H6); clear H6 H7 H8;
intros.
elim H6; clear H6; intros; elim H7; clear H7; intros.
elim (lem_couple_propertie x x2 x1 (fun_img_directe f Af x2)); intros;
generalize (H8 H7); clear H7 H8 H9; intros.
elim H7; clear H7; intros.
rewrite H8; rewrite <- H7.
unfold fun_img_directe in |- *.
elim
(axs_comprehension
(fun x0 : E =>
In x (parties (dom f)) -> exists y : E, In y x /\ x0 = App f Af y)
(Img f) v2); intros; apply H10; clear H9 H10; intros.
split; [ auto with zfc | intros; exists x0; split; auto with zfc ].
Qed.
(* End of proof of lem_fun_part_eval_prop                                  *)
(***************************************************************************)
(***************************************************************************)
(* Reciproque: application des parties de l'image de f dans les parties du *)
(* domaine de f                                                            *)
(***************************************************************************)
(***************************************************************************)
Definition fun_part_inv (f : E) (Af : fun_ f) :=
subset (fun x : E => exists y : E, x = couple y (fun_img_inverse f Af y))
(cartesien (parties (Img f)) (parties (dom f))).

(* Specifications: *)
(***************************************************************************)
(* fun_part_inv est une application                                        *)
(***************************************************************************)
Lemma lem_fun_part_inv_is_fun :
forall (f : E) (Af : fun_ f), fun_ (fun_part_inv f Af).