intros q qd qa d g0 e1 e2 w H_aut H_g0 H.
elim H; auto.
intros e0 e e3 x w0 H0 H1 H2 H3 H4 H5.
absurd (chemin_A (add g0 q) (union d (delta_D g0 qd)) e g0 w0).
2: cut (chemin_A (add g0 q) (union d (delta_D g0 qd)) e e3 w0); auto.
2: rewrite H5; auto.
apply chemin_A_e1_g0_abs with qa; auto.
cut
(dans (couple e0 (couple x e)) d \/
dans (couple e0 (couple x e)) (delta_D g0 qd)); auto.
intro Ht; elim Ht; clear Ht.
intro.
cut (dans (couple e0 (couple x e)) (prodcart q (prodcart alph q))).
2: apply dans_trans with d; auto.
2: apply automate_def1 with qd qa; auto.
intro.
cut (dans e0 q /\ dans (couple x e) (prodcart alph q)).
2: apply coupl2; auto.
intro Ht; elim Ht; clear Ht; intros.
cut (dans x alph /\ dans e q).
2: apply coupl2; auto.
intro Ht; elim Ht; clear Ht; intros.
assumption.
unfold delta_D in |- *.
intro.
cut
(exists y : Elt,
dans y qd /\ couple e0 (couple x e) = transition_D g0 y :>Elt).
2: apply dans_map; auto.
intro Ht; elim Ht; clear Ht; intros y' Ht; elim Ht; clear Ht; intros.
unfold transition_D in H8.
cut (e0 = g0 :>Elt /\ couple x e = couple epsilon y' :>Elt).
2: apply equal_couple; auto.
intro Ht; elim Ht; clear Ht; intros.
cut (x = epsilon :>Elt /\ e = y' :>Elt).
2: apply equal_couple; auto.
intro Ht; elim Ht; clear Ht; intros.
absurd (dans x alph); auto.
rewrite H11.
red in |- *; intro; apply not_dans_epsilon_alph; assumption.
Qed.
(*									*)
(*  Pour tout automate A=(q,qd,qa,d) l'automate ((add g0 q),		*)
(*  (singleton g0),qa,(union d (delta_D g0 qd))) reconnait le meme 	*)
(*  langage que A et possede la propriete que seul le mot nil		*)
(*  permet de passer de g0 a g0 par un chemin.				*)
(*									*)

(* Specifications: *)
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).