(************************************************************************)
(*									*)
(*          Si l est regulier alors l* est aussi regulier.      	*)
(*									*)
(************************************************************************)

Definition transition_back (g0 x : Elt) : Elt := couple x (couple epsilon g0).Definition delta (g0 : Elt) (qa : Ensf) : Ensf := map (transition_back g0) qa.Definition fun_d_dstar (g0 : Elt) (qa d : Ensf) : Ensf :=
  union d (delta g0 qa).

(* Specifications: *)
Lemma dstar_is_good : forall (q qa d : Ensf) (g0 : Elt), automate q (singleton g0) qa d -> inclus (fun_d_dstar g0 qa d) (prodcart q (prodcart (add epsilon alph) q)).
Lemma transition_dans_l : forall (q qa d : Ensf) (g0 e0 x e : Elt), automate q (singleton g0) qa d -> dans x alph -> dans (couple e0 (couple x e)) (fun_d_dstar g0 qa d) -> dans (couple e0 (couple x e)) d.
Lemma transition_par_epsilon : forall (q qa d : Ensf) (g0 e0 e : Elt), automate q (singleton g0) qa d -> dans (couple e0 (couple epsilon e)) (fun_d_dstar g0 qa d) -> dans e0 qa /\ e = g0 :>Elt.
Lemma chemin_g0_g0 : forall (q qa d : Ensf) (g0 : Elt) (w0 : Word), automate q (singleton g0) qa d -> (forall e x : Elt, dans (couple g0 (couple x e)) d -> x = epsilon :>Elt) -> chemin g0 g0 q d w0 -> w0 = nil :>Word.
Lemma lstar_is_reg2_bis : forall (q qa d : Ensf) (g0 e1 e2 : Elt) (w : Word) (l : wordset), automate q (singleton g0) qa d -> eqwordset (reconnait q (singleton g0) qa d) l -> (forall w : Word, chemin g0 g0 q d w -> w = nil :>Word) -> chemin_A q (fun_d_dstar g0 qa d) e1 e2 w -> e2 = g0 :>Elt -> chemin e1 e2 q d w \/ (exists e : Elt, (exists w1 : Word, (exists w2 : Word, chemin e1 e q d w1 /\ dans e qa /\ lstar l w2 /\ w = Append w1 w2 :>Word))).
Lemma lstar_is_reg1 : forall (q qa d : Ensf) (l : wordset) (g0 : Elt) (w : Word), automate q (singleton g0) qa d -> (forall w : Word, chemin g0 g0 q d w -> w = nil :>Word) -> eqwordset (reconnait q (singleton g0) qa d) l -> reconnait_A q (singleton g0) (singleton g0) (fun_d_dstar g0 qa d) w -> lstar l w.
Lemma lstar_is_reg : forall l : wordset, isregular l -> isregular (lstar l).
Lemma rat_is_reg : forall L : wordset, isrationnal L -> isregular L.