(* On etend la fonction f : Elt-> Elt definie sur V*)
(*en la fonction F=(extension V f)*)
(*definie sur Elt par F(x) = f(x) sur V et F(x)=x ailleurs*)

Axiom
  extension_spec :
    forall (V : Ensf) (f : Elt -> Elt) (x : Elt),
    {y : Elt | dans x V /\ y = f x :>Elt \/ ~ dans x V /\ y = x :>Elt}.(*
Lemma extension_spec : (V:Ensf)(f:Elt->Elt)(x:Elt)
{y:Elt | ((dans x V)/\<Elt>y=(f x)) \/ (~(dans x V)/\<Elt>y=x)}.
Realizer 
	[V:Ensf][f:Elt -> Elt][x : Elt]
			(<Elt> Match (Dans_spec x V) with 
							(*true*) (f x)
							(*false*) x
			)
.
Program_all.
Save.
*)

Definition extension (V : Ensf) (f : Elt -> Elt) (x : Elt) :=
  let (y, p) return Elt := extension_spec V f x in y.

(* Specifications: *)
Lemma extension_in : forall (e : Ensf) (f : Elt -> Elt) (x : Elt), dans x e -> extension e f x = f x :>Elt.
Lemma extension_out : forall (e : Ensf) (f : Elt -> Elt) (x : Elt), ~ dans x e -> extension e f x = x :>Elt.
Lemma is_epi_f_over_image : is_epi E (map f E) f.
Lemma mono_imp_iso_over_image : is_mono E f -> is_iso E (map f E) f.
Lemma inv_is_mono : is_iso E F f -> is_mono F invf.
Lemma inv_is_epi : is_iso E F f -> is_epi F E invf.
Lemma application_imp_application_words : application E F f -> application_words E F wef.
Lemma is_mono_f_imp_is_mono_words : is_mono E f -> is_mono_words E wef.
Lemma is_epi_f_imp_is_epi_words : is_epi E F f -> is_epi_words E F wef.
Lemma is_iso_f_imp_is_iso_words : is_iso E F f -> is_iso_words E F wef.
Lemma is_iso_f_imp_Id_words_weinvf_wef : is_iso E F f -> Id_words E weinvf_wef.