(* correction d'un preDTA : pas de référence à des adresses extérieures à l'automate *)

Definition prec_list_ref_ok (p : prec_list) (d : preDTA) : Prop :=
  forall a : ad,
  prec_occur p a -> exists s : state, MapGet state d a = Some s.Definition state_ref_ok (s : state) (d : preDTA) : Prop :=
  forall (a : ad) (p : prec_list),
  MapGet prec_list s a = Some p -> prec_list_ref_ok p d.Definition preDTA_ref_ok (d : preDTA) : Prop :=
  forall (a : ad) (s : state) (c : ad) (pl : prec_list) (b : ad),
  MapGet state d a = Some s ->
  MapGet prec_list s c = Some pl ->
  prec_occur pl b -> exists s0 : state, MapGet state d b = Some s0.Definition preDTA_ref_ok_distinct (d d' : preDTA) : Prop :=
  forall (a : ad) (s : state),
  MapGet state d a = Some s -> state_ref_ok s d'.Definition DTA_ref_ok (d : DTA) : Prop :=
  match d with
  | dta p a => preDTA_ref_ok p
  end.

Lemma state_ref_ok_M2_destr : forall (s0 s1 : state) (d : preDTA), state_ref_ok (M2 prec_list s0 s1) d -> state_ref_ok s0 d /\ state_ref_ok s1 d.