(* nouvelles définitions (plus stricte) de compatibilité entre automates, états... *)
Definition pl_compatible (pl0 pl1 : prec_list) : Prop :=
exists n : nat, pl_tl_length pl0 n /\ pl_tl_length pl1 n.
Definition st_compatible (s0 s1 : state) : Prop :=
forall (c : ad) (pl0 pl1 : prec_list),
MapGet prec_list s0 c = Some pl0 ->
MapGet prec_list s1 c = Some pl1 -> pl_compatible pl0 pl1.
Definition predta_compatible (d0 d1 : preDTA) : Prop :=
forall s0 s1 : state,
state_in_dta d0 s0 -> state_in_dta d1 s1 -> st_compatible s0 s1.
Definition dta_compatible (d0 d1 : DTA) : Prop :=
match d0, d1 with
| dta p0 a0, dta p1 a1 => predta_compatible p0 p1
end.

(* Specifications: *)
Lemma pl_compatible_sym :
forall pl0 pl1 : prec_list, pl_compatible pl0 pl1 -> pl_compatible pl1 pl0.
Lemma pl_compatible_empt_r :
forall p : prec_list, pl_compatible p prec_empty -> p = prec_empty.
Lemma pl_compatible_empt_l :
forall p : prec_list, pl_compatible prec_empty p -> p = prec_empty.
Lemma pl_compatible_cons_r :
forall (p : prec_list) (a : ad) (la ls : prec_list),
pl_compatible p (prec_cons a la ls) ->
exists a0 : ad,
(exists la0 : prec_list,
(exists ls0 : prec_list, p = prec_cons a0 la0 ls0)).
Lemma pl_compatible_cons_l :
forall (p : prec_list) (a : ad) (la ls : prec_list),
pl_compatible (prec_cons a la ls) p ->
exists a0 : ad,
(exists la0 : prec_list,
(exists ls0 : prec_list, p = prec_cons a0 la0 ls0)).
Lemma pl_compatible_compat :
forall p0 p1 : prec_list, pl_compatible p0 p1 -> pl_compat p0 p1.