(* End of proof of lem_x_in_fun_form                                       *)

(***************************************************************************)
(***************************************************************************)
(* Image d'une partie du domaine d'une application f par f                 *)
(***************************************************************************)
(***************************************************************************)
Definition fun_img_directe (f : E) (Af : fun_ f) (c : E) :=
  subset
    (fun x : E =>
     In c (parties (dom f)) -> exists y : E, In y c /\ x = App f Af y)
    (Img f).(***************************************************************************)
(* On peut definir l'image reciproque d'une partie de l'image d'une        *)
(* application f.                                                          *)
(***************************************************************************)
Definition fun_img_inverse (f : E) (Af : fun_ f) (d : E) :=
  subset (fun x : E => In d (parties (Img f)) -> In (App f Af x) d) (dom f).(***************************************************************************)
(* Ces deux notions permettent de definir une application des parties de   *)
(* (dom f) dans les parties de (Img f)                                     *)
(***************************************************************************)
Definition fun_part (f : E) (Af : fun_ f) :=
  subset (fun x : E => exists y : E, x = couple y (fun_img_directe f Af y))
    (cartesien (parties (dom f)) (parties (Img f))).

(* Specifications: *)
Lemma lem_fun_part_is_fun : forall (f : E) (Af : fun_ f), fun_ (fun_part f Af).
Lemma lem_fun_part_dom : forall (f : E) (Af : fun_ f), dom (fun_part f Af) = parties (dom f).
Lemma lem_fun_part_img : forall (f : E) (Af : fun_ f), Img (fun_part f Af) = parties (Img f).
Lemma lem_fun_img_inv_is_in_pdom : forall (f : E) (Af : fun_ f) (x : E), In x (parties (Img f)) -> In (fun_img_inverse f Af x) (parties (dom f)).
Lemma lem_fun_img_prop1 : forall (f : E) (Af : fun_ f) (x : E), In x (parties (Img f)) -> fun_img_directe f Af (fun_img_inverse f Af x) = x.
Lemma lem_fun_img_dir_is_in_pimg : forall (f : E) (Af : fun_ f) (x : E), In x (parties (dom f)) -> In (fun_img_directe f Af x) (parties (Img f)).
Lemma lem_fun_img_prop2 : forall (f : E) (Af : fun_ f) (x : E), In x (parties (dom f)) -> inc x (fun_img_inverse f Af (fun_img_directe f Af x)).
Lemma lem_fun_part_eval_prop : forall (f : E) (Af : fun_ f) (x : E), In x (dom (fun_part f Af)) -> App (fun_part f Af) (lem_fun_part_is_fun f Af) x = fun_img_directe f Af x.