(*									*)
(*  On definit le predicat (chemin e1 e2 q d w), qui signifie :		*)
(*  On passe de e1 a e2 par le mot w dans un automate d'ensemble  	*)
(*  d'etats q et de transition d.					*)
(*									*)

Inductive chemin : Elt -> Elt -> Ensf -> Ensf -> Word -> Prop :=
  | chemin_nil :
      forall (e1 e2 : Elt) (q d : Ensf),
      dans e1 q -> e1 = e2 :>Elt -> chemin e1 e2 q d nil
  | chemin_cons :
      forall (e1 e2 : Elt) (q d : Ensf) (w : Word) (e a : Elt),
      chemin e1 e2 q d w ->
      dans e q ->
      dans a alph ->
      dans (couple e (couple a e1)) d -> chemin e e2 q d (cons a w).(*									*)
(*  On definit le predicat (chemin e1 e2 q d w), qui signifie :		*)
(*  On passe de e1 a e2 par le mot w dans un automate d'ensemble  	*)
(*  d'etats q et de transition d.					*)
(*									*)

Inductive chemin : Elt -> Elt -> Ensf -> Ensf -> Word -> Prop :=
  | chemin_nil :
      forall (e1 e2 : Elt) (q d : Ensf),
      dans e1 q -> e1 = e2 :>Elt -> chemin e1 e2 q d nil
  | chemin_cons :
      forall (e1 e2 : Elt) (q d : Ensf) (w : Word) (e a : Elt),
      chemin e1 e2 q d w ->
      dans e q ->
      dans a alph ->
      dans (couple e (couple a e1)) d -> chemin e e2 q d (cons a w).(*									*)
(*  On definit le predicat (chemin e1 e2 q d w), qui signifie :		*)
(*  On passe de e1 a e2 par le mot w dans un automate d'ensemble  	*)
(*  d'etats q et de transition d.					*)
(*									*)

Inductive chemin : Elt -> Elt -> Ensf -> Ensf -> Word -> Prop :=
  | chemin_nil :
      forall (e1 e2 : Elt) (q d : Ensf),
      dans e1 q -> e1 = e2 :>Elt -> chemin e1 e2 q d nil
  | chemin_cons :
      forall (e1 e2 : Elt) (q d : Ensf) (w : Word) (e a : Elt),
      chemin e1 e2 q d w ->
      dans e q ->
      dans a alph ->
      dans (couple e (couple a e1)) d -> chemin e e2 q d (cons a w).(*  On definit le meme predicat d'une autre facon, qui sera plus utile	*)
(*  par la suite							*)

Definition Chemin (e1 e2 : Elt) (q d : Ensf) (w : Word) : Prop :=
  match w return Prop with
  | nil =>
      (* nil  *)  dans e1 q /\ e1 = e2 :>Elt
      (* cons *) 
  | cons a w' =>
      exists e : Elt,
        chemin e e2 q d w' /\
        dans e1 q /\ dans a alph /\ dans (couple e1 (couple a e)) d
  end.

(* Specifications: *)
Lemma Chemin_chemin : forall (e1 e2 : Elt) (q d : Ensf) (w : Word), Chemin e1 e2 q d w -> chemin e1 e2 q d w.
Lemma chemin_Chemin : forall (e1 e2 : Elt) (q d : Ensf) (w : Word), chemin e1 e2 q d w -> Chemin e1 e2 q d w.