(* passage au produit de la propriété pl_tl_length *)

Definition pl_tl_length_prod_def_0 (pl0 pl1 : prec_list) : Prop :=
  forall (l : prec_list) (a : ad) (n m : nat),
  pl_essence pl0 pl1 <= m ->
  pl_tl_length pl0 n ->
  pl_tl_length l (S n) \/ l = prec_empty ->
  (pl_tl_length pl1 (S n) -> pl_tl_length (pl_produit_0 a pl0 pl1 m l) (S n)) /\
  (pl1 = prec_empty ->
   (pl_tl_length l (S n) -> pl_tl_length (pl_produit_0 a pl0 pl1 m l) (S n)) /\
   (l = prec_empty -> pl_produit_0 a pl0 pl1 m l = prec_empty)).Definition pl_tl_length_prod_def_1 (pl0 pl1 : prec_list) : Prop :=
  forall n m : nat,
  pl_tl_length pl0 n ->
  pl_tl_length pl1 n ->
  pl_essence pl0 pl1 <= m -> pl_tl_length (pl_produit_1 pl0 m pl1) n.

(* Specifications: *)
Lemma pl_tl_length_prod_0 : forall p : prec_list, pl_tl_length_prod_def_0 p prec_empty.
Lemma pl_tl_length_prod_1 : forall p : prec_list, pl_tl_length_prod_def_1 p prec_empty.
Lemma pl_tl_length_prod_2 : forall p : prec_list, pl_tl_length_prod_def_1 prec_empty p.
Lemma pl_tl_length_prod_3 : forall (a : ad) (la ls p : prec_list), pl_tl_length_prod_def_0 p ls -> pl_tl_length_prod_def_1 p la -> pl_tl_length_prod_def_0 p (prec_cons a la ls).
Lemma pl_tl_length_prod_4 : forall (a : ad) (la ls p : prec_list), pl_tl_length_prod_def_0 la p -> pl_tl_length_prod_def_1 ls p -> pl_tl_length_prod_def_1 (prec_cons a la ls) p.
Lemma pl_tl_length_prod_5 : forall p p' : prec_list, pl_tl_length_prod_def_0 p p' /\ pl_tl_length_prod_def_1 p p'.
Lemma pl_tl_length_prod : forall (pl0 pl1 : prec_list) (n : nat), pl_tl_length pl0 n -> pl_tl_length pl1 n -> pl_tl_length (pl_produit pl0 pl1) n.
Lemma pl_produit_path_incl_0 : forall (n : nat) (a : ad) (la pl l : prec_list) (plp : pl_path), pl_path_incl plp l -> plp <> pl_path_nil -> pl_essence la pl <= n -> pl_path_incl plp (pl_produit_0 a la pl n l).