Library Automata.gram3
Require Import Ensf.
Require Import Words.
Require Import more_words.
Require Import need.
Require Import fonctions.
Require Import Relations.
Require Import gram.
Require Import gram2.
Section resultats_iso_image.
Variable X V R : Ensf.
Variable S : Elt.
Variable f : Elt -> Elt.
Let Gim := imageGram f X V R S.
Let Xim := fst Gim.
Let Gim2 := snd Gim.
Let Vim := fst Gim2.
Let Gim3 := snd Gim2.
Let Rim := fst Gim3.
Let Sim := snd Gim3.
Let invf := inv (union X V) (union Xim Vim) f.
Let Gim' := imageGram invf Xim Vim Rim Sim.
Let Xim' := fst Gim'.
Let Gim2' := snd Gim'.
Let Vim' := fst Gim2'.
Let Gim3' := snd Gim2'.
Let Rim' := fst Gim3'.
Let Sim' := snd Gim3'.
Hypothesis Gram : isGram X V R S.
Lemma Regles_X_V_R : Regles X V R.
Proof isGram4 X V R S Gram.
Hypothesis Mono : is_mono (union X V) f.
Lemma inter_Xim_Vim_empty : inter Xim Vim empty.
unfold Xim, Vim in |- *; simpl in |- *.
red in |- *.
split; [ idtac | split ].
auto with v62.
auto with v62.
intros x dans_x_map_f_X dans_x_map_f_V.
elimtype (exists y : Elt, dans y X /\ x = f y :>Elt).
elimtype (exists y : Elt, dans y V /\ x = f y :>Elt).
intros v temp; elim temp; clear temp.
intros dans_v_V x_egal_f_v x_ant temp; elim temp; clear temp.
intros dans_x_ant_X x_egal_f_x_ant.
elimtype (inter X V empty).
intros incl_empty_X temp; elim temp; clear temp. intros incl_empty_V imp.
apply dans_empty_imp_P with v.
apply imp.
replace v with x_ant.
assumption.
apply Mono.
auto with v62.
auto with v62.
rewrite <- x_egal_f_x_ant; assumption.
assumption.
exact (isGram2 X V R S Gram).
auto with v62.
auto with v62.
Qed.
Lemma union_Xim_Vim_map_f_union_X_V :
union Xim Vim = map f (union X V) :>Ensf.
unfold Xim, Vim, Gim2, Gim, imageGram in |- *; simpl in |- *.
apply map_union.
Qed.
Lemma Iso : is_iso (union X V) (union Xim Vim) f.
rewrite union_Xim_Vim_map_f_union_X_V.
auto with v62.
Qed.
Hint Resolve Iso: v62.
Let wef := Word_ext f.
Let weinvf := Word_ext invf.
Lemma invf_f : Id (union X V) (comp invf f).
unfold invf in |- *.
auto with v62.
Qed.
Lemma weinvf_wef : Id_words (union X V) (comp_word weinvf wef).
unfold Id_words in |- *.
unfold weinvf, wef in |- *.
intro x.
rewrite <- (comp_Word_ext invf f x).
generalize x.
apply (extension_Id (union X V) (comp invf f)).
exact invf_f.
Qed.
Let Rf (g : Elt -> Elt) (P : Elt) :=
couple (g (first P)) (word (Word_ext g (word_inv (second P)))).
Lemma comp_Rf :
forall (g f : Elt -> Elt) (x : Elt),
dans x R -> comp (Rf g) (Rf f) x = Rf (comp g f) x :>Elt.
clear Mono.
intros f' g x dans_x_R.
elim (Regles_X_V_R x dans_x_R).
intros A dans_A_V temp.
elim temp; clear temp; intros B egal_x inmonoid_B.
rewrite egal_x.
unfold Rf in |- *.
unfold comp at 1 in |- *.
apply couple_couple.
apply refl_equal.
simpl in |- *. rewrite (comp_Word_ext f' g B). apply refl_equal.
Qed.
Lemma egalGim'_image_comp :
Gim' = imageGram (comp invf f) X V R S :>Ensf * (Ensf * (Ensf * Elt)).
unfold Gim' in |- *.
unfold Sim, Rim, Gim3, Vim, Gim2, Xim, Gim, imageGram in |- *; simpl in |- *.
apply pair_equal.
rewrite (map_map_eg_map_comp invf f X); auto with v62.
apply pair_equal.
rewrite (map_map_eg_map_comp invf f V); auto with v62.
apply pair_equal.
change (map (Rf invf) (map (Rf f) R) = map (Rf (comp invf f)) R :>Ensf)
in |- *.
replace (map (Rf (comp invf f)) R) with (map (comp (Rf invf) (Rf f)) R).
apply map_map_eg_map_comp.
apply map_egal.
exact (comp_Rf invf f).
apply refl_equal.
Qed.
Lemma egalG : Gim' = (X, (V, (R, S))).
rewrite egalGim'_image_comp.
apply Id_image_G.
unfold invf in |- *.
auto with v62.
auto with v62.
Qed.
Lemma egalS : Sim' = S :>Elt.
unfold Sim', Rim', Gim3', Vim', Gim2', Xim' in |- *.
rewrite egalG.
apply refl_equal.
Qed.
Lemma egalR : Rim' = R :>Ensf.
unfold Rim', Gim3', Vim', Gim2', Xim' in |- *.
rewrite egalG.
apply refl_equal.
Qed.
Lemma egalX : Xim' = X :>Ensf.
unfold Vim', Gim2', Xim' in |- *.
rewrite egalG.
apply refl_equal.
Qed.
Lemma egalV : Vim' = V :>Ensf.
unfold Vim', Gim2', Xim' in |- *.
rewrite egalG.
apply refl_equal.
Qed.
Lemma Reconnait_imageGram_iso :
forall w : Word, inmonoid X w -> LG Xim Vim Rim Sim (wef w) -> LG X V R S w.
intros w inmonoid_X_w LG_wef_w.
rewrite <- egalR.
rewrite <- egalS.
rewrite <- egalV.
rewrite <- egalX.
replace w with (weinvf (wef w)).
unfold Sim', Rim', Gim3', Vim', Gim2', Xim', Gim', weinvf in |- *.
auto with v62.
change (comp_word weinvf wef w = w :>Word) in |- *.
apply Id_words_inv with X.
assumption.
apply Id_words_inclus with (union X V).
auto with v62.
exact weinvf_wef.
Qed.
Lemma egal_Xim : Id X f -> Xim = X :>Ensf.
unfold Xim, Gim, imageGram in |- *; simpl in |- *.
intros.
apply map_Id; assumption.
Qed.
Lemma egal_LG : Id X f -> l_egal (LG X V R S) (LG Xim Vim Rim Sim).
unfold l_egal in |- *.
intro Id_X.
unfold l_inclus in |- *.
split.
intros w LG_X_w.
replace w with (wef w).
unfold Sim, Rim, Gim3, Vim, Gim2, Xim, Gim, wef in |- *.
auto with v62.
apply (Id_words_inv X).
prolog [ LG_inv ] 2.
exact (extension_Id X f Id_X).
intros w LG_Xim_w.
replace X with Xim'.
replace V with Vim'.
replace S with Sim'.
replace R with Rim'.
replace w with (weinvf (wef w)).
unfold Sim', Rim', Gim3', Vim', Gim2', Xim', Gim', weinvf in |- *.
apply Reconnait_imageGram.
replace (wef w) with w.
assumption.
apply sym_equal.
apply (Id_words_inv X).
rewrite <- (egal_Xim Id_X).
prolog [ LG_inv ] 2.
exact (extension_Id X f Id_X).
pattern w at 2 in |- *; replace w with (comp_word weinvf wef w).
apply refl_equal.
apply Id_words_inv with (union X V).
apply inmonoid_inclus with X.
auto with v62.
replace X with Xim.
prolog [ LG_inv ] 2.
exact (egal_Xim Id_X).
exact weinvf_wef.
exact egalR.
exact egalS.
exact egalV.
exact egalX.
Qed.
End resultats_iso_image.
