Fixpoint pl_path_product (p0 p1 : pl_path) {struct p1} : pl_path :=
  match p0, p1 with
  | pl_path_nil, pl_path_nil => pl_path_nil
  | pl_path_nil, pl_path_cons a b => pl_path_nil
  | pl_path_cons a b, pl_path_nil => pl_path_nil
  | pl_path_cons a0 b0, pl_path_cons a1 b1 =>
      pl_path_cons (iad_conv a0 a1) (pl_path_product b0 b1)
  end.

(* Specifications: *)
Lemma pl_path_product_n : forall (n : nat) (p0 p1 : pl_path), pl_path_length p0 = n -> pl_path_length p1 = n -> pl_path_length (pl_path_product p0 p1) = n.
Lemma pl_produit_path_incl_inj : forall (plp0 plp1 plp2 plp3 : pl_path) (n : nat), pl_path_length plp0 = n -> pl_path_length plp1 = n -> pl_path_length plp2 = n -> pl_path_length plp3 = n -> pl_path_product plp0 plp1 = pl_path_product plp2 plp3 -> plp0 = plp2 /\ plp1 = plp3.