(* conservation de la reconnaissance d'un terme si on met plus d'essence ... *)
Definition invar_term (t : term) : Prop :=
forall (n m : nat) (d : preDTA) (a : ad),
rec_term d a t n = true -> n <= m -> rec_term d a t m = true.
Definition invar_list (tl : term_list) : Prop :=
forall (n m : nat) (d : preDTA) (p : prec_list),
rec_list_terms d p tl n = true -> n <= m -> rec_list_terms d p tl m = true.

(* Specifications: *)
Lemma invar_0 : invar_list tnil.
Lemma invar_1_0 :
forall (d : preDTA) (a c : ad) (t : term_list) (n : nat)
(s : state) (p : prec_list),
MapGet state d a = Some s ->
MapGet prec_list s c = Some p ->
rec_list_terms d p t n = true -> rec_term d a (app c t) (S n) = true.
Lemma invar_1_1 :
forall (d : preDTA) (a c : ad) (t : term_list) (n : nat),
rec_term d a (app c t) (S n) = true ->
exists p : prec_list, rec_list_terms d p t n = true.
Lemma invar_1 :
forall (a : ad) (t : term_list), invar_list t -> invar_term (app a t).
Lemma invar_2_0 :
forall (d : preDTA) (p : prec_list) (n : nat),
rec_list_terms d p tnil n = true -> p = prec_empty.
Lemma invar_2_1 :
forall (d : preDTA) (a : ad) (la ls : prec_list) (hd : term)
(tl : term_list) (n : nat),
rec_list_terms d (prec_cons a la ls) (tcons hd tl) (S n) = true ->
rec_list_terms d ls (tcons hd tl) n = true \/
rec_term d a hd n = true /\ rec_list_terms d la tl n = true.
Lemma invar_2_2 :
forall (d : preDTA) (a : ad) (la ls : prec_list) (hd : term)
(tl : term_list) (n : nat),
rec_list_terms d ls (tcons hd tl) n = true \/
rec_term d a hd n = true /\ rec_list_terms d la tl n = true ->
rec_list_terms d (prec_cons a la ls) (tcons hd tl) (S n) = true.
Lemma invar_2 :
forall t : term,
invar_term t ->
forall t0 : term_list, invar_list t0 -> invar_list (tcons t t0).
Lemma invar : forall t : term, invar_term t.
Lemma invarl : forall tl : term_list, invar_list tl.
Definition dta_reconnait (d : preDTA) (a : ad) (t : term)
(pr : reconnaissance d a t) := rec_term d a t (essence t d) = true.