(* lemmes d'équivalence sémantique entre la fonction calculatoire (Fixpoint) *)
(* et la définition par Inductive *)

Definition sem_equiv_prop_t (t : term) :=
  forall (d : preDTA) (a : ad) (n : nat),
  rec_term d a t n = true -> reconnaissance d a t.Definition sem_equiv_prop_l (l : term_list) :=
  forall (d : preDTA) (p : prec_list) (n : nat),
  rec_list_terms d p l n = true -> liste_reconnait d p l.

(* Specifications: *)
Lemma semantic_equiv_0_0 : forall (d : preDTA) (p : prec_list) (n : nat), rec_list_terms d p tnil n = true -> p = prec_empty.
Lemma semantic_equiv_0_1 : sem_equiv_prop_l tnil.
Lemma semantic_equiv_0_2 : forall (d : preDTA) (a a' : ad) (l : term_list) (n : nat) (s : state) (p : prec_list), rec_term d a (app a' l) (S n) = true -> MapGet state d a = Some s -> MapGet prec_list s a' = Some p -> rec_list_terms d p l n = true.
Lemma semantic_equiv_0_3 : forall (d : preDTA) (a a' : ad) (l : term_list) (n : nat), rec_term d a (app a' l) (S n) = true -> exists s : state, MapGet state d a = Some s.
Lemma semantic_equiv_0_4 : forall (d : preDTA) (a a' : ad) (l : term_list) (n : nat) (s : state), MapGet state d a = Some s -> rec_term d a (app a' l) (S n) = true -> exists p : prec_list, MapGet prec_list s a' = Some p.
Lemma semantic_equiv_0_5 : forall (a : ad) (t : term_list), sem_equiv_prop_l t -> sem_equiv_prop_t (app a t).
Lemma semantic_equiv_0_6 : forall (n : nat) (t : term) (t0 : term_list), (forall (d : preDTA) (a : ad) (m : nat), rec_term d a t m = true -> reconnaissance d a t) -> (forall (d : preDTA) (p : prec_list) (m : nat), rec_list_terms d p t0 m = true -> liste_reconnait d p t0) -> forall (d : preDTA) (p : prec_list), rec_list_terms d p (tcons t t0) n = true -> liste_reconnait d p (tcons t t0).
Lemma semantic_equiv_0_7 : forall t : term, sem_equiv_prop_t t -> forall t0 : term_list, sem_equiv_prop_l t0 -> sem_equiv_prop_l (tcons t t0).
Lemma semantic_equiv_0 : forall (d : preDTA) (a : ad) (t : term) (n : nat), rec_term d a t n = true -> reconnaissance d a t.