intros E f Id_E_f.
red in |- *.
simple induction x; clear x.
auto.
unfold Word_ext in |- *.
(* plus simple : Prolog [ cons_cons inmonoid_cons_inv2 inmonoid_cons_inv ] 8.*)
intros x w Hyp inmonoid_E_cons_x_w.
simpl in |- *.
apply cons_cons.
apply Id_E_f; apply inmonoid_cons_inv2 with w; assumption.
apply Hyp.
apply inmonoid_cons_inv with x; assumption.
Qed.
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.

(* Specifications: *)
Lemma mono_epi_imp_iso : is_mono -> is_epi -> is_iso.
intros; red in |- *; auto.