Fixpoint multpf (p : list (Term A n)) : list (Term A n) -> list (Term A n) :=
  fun q : list (Term A n) =>
  match p with
  | nil => pO A n
  | a :: p' =>
      pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec
        (mults (A:=A) multA (n:=n) a q) (multpf p' q)
  end.

Theorem multpf_smultm_assoc : forall (p q : list (Term A n)) (a : Term A n), canonical A0 eqA ltM p -> canonical A0 eqA ltM q -> ~ zeroP (A:=A) A0 eqA (n:=n) a -> eqP A eqA n (mults (A:=A) multA (n:=n) a (multpf p q)) (multpf (mults (A:=A) multA (n:=n) a p) q).