(* invariant sur ref_ok pour le kill_empty *)

(* Specifications: *)
Lemma prec_list_kill_occur :
forall (p p' : prec_list) (b : ad) (m : Map bool),
prec_list_kill m p = Some p' ->
prec_occur p' b -> MapGet bool m b = Some true.
Lemma prec_list_kill_ref_ok_invar :
forall (d : preDTA) (p p' : prec_list) (sigma : signature),
prec_list_ref_ok p d ->
predta_correct_wrt_sign d sigma ->
prec_list_kill (dta_non_empty_states d) p = Some p' ->
prec_list_ref_ok p' (preDTA_kill (dta_non_empty_states d) d).
Lemma states_kill_aux_ref_ok_invar :
forall (d : preDTA) (s : state) (sigma : signature),
state_ref_ok s d ->
predta_correct_wrt_sign d sigma ->
state_ref_ok (states_kill_aux (dta_non_empty_states d) s)
(preDTA_kill (dta_non_empty_states d) d).
Lemma states_kill_ref_ok_invar :
forall (d : preDTA) (s s' : state) (sigma : signature),
state_ref_ok s d ->
predta_correct_wrt_sign d sigma ->
states_kill (dta_non_empty_states d) s = Some s' ->
state_ref_ok s' (preDTA_kill (dta_non_empty_states d) d).
Lemma preDTA_kill_ref_ok_distinct_invar :
forall (d : preDTA) (sigma : signature),
preDTA_ref_ok_distinct d d ->
predta_correct_wrt_sign d sigma ->
preDTA_ref_ok_distinct (preDTA_kill (dta_non_empty_states d) d)
(preDTA_kill (dta_non_empty_states d) d).
Lemma preDTA_kill_ref_ok_invar :
forall (d : preDTA) (sigma : signature),
preDTA_ref_ok d ->
predta_correct_wrt_sign d sigma ->
preDTA_ref_ok (preDTA_kill (dta_non_empty_states d) d).
Lemma DTA_kill_ref_ok_invar :
forall (d : DTA) (sigma : signature),
DTA_ref_ok d ->
dta_correct_wrt_sign d sigma ->
DTA_ref_ok (DTA_kill (dta_states_non_empty d) d).
Lemma DTA_kill_ref_ok_invar_lazy :
forall (d : DTA) (sigma : signature),
DTA_ref_ok d ->
dta_correct_wrt_sign d sigma -> DTA_ref_ok (DTA_kill_empty_states_lazy d).