Definition pl_produit_0_incr (p0 p1 : prec_list) : Prop :=
forall (a : ad) (l : prec_list) (n : nat),
pl_essence p0 p1 <= n ->
pl_produit_0 a p0 p1 (pl_essence p0 p1) l = pl_produit_0 a p0 p1 n l.
Definition pl_produit_1_incr (p0 p1 : prec_list) : Prop :=
forall n : nat,
pl_essence p0 p1 <= n ->
pl_produit_1 p0 (pl_essence p0 p1) p1 = pl_produit_1 p0 n p1.

(* Specifications: *)
Lemma pl_product_0_0 : forall p : prec_list, pl_produit_0_incr p prec_empty.
Lemma pl_product_0_1 : forall p : prec_list, pl_produit_1_incr p prec_empty.
Lemma pl_product_0_2 : forall p : prec_list, pl_produit_1_incr prec_empty p.
Lemma pl_product_0_3 :
forall (a : ad) (la ls p : prec_list),
pl_produit_0_incr p ls ->
pl_produit_1_incr p la -> pl_produit_0_incr p (prec_cons a la ls).
Lemma pl_product_0_4 :
forall (a : ad) (la ls p : prec_list),
pl_produit_0_incr la p ->
pl_produit_1_incr ls p -> pl_produit_1_incr (prec_cons a la ls) p.
Lemma pl_product_0_5 :
forall p p' : prec_list, pl_produit_0_incr p p' /\ pl_produit_1_incr p p'.
Lemma pl_product_0 :
forall p0 p1 : prec_list,
(forall (a : ad) (l : prec_list) (n : nat),
pl_essence p0 p1 <= n ->
pl_produit_0 a p0 p1 (pl_essence p0 p1) l = pl_produit_0 a p0 p1 n l) /\
(forall n : nat,
pl_essence p0 p1 <= n ->
pl_produit_1 p0 (pl_essence p0 p1) p1 = pl_produit_1 p0 n p1).
Lemma pl_product_0_invar_essence :
forall (p0 p1 : prec_list) (n : nat),
pl_essence p0 p1 <= n ->
pl_produit_1 p0 (pl_essence p0 p1) p1 = pl_produit_1 p0 n p1.
Lemma pl_product_1 :
forall (a : ad) (la pl l : prec_list) (n : nat),
pl_essence la pl <= n ->
pl_produit_0 a la pl n l = prec_empty -> pl = prec_empty.