(************************************************************************)
(*									*)
(*      L'union de 2 langages reguliers est un langage regulier.	*)
(*									*)
(************************************************************************)

(*									*)
(*  A partir d'une relation d1 (partie de q1 x alph x q1) on construit	*)
(*  la relation d1', qui est la meme relation, mais pour les etats	*)
(*  (e,zero) au lieu de e.						*)
(*  De meme pour une relation d2 avec e -> (e,un).			*)
(*									*)

Definition est_dans_d'_2 (d : Ensf) (e y : Elt) : Prop :=
  match y return Prop with
  | natural n =>
      (* natural *)  False
      (* couple  *) 
  | couple a e' =>
      dans (couple (first e) (couple a (first e'))) d
      (* up      *) 
  | up e => False
      (* word    *) 
  | word w => False
  end.Definition est_dans_d' (d1 : Ensf) (x : Elt) : Prop :=
  match x return Prop with
  | natural n =>
      (* natural *)  False
      (* couple  *) 
  | couple e y => est_dans_d'_2 d1 e y
      (* up      *) 
  | up e => False
      (* word    *) 
  | word w => False
  end.Definition injg_d1 (q1 d1 : Ensf) : Ensf :=
  tq (est_dans_d' d1)
    (prodcart (map injgauche q1) (prodcart alph (map injgauche q1))).Definition injd_d2 (q2 d2 : Ensf) : Ensf :=
  tq (est_dans_d' d2)
    (prodcart (map injdroite q2) (prodcart alph (map injdroite q2))).

Lemma chemin_restriction_1 : forall (q1 qd1 qa1 d1 q2 qa2 d2 : Ensf) (w : Word) (e1 e2 : Elt), automate q1 qd1 qa1 d1 -> chemin e1 e2 (union_disj q1 q2) (union (injg_d1 q1 d1) (injd_d2 q2 d2)) w -> dans e1 (map injgauche q1) -> dans e2 (union_disj qa1 qa2) -> chemin (first e1) (first e2) q1 d1 w /\ dans e2 (map injgauche qa1).