Section fonctions.
Variable E : Ensf.
Variable F : Ensf.
Variable f : Elt -> Elt.
(*Definition d'une application*)
Definition application := forall x : Elt, dans x E -> dans (f x) F.
Hint Unfold application.
(*Definition de l'injectivite*)
Definition is_mono :=
forall x y : Elt, dans x E -> dans y E -> f x = f y :>Elt -> x = y :>Elt.
(*Definition surjectivite*)
Definition is_epi :=
application /\
(forall x : Elt, dans x F -> exists2 y : Elt, x = f y & dans y E).
Definition is_iso := is_epi /\ is_mono.
intros; red in |- *; auto.
Qed.
Variable fw : Word -> Word.
(*Definition d'une application pour les mots*)
Definition application_words :=
forall x : Word, inmonoid E x -> inmonoid F (fw x).
(*Definition de l'injectivite*)
Definition is_mono_words :=
forall x y : Word,
inmonoid E x -> inmonoid E y -> fw x = fw y :>Word -> x = y :>Word.
(*Definition surjectivite pour les fonctions sur les monoides*)
Definition is_epi_words :=
application_words /\
(forall x : Word, inmonoid F x -> exists2 y : Word, x = fw y & inmonoid E y).
Definition is_iso_words := is_mono_words /\ is_epi_words.
intros; red in |- *; auto.
Qed.
End fonctions.
Hint Resolve mono_epi_imp_iso.
Parameter inv : Ensf -> Ensf -> (Elt -> Elt) -> Elt -> Elt.
Axiom
dans_inv_f :
forall (E F : Ensf) (f : Elt -> Elt),
is_iso E F f -> forall x : Elt, dans x F -> dans (inv E F f x) E.
Hint Resolve dans_inv_f.
Axiom
inv1 :
forall (E F : Ensf) (f : Elt -> Elt),
is_iso E F f -> forall x : Elt, dans x E -> inv E F f (f x) = x :>Elt.
Hint Resolve inv1.
Axiom
inv2 :
forall (E F : Ensf) (f : Elt -> Elt),
is_iso E F f -> forall x : Elt, dans x F -> f (inv E F f x) = x :>Elt.
Hint Resolve inv2.
unfold Id, comp in |- *.
intros.
auto.
Qed.
Hint Resolve inv1'.
(* 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.

Lemma extension_in :
forall (e : Ensf) (f : Elt -> Elt) (x : Elt),
dans x e -> extension e f x = f x :>Elt.