Definition pl_produit_ref_ok_0 (la pl : prec_list) : Prop :=
  forall (a b : ad) (l : prec_list) (n : nat),
  prec_occur (pl_produit_0 a la pl n l) b ->
  (exists a0 : ad,
     (exists a1 : ad,
        b = iad_conv a0 a1 /\ prec_occur la a0 /\ prec_occur pl a1)) \/
  (exists a1 : ad, b = iad_conv a a1 /\ prec_occur pl a1) \/ prec_occur l b.Definition pl_produit_ref_ok_1 (p0 p1 : prec_list) : Prop :=
  forall (b : ad) (n : nat),
  prec_occur (pl_produit_1 p0 n p1) b ->
  exists a0 : ad,
    (exists a1 : ad,
       b = iad_conv a0 a1 /\ prec_occur p0 a0 /\ prec_occur p1 a1).

(* Specifications: *)
Lemma pl_produit_ref_ok_lem_0 : forall p : prec_list, pl_produit_ref_ok_0 p prec_empty.
Lemma pl_produit_ref_ok_lem_1 : forall p : prec_list, pl_produit_ref_ok_1 p prec_empty.
Lemma pl_produit_ref_ok_lem_2 : forall p : prec_list, pl_produit_ref_ok_1 prec_empty p.
Lemma pl_produit_ref_ok_lem_3 : forall (a : ad) (la ls p : prec_list), pl_produit_ref_ok_0 p ls -> pl_produit_ref_ok_1 p la -> pl_produit_ref_ok_0 p (prec_cons a la ls).
Lemma pl_produit_ref_ok_lem_4 : forall (a : ad) (la ls p : prec_list), pl_produit_ref_ok_0 la p -> pl_produit_ref_ok_1 ls p -> pl_produit_ref_ok_1 (prec_cons a la ls) p.
Lemma pl_produit_ref_ok_lem_5 : forall p p' : prec_list, pl_produit_ref_ok_0 p p' /\ pl_produit_ref_ok_1 p p'.
Lemma pl_produit_ref_ok_lem_6 : forall (p0 p1 : prec_list) (b : ad), prec_occur (pl_produit p0 p1) b -> exists a0 : ad, (exists a1 : ad, b = iad_conv a0 a1 /\ prec_occur p0 a0 /\ prec_occur p1 a1).
Lemma pl_produit_ref_ok : forall (p0 p1 : prec_list) (d0 d1 : preDTA), prec_list_ref_ok p0 d0 -> prec_list_ref_ok p1 d1 -> prec_list_ref_ok (pl_produit p0 p1) (preDTA_produit d0 d1).
Lemma s_produit_l_ref_ok : forall (s : state) (a : ad) (p : prec_list) (d0 d1 : preDTA), state_ref_ok s d1 -> state_ref_ok (M1 prec_list a p) d0 -> state_ref_ok (s_produit_l a p s) (preDTA_produit d0 d1).
Lemma s_produit_r_ref_ok : forall (s : state) (a : ad) (p : prec_list) (d0 d1 : preDTA), state_ref_ok s d1 -> state_ref_ok (M1 prec_list a p) d0 -> state_ref_ok (s_produit_r a p s) (preDTA_produit d1 d0).
Lemma st_M0_ref_ok : forall d : preDTA, state_ref_ok (M0 prec_list) d.
Lemma s_produit_ref_ok : forall (s0 s1 : state) (d0 d1 : preDTA), state_ref_ok s0 d0 -> state_ref_ok s1 d1 -> state_ref_ok (s_produit s0 s1) (preDTA_produit d0 d1).
Lemma preDTA_produit_l_ref_ok : forall (d d0 d1 : preDTA) (s : state) (a : ad), preDTA_ref_ok_distinct d d1 -> preDTA_ref_ok_distinct (M1 state a s) d0 -> preDTA_ref_ok_distinct (preDTA_produit_l a s d) (preDTA_produit d0 d1).
Lemma preDTA_produit_r_ref_ok : forall (d d0 d1 : preDTA) (s : state) (a : ad), preDTA_ref_ok_distinct d d0 -> preDTA_ref_ok_distinct (M1 state a s) d1 -> preDTA_ref_ok_distinct (preDTA_produit_r a s d) (preDTA_produit d0 d1).
Lemma preDTA_produit_ref_okd : forall d0 d1 d0' d1' : preDTA, preDTA_ref_ok_distinct d0 d0' -> preDTA_ref_ok_distinct d1 d1' -> preDTA_ref_ok_distinct (preDTA_produit d0 d1) (preDTA_produit d0' d1').
Lemma preDTA_produit_ref_ok : forall d0 d1 : preDTA, preDTA_ref_ok d0 -> preDTA_ref_ok d1 -> preDTA_ref_ok (preDTA_produit d0 d1).
Lemma DTA_inter_ref_ok_invar : forall d0 d1 : DTA, DTA_ref_ok d0 -> DTA_ref_ok d1 -> DTA_ref_ok (inter d0 d1).
Lemma inter_DTA_main_state_correct_invar : forall d0 d1 : DTA, DTA_main_state_correct d0 -> DTA_main_state_correct d1 -> DTA_main_state_correct (inter d0 d1).