(*									*)
(*    On definit la concatenation, l'union, l'intersection de 2		*)
(*    langages, le langage L* si L est un langage, ainsi que le		*)
(*    langage reduit a un mot.						*)
(*									*)

Definition lword (w : Word) : wordset := fun w1 : Word => w = w1 :>Word.Definition lconc (l1 l2 : wordset) : wordset :=
  fun w : Word =>
  exists w1 : Word,
    (exists w2 : Word, l1 w1 /\ l2 w2 /\ w = Append w1 w2 :>Word).Definition lunion (l1 l2 : wordset) : wordset := fun w : Word => l1 w \/ l2 w.Definition linter (l1 l2 : wordset) : wordset := fun w : Word => l1 w /\ l2 w.Fixpoint lpuiss (n : nat) : wordset -> wordset :=
  fun l : wordset =>
  match n return wordset with
  | O =>
      (* O *)  lword nil
      (* S *) 
  | S p => lconc l (lpuiss p l)
  end.Definition lstar (l : wordset) : wordset :=
  fun w : Word => exists n : nat, lpuiss n l w.

(* Specifications: *)
Lemma induction_star : forall (P : Word -> Prop) (l : wordset), (forall (n : nat) (w : Word), lpuiss n l w -> P w) -> forall w : Word, lstar l w -> P w.
Lemma lw_imp_lstarlw : forall (l : wordset) (w : Word), l w -> lstar l w.