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.