(************************************************************************)
(*									*)
(*      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 transition_dans_d1 : forall (q1 d1 q2 d2 : Ensf) (e1 x e : Elt), dans (couple e1 (couple x e)) (union (injg_d1 q1 d1) (injd_d2 q2 d2)) -> dans e1 (map injgauche q1) -> dans e (map injgauche q1).