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