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).