Definition isregular_D (l : wordset) : Prop :=
  exists q : Ensf,
    (exists g0 : Elt,
       (exists qa : Ensf,
          (exists d : Ensf,
             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))).Definition transition_D (g0 x : Elt) : Elt := couple g0 (couple epsilon x).Definition delta_D (g0 : Elt) (qd : Ensf) : Ensf := map (transition_D g0) qd.

(* Specifications: *)
Lemma automate_A_D : forall (q qd qa d : Ensf) (g0 : Elt), automate q qd qa d -> automate_A (add g0 q) (singleton g0) qa (union d (delta_D g0 qd)).
Lemma chemin_D_chemin : forall (q qd qa d : Ensf) (g0 e e2 : Elt) (w : Word), automate q qd qa d -> ~ dans g0 q -> chemin_A (add g0 q) (union d (delta_D g0 qd)) e e2 w -> dans e q -> chemin e e2 q d w.
Lemma chemin_A_g0_e2 : forall (q qd qa d : Ensf) (g0 e1 e2 : Elt) (w : Word), automate q qd qa d -> ~ dans g0 q -> chemin_A (add g0 q) (union d (delta_D g0 qd)) e1 e2 w -> e1 = g0 :>Elt -> dans e2 qa -> exists e : Elt, dans e qd /\ chemin_A (add g0 q) (union d (delta_D g0 qd)) e e2 w.
Lemma chemin_A_e1_g0_abs : forall (q qd qa d : Ensf) (g0 e e2 : Elt) (w : Word), automate q qd qa d -> dans e q -> ~ dans g0 q -> e2 = g0 :>Elt -> ~ chemin_A (add g0 q) (union d (delta_D g0 qd)) e e2 w.
Lemma chemin_A_e1_g0 : forall (q qd qa d : Ensf) (g0 e1 e2 : Elt) (w : Word), automate q qd qa d -> ~ dans g0 q -> chemin_A (add g0 q) (union d (delta_D g0 qd)) e1 e2 w -> e2 = g0 :>Elt -> w = nil :>Word.
Lemma isregular_isregular_D_1 : forall (q qd qa d : Ensf) (g0 : Elt), automate q qd qa d -> ~ dans g0 q -> eqwordset (reconnait q qd qa d) (reconnait_A (add g0 q) (singleton g0) qa (union d (delta_D g0 qd))) /\ (forall w : Word, chemin_A (add g0 q) (union d (delta_D g0 qd)) g0 g0 w -> w = nil :>Word).
Lemma isregular_isregular_D : forall l : wordset, isregular l -> isregular_D l.