intros q1 qa1 d1 q2 qd2 d2 e e3 w0 H.
elim H; clear H.
intros.
apply chemin_nil.
apply dans_map_injd; auto.
apply (f_equal (A:=Elt) (B:=Elt)); auto.
intros e1 e0 e2 x w H H0 H1 H2 H3 H4 H5.
apply chemin_cons with (first e0); auto.
apply H0; auto.
cut
(dans (couple e1 (couple x e0)) (pont qa1 qd2) \/
dans (couple e1 (couple x e0)) (union (injg_d1 q1 d1) (injd_d2 q2 d2)));
auto.
intro Ht; elim Ht; clear Ht.
intro.
cut (x = epsilon :>Elt).
2: apply dans_pont_imp_epsilon with qa1 qd2 e1 e0; auto.
intro.
absurd (dans x alph); auto.
rewrite H7.
red in |- *; intro; apply not_dans_epsilon_alph; assumption.
intro.
cut
(dans (couple e1 (couple x e0)) (injg_d1 q1 d1) \/
dans (couple e1 (couple x e0)) (injd_d2 q2 d2));
auto.
intro Ht; elim Ht; clear Ht.
unfold injg_d1 in |- *.
intro.
cut
(dans (couple e1 (couple x e0))
(prodcart (map injgauche q1) (prodcart alph (map injgauche q1))) /\
est_dans_d' d1 (couple e1 (couple x e0))).
2: apply dans_tq_imp; auto.
intro Ht; elim Ht; clear Ht; intros.
cut
(dans e1 (map injgauche q1) /\
dans (couple x e0) (prodcart alph (map injgauche q1))).
2: apply coupl2; auto.
intro Ht; elim Ht; clear Ht; intros.
absurd (dans e1 (map injdroite q2)); auto.
apply absurd_injg_injd with q1; auto.
unfold injd_d2 in |- *.
intro.
cut
(dans (couple e1 (couple x e0))
(prodcart (map injdroite q2) (prodcart alph (map injdroite q2))) /\
est_dans_d' d2 (couple e1 (couple x e0))).
2: apply dans_tq_imp; auto.
intro Ht; elim Ht; clear Ht; intros.
cut
(dans e1 (map injdroite q2) /\
dans (couple x e0) (prodcart alph (map injdroite q2))).
2: apply coupl2; auto.
intro Ht; elim Ht; clear Ht; intros.
cut (dans x alph /\ dans e0 (map injdroite q2)).
2: apply coupl2; auto.
intro Ht; elim Ht; auto.
apply dans_map_injd; auto.
apply transition_a_droite_2 with q1 qa1 d1 q2 qd2; auto.
intros e1 e0 e2 w H H0 H1 H2 H3 H4.
cut (dans e1 (map injgauche qa1) /\ dans e0 (map injdroite qd2)).
2: apply transition_dans_pont with q1 d1 q2 d2; auto.
intro Ht; elim Ht; clear Ht.
intros.
absurd (dans e1 (map injdroite q2)); auto.
apply absurd_injg_injd with qa1; auto.
Qed.
(*  Si on a un chemin par w de e1 a e2 avec e1 dans (map injgauche q1)	*)
(*  et e2 dans (map injdroite q2) alors on passe necessairement par	*)
(*  le pont.								*)

(* Specifications: *)
Lemma par_le_pont :
forall (q1 qd1 qa1 d1 q2 qd2 qa2 d2 : Ensf) (e1 e2 : Elt) (w : Word),
automate q1 qd1 qa1 d1 ->
automate q2 qd2 qa2 d2 ->
chemin_A (union_disj q1 q2)
(union (pont qa1 qd2) (union (injg_d1 q1 d1) (injd_d2 q2 d2))) e1 e2 w ->
dans e1 (map injgauche q1) ->
dans e2 (map injdroite q2) ->
exists x1 : Elt,
(exists x2 : Elt,
(exists w1 : Word,
(exists w2 : Word,
dans x1 qa1 /\
dans x2 qd2 /\
chemin (first e1) x1 q1 d1 w1 /\
chemin x2 (first e2) q2 d2 w2 /\ w = Append w1 w2 :>Word))).