(************************************************************************)
(*									*)
(*      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 d_is_good : forall q1 q2 d1 d2 : Ensf, inclus (union (injg_d1 q1 d1) (injd_d2 q2 d2)) (prodcart (union_disj q1 q2) (prodcart alph (union_disj q1 q2))).