(* 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.