(* End of proof of lem_equivClass_in_parties_a                             *)

(***************************************************************************)
(* Quotient d'un ensemble par une relation d'equivalence                   *)
(***************************************************************************)
Definition quotient (r a : E) (rRel : rel_sig r a a)
  (rEqv : equivalence r a rRel) (rD : rdom r a a rRel = a) :=
  subset
    (fun x : E => exists y : E, In y a /\ x = equivClass r a rRel rEqv y)
    (parties a).(***************************************************************************)
(* Toute application induit une relation d'equivalence sur son domaine     *)
(* equiv_fun sera le "noyau d'equivalence" de l'application                *)
(***************************************************************************)
Definition equiv_fun (f : E) (Af : fun_ f) :=
  subset
    (fun x : E =>
     exists a : E, (exists b : E, x = couple a b /\ App f Af a = App f Af b))
    (cartesien (dom f) (dom f)).

(* Specifications: *)
Lemma lem_fun_equiv_is_rel : forall (f : E) (Af : fun_ f), rel_sig (equiv_fun f Af) (dom f) (dom f).
Lemma lem_sig_fun_equiv_is_rel : forall (f a s : E) (Afs : fun_sig f a s), rel_sig (equiv_fun f (lem_fun_sig_is_fun f a s Afs)) a a.
Lemma lem_fun_equiv_is_equiv : forall (f : E) (Af : fun_ f), equivalence (equiv_fun f Af) (dom f) (lem_fun_equiv_is_rel f Af).
Lemma lem_sig_fun_equiv_is_equiv : forall (f a s : E) (Afs : fun_sig f a s), equivalence (equiv_fun f (lem_fun_sig_is_fun f a s Afs)) a (lem_sig_fun_equiv_is_rel f a s Afs).
Lemma lem_fun_equiv_dom : forall (f : E) (Af : fun_ f), rdom (equiv_fun f Af) (dom f) (dom f) (lem_fun_equiv_is_rel f Af) = dom f.
Lemma lem_sig_fun_equiv_dom : forall (f a s : E) (Afs : fun_sig f a s), rdom (equiv_fun f (lem_fun_sig_is_fun f a s Afs)) a a (lem_sig_fun_equiv_is_rel f a s Afs) = a.
Lemma lem_fun_equiv_prop : forall (f : E) (Af : fun_ f) (x y : E), In (couple x y) (equiv_fun f Af) -> App f Af x = App f Af y.
Lemma lem_equiv_fun_make : forall (f : E) (Af : fun_ f) (x y : E), In x (dom f) -> In y (dom f) -> App f Af x = App f Af y -> In (couple x y) (equiv_fun f Af).
Lemma lem_sig_equiv_fun_make : forall (f a s : E) (Afs : fun_sig f a s) (x y : E), In x a -> In y a -> App f (lem_fun_sig_is_fun f a s Afs) x = App f (lem_fun_sig_is_fun f a s Afs) y -> In (couple x y) (equiv_fun f (lem_fun_sig_is_fun f a s Afs)).