Definition cut (u : Word) :=
  let (a, s) := cut_spec u in (a, let (b, s2) := s in b).Definition cut1 (u : Word) := fst (cut u).Definition cut2 (u : Word) := snd (cut u).

(* Specifications: *)
Lemma cut_unicite : forall u a b a' b' : Word, inmonoid X a /\ Append a b = u /\ (b = nil \/ ex2 (fun x : Elt => ~ dans x X) (fun x : Elt => exists w : Word, b = cons x w)) -> inmonoid X a' /\ Append a' b' = u /\ (b' = nil \/ ex2 (fun x : Elt => ~ dans x X) (fun x : Elt => exists w : Word, b' = cons x w)) -> a = a'.
Lemma inmonoid_cut1 : forall w : Word, inmonoid X (cut1 w).
Lemma cut_Append : forall w : Word, w = Append (cut1 w) (cut2 w).
Lemma cut1_cons : forall (a : Elt) (w : Word), dans a X -> cut1 (cons a w) = cons a (cut1 w).
Lemma cut1_Append : forall u v : Word, inmonoid X u -> cut1 (Append u v) = Append u (cut1 v).