(* Specifications: *)
Lemma upl_conv_0_correct_wrt_sign_invar : forall (p : prec_list) (n : nat), pl_tl_length p n -> pl_tl_length (upl_conv_0 p) n.
Lemma upl_conv_1_correct_wrt_sign_invar : forall (p : prec_list) (n : nat), pl_tl_length p n -> pl_tl_length (upl_conv_1 p) n.
Lemma umpl_conv_0_correct_wrt_sign_invar_0 : forall (s : state) (sigma : signature) (pa : pre_ad), state_correct_wrt_sign_with_offset s sigma pa -> state_correct_wrt_sign_with_offset (umpl_conv_0 s) sigma pa.
Lemma umpl_conv_0_correct_wrt_sign_invar : forall (s : state) (sigma : signature), state_correct_wrt_sign s sigma -> state_correct_wrt_sign (umpl_conv_0 s) sigma.
Lemma umpl_conv_1_correct_wrt_sign_invar_0 : forall (s : state) (sigma : signature) (pa : pre_ad), state_correct_wrt_sign_with_offset s sigma pa -> state_correct_wrt_sign_with_offset (umpl_conv_1 s) sigma pa.
Lemma umpl_conv_1_correct_wrt_sign_invar : forall (s : state) (sigma : signature), state_correct_wrt_sign s sigma -> state_correct_wrt_sign (umpl_conv_1 s) sigma.
Lemma udta_conv_0_correct_wrt_sign_invar_0 : forall (d : preDTA) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (udta_conv_0_aux d) sigma.
Lemma udta_conv_0_correct_wrt_sign_invar : forall (d : preDTA) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (udta_conv_0 d) sigma.
Lemma udta_conv_1_correct_wrt_sign_invar_0 : forall (d : preDTA) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (udta_conv_1_aux d) sigma.
Lemma udta_conv_1_correct_wrt_sign_invar : forall (d : preDTA) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (udta_conv_1 d) sigma.
Lemma umerge_correct_wrt_sign_invar : forall (d0 d1 : preDTA) (sigma : signature), predta_correct_wrt_sign d0 sigma -> predta_correct_wrt_sign d1 sigma -> predta_correct_wrt_sign (u_merge d0 d1) sigma.
Lemma union_pl_correct_wrt_sign_invar : forall (p0 p1 : prec_list) (n : nat), pl_tl_length p0 n -> pl_tl_length p1 n -> pl_tl_length (union_pl p0 p1) n.
Lemma union_mpl_correct_wrt_sign_invar_0 : forall (s : state) (a : ad) (p : prec_list) (pa : pre_ad) (sigma : signature), state_correct_wrt_sign_with_offset s sigma pa -> state_correct_wrt_sign_with_offset (M1 prec_list a p) sigma pa -> state_correct_wrt_sign_with_offset (union_mpl_0 a p s) sigma pa.
Lemma union_mpl_correct_wrt_sign_invar_1 : forall (s0 s1 : state) (pa : pre_ad) (sigma : signature), state_correct_wrt_sign_with_offset s0 sigma pa -> state_correct_wrt_sign_with_offset s1 sigma pa -> state_correct_wrt_sign_with_offset (union_mpl s0 s1) sigma pa.
Lemma union_mpl_correct_wrt_sign_invar : forall (s0 s1 : state) (sigma : signature), state_correct_wrt_sign s0 sigma -> state_correct_wrt_sign s1 sigma -> state_correct_wrt_sign (union_mpl s0 s1) sigma.
Lemma union_0_correct_wrt_sign_invar : forall (d : preDTA) (a0 a1 : ad) (s : state) (sigma : signature), predta_correct_wrt_sign d sigma -> union_0 d a0 a1 = Some s -> state_correct_wrt_sign s sigma.
Lemma insert_ostate_correct_wrt_sign_invar : forall (d : preDTA) (a : ad) (s : state) (sigma : signature), predta_correct_wrt_sign d sigma -> state_correct_wrt_sign s sigma -> predta_correct_wrt_sign (insert_ostate d a (Some s)) sigma.
Lemma union_correct_wrt_sign_invar : forall (d0 d1 : DTA) (sigma : signature), dta_correct_wrt_sign d0 sigma -> dta_correct_wrt_sign d1 sigma -> dta_correct_wrt_sign (union d0 d1) sigma.
Lemma upl_conv_0_ref_ok_invar : forall (p : prec_list) (a : ad), prec_occur (upl_conv_0 p) a -> exists b : ad, a = uad_conv_0 b /\ prec_occur p b.
Lemma upl_conv_1_ref_ok_invar : forall (p : prec_list) (a : ad), prec_occur (upl_conv_1 p) a -> exists b : ad, a = uad_conv_1 b /\ prec_occur p b.
Lemma udta_conv_0_ref_ok_invar_0 : forall (d : preDTA) (a : ad) (s : state) (c : ad) (p : prec_list) (b : ad), MapGet state (udta_conv_0 d) (uad_conv_0 a) = Some s -> MapGet prec_list s c = Some p -> prec_occur p b -> exists s' : state, (exists p' : prec_list, (exists b' : ad, MapGet state d a = Some s' /\ MapGet prec_list s' c = Some p' /\ p = upl_conv_0 p' /\ s = umpl_conv_0 s' /\ b = uad_conv_0 b' /\ prec_occur p' b')).
Lemma udta_conv_1_ref_ok_invar_0 : forall (d : preDTA) (a : ad) (s : state) (c : ad) (p : prec_list) (b : ad), MapGet state (udta_conv_1 d) (uad_conv_1 a) = Some s -> MapGet prec_list s c = Some p -> prec_occur p b -> exists s' : state, (exists p' : prec_list, (exists b' : ad, MapGet state d a = Some s' /\ MapGet prec_list s' c = Some p' /\ p = upl_conv_1 p' /\ s = umpl_conv_1 s' /\ b = uad_conv_1 b' /\ prec_occur p' b')).
Lemma udta_conv_0_ref_ok_invar : forall d : preDTA, preDTA_ref_ok d -> preDTA_ref_ok (udta_conv_0 d).
Lemma udta_conv_1_ref_ok_invar : forall d : preDTA, preDTA_ref_ok d -> preDTA_ref_ok (udta_conv_1 d).
Lemma MapMerge_ref_ok_invar : forall d0 d1 : preDTA, preDTA_ref_ok d0 -> preDTA_ref_ok d1 -> preDTA_ref_ok (MapMerge state d0 d1).
Lemma u_merge_ref_ok_invar : forall d0 d1 : preDTA, preDTA_ref_ok d0 -> preDTA_ref_ok d1 -> preDTA_ref_ok (u_merge d0 d1).
Lemma union_pl_ref_ok_invar : forall (p p' : prec_list) (d : preDTA), prec_list_ref_ok p d -> prec_list_ref_ok p' d -> prec_list_ref_ok (union_pl p p') d.
Lemma union_mpl_0_ref_ok_invar : forall (s : state) (a : ad) (p : prec_list) (d : preDTA), state_ref_ok (M1 prec_list a p) d -> state_ref_ok s d -> state_ref_ok (union_mpl_0 a p s) d.
Lemma union_mpl_correct_ref_ok_invar : forall (s0 s1 : state) (d : preDTA), state_ref_ok s0 d -> state_ref_ok s1 d -> state_ref_ok (union_mpl s0 s1) d.
Lemma union_ref_ok : forall d0 d1 : DTA, DTA_ref_ok d0 -> DTA_ref_ok d1 -> DTA_ref_ok (union d0 d1).
Lemma union_DTA_main_state_correct_invar : forall d0 d1 : DTA, DTA_main_state_correct d0 -> DTA_main_state_correct d1 -> DTA_main_state_correct (union d0 d1).
Lemma pl_path_recon_true : forall (d : preDTA) (plp : pl_path) (tl : term_list), pl_path_recon d tl plp -> pl_path_true plp (dta_non_empty_states d).
Lemma nat_sum : forall n : nat, n = 0 \/ (exists m : nat, n = S m).
Lemma le_n_n : forall n : nat, n <= n.
Lemma le_l_or_r : forall n m : nat, n <= m \/ m <= n.
Lemma plus_n_O : forall n : nat, n + 0 = n.
Lemma S_plus_l : forall n m : nat, S (n + m) = S n + m.
Lemma S_plus_r : forall n m : nat, S (n + m) = n + S m.
Lemma max_le_Sr_0 : forall n m : nat, max n m <= max n (S m) /\ max (S n) m <= max (S n) (S m).
Lemma max_le_Sr : forall n m : nat, max n m <= max n (S m).
Lemma plus_O_r : forall n : nat, n + 0 = n.
Lemma plus_O_l : forall n : nat, n + 0 = n.
Lemma le_mult_lS : forall n m : nat, n * m <= S n * m.
Lemma le_mult_rS : forall n m : nat, n * m <= n * S m.
Lemma le_disj : forall n m : nat, n <= m -> n = m \/ S n <= m.
Lemma le_mult_l : forall n m p : nat, n <= m -> n * p <= m * p.
Lemma le_mult_r : forall n m p : nat, n <= m -> p * n <= p * m.
Lemma le_mult_mult : forall n m p q : nat, n <= m -> p <= q -> n * p <= m * q.
Lemma Sn_eq_Sm_n_eq_m : forall n m : nat, S n = S m -> n = m.
Lemma bool_dec_eq : forall a b : bool, {a = b} + {a <> b}.
Lemma bool_is_false_or_true : forall a : bool, a = false \/ a = true.
Lemma bool_is_true_or_false : forall a : bool, a = true \/ a = false.
Lemma in_M0_false : forall (A : Set) (a : A), ~ (exists e : ad, MapGet A (M0 A) e = Some a).
Lemma in_M1_id : forall (A : Set) (a : A) (x : ad) (e : A), (exists c : ad, MapGet A (M1 A x e) c = Some a) -> a = e.
Lemma in_M2_disj : forall (A : Set) (a : A) (m0 m1 : Map A), (exists c : ad, MapGet A (M2 A m0 m1) c = Some a) -> (exists c : ad, MapGet A m0 c = Some a) \/ (exists c : ad, MapGet A m1 c = Some a).
Lemma aux_Neqb_1_0 : forall p : positive, Peqb p p = true.
Lemma aux_Neqb_1_1 : forall p p0 : positive, Peqb p p0 = true -> p = p0.
Lemma aux_Neqb_trans : forall a b c : ad, Neqb a b = true -> Neqb b c = true -> Neqb a c = true.
Lemma indprinciple_nat_gen : forall P : nat -> Prop, (forall n : nat, (forall m : nat, m < n -> P m) -> P n) -> forall n m : nat, m <= n -> P m.
Lemma beq_nat_complete : forall n m : nat, beq_nat n m = true -> n = m.
Lemma beq_nat_correct : forall n : nat, beq_nat n n = true.
Lemma pl_produit_correct_wrt_sign_invar : forall (p0 p1 : prec_list) (n : nat), pl_tl_length p0 n -> pl_tl_length p1 n -> pl_tl_length (pl_produit p0 p1) n.
Lemma st_produit_l_correct_wrt_sign_invar_with_offset : forall (s0 : state) (a : ad) (p : prec_list) (sigma : signature) (pa : pre_ad), state_correct_wrt_sign_with_offset s0 sigma pa -> state_correct_wrt_sign_with_offset (M1 prec_list a p) sigma pa -> state_correct_wrt_sign_with_offset (s_produit_l a p s0) sigma pa.
Lemma st_produit_r_correct_wrt_sign_invar_with_offset : forall (s0 : state) (a : ad) (p : prec_list) (sigma : signature) (pa : pre_ad), state_correct_wrt_sign_with_offset s0 sigma pa -> state_correct_wrt_sign_with_offset (M1 prec_list a p) sigma pa -> state_correct_wrt_sign_with_offset (s_produit_r a p s0) sigma pa.
Lemma st_produit_correct_wrt_sign_invar_with_offset : forall (s0 s1 : state) (sigma : signature) (pa : pre_ad), state_correct_wrt_sign_with_offset s0 sigma pa -> state_correct_wrt_sign_with_offset s1 sigma pa -> state_correct_wrt_sign_with_offset (s_produit s0 s1) sigma pa.
Lemma st_produit_correct_wrt_sign_invar : forall (s0 s1 : state) (sigma : signature), state_correct_wrt_sign s0 sigma -> state_correct_wrt_sign s1 sigma -> state_correct_wrt_sign (s_produit s0 s1) sigma.
Lemma positive_sum : forall p : positive, p = 1%positive \/ (exists q : positive, p = xO q) \/ (exists q : positive, p = xI q).
Lemma preDTA_produit_l_correct_wrt_sign_invar : forall (d : preDTA) (a : ad) (s : state) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (M1 state a s) sigma -> predta_correct_wrt_sign (preDTA_produit_l a s d) sigma.
Lemma preDTA_produit_r_correct_wrt_sign_invar : forall (d : preDTA) (a : ad) (s : state) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (M1 state a s) sigma -> predta_correct_wrt_sign (preDTA_produit_r a s d) sigma.
Lemma preDTA_produit_correct_wrt_sign_invar : forall (d0 d1 : preDTA) (sigma : signature), predta_correct_wrt_sign d0 sigma -> predta_correct_wrt_sign d1 sigma -> predta_correct_wrt_sign (preDTA_produit d0 d1) sigma.
Lemma inter_correct_wrt_sign_invar : forall (d0 d1 : DTA) (sigma : signature), dta_correct_wrt_sign d0 sigma -> dta_correct_wrt_sign d1 sigma -> dta_correct_wrt_sign (inter d0 d1) sigma.
Lemma prec_list_kill_correct_wrt_sign_invar : forall (m : Map bool) (p p' : prec_list) (n : nat), pl_tl_length p n -> prec_list_kill m p = Some p' -> pl_tl_length p' n.
Lemma states_kill_aux_correct_wrt_sign_invar : forall (s : state) (m : Map bool) (sigma : signature), state_correct_wrt_sign s sigma -> state_correct_wrt_sign (states_kill_aux m s) sigma.
Lemma states_kill_correct_wrt_sign_invar : forall (s s' : state) (m : Map bool) (sigma : signature), state_correct_wrt_sign s sigma -> states_kill m s = Some s' -> state_correct_wrt_sign s' sigma.
Lemma preDTA_kill_correct_wrt_sign_invar : forall (d : preDTA) (m : Map bool) (sigma : signature), predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (preDTA_kill m d) sigma.
Lemma DTA_kill_correct_wrt_sign_invar : forall (d : DTA) (m : Map bool) (sigma : signature), dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (DTA_kill m d) sigma.
Lemma DTA_kill_empty_states_lazy_correct_wrt_sign_invar : forall (d : DTA) (sigma : signature), dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (DTA_kill_empty_states_lazy d) sigma.
Lemma kill_empty_correct_wrt_sign_invar : forall (d : DTA) (sigma : signature), dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (DTA_kill_empty_states d) sigma.
Lemma kill_empty_lazy_correct_wrt_sign_invar : forall (d : DTA) (sigma : signature), dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (DTA_kill_empty_states_lazy d) sigma.
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).
Lemma inter_DTA_main_state_correct_invar : forall d : DTA, DTA_main_state_correct d -> DTA_main_state_correct (DTA_kill (dta_states_non_empty d) d).
Lemma inter_DTA_main_state_correct_invar_lazy : forall d : DTA, DTA_main_state_correct d -> DTA_main_state_correct (DTA_kill_empty_states_lazy d).
Lemma predta_kill_non_coacc_correct_wrt_sign : forall (d : preDTA) (a : ad) (sigma : signature), preDTA_ref_ok d -> predta_correct_wrt_sign d sigma -> predta_correct_wrt_sign (predta_kill_non_coacc d a) sigma.
Lemma dta_kill_non_coacc_correct_wrt_sign : forall (d : DTA) (sigma : signature), DTA_ref_ok d -> dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (dta_kill_non_coacc d) sigma.
Lemma dta_kill_non_coacc_lazy_correct_wrt_sign : forall (d : DTA) (sigma : signature), DTA_ref_ok d -> dta_correct_wrt_sign d sigma -> dta_correct_wrt_sign (dta_kill_non_coacc_lazy d) sigma.
Lemma predta_kill_non_coacc_correct_ref_ok : forall (d : preDTA) (a : ad), preDTA_ref_ok d -> preDTA_ref_ok (predta_kill_non_coacc d a).
Lemma dta_kill_non_coacc_correct_ref_ok : forall d : DTA, DTA_ref_ok d -> DTA_ref_ok (dta_kill_non_coacc d).
Lemma dta_kill_non_coacc_lazy_correct_ref_ok : forall d : DTA, DTA_ref_ok d -> DTA_ref_ok (dta_kill_non_coacc_lazy d).
Lemma dta_kill_non_coacc_correct_main_state : forall d : DTA, DTA_ref_ok d -> DTA_main_state_correct d -> DTA_main_state_correct (dta_kill_non_coacc d).
Lemma dta_kill_non_coacc_lazy_correct_main_state : forall d : DTA, DTA_ref_ok d -> DTA_main_state_correct d -> DTA_main_state_correct (dta_kill_non_coacc_lazy d).