intros p; case p; simpl in |- *; auto.
intros a l q; case q; unfold LetP in |- *; simpl in |- *; auto.
intros a0 l0 H' H'0.
cut (canonical A0 eqA ltM l0);
[ intros Op1 | apply canonical_imp_canonical with (a := a0) ];
auto.
cut (canonical A0 eqA ltM l);
[ intros Op2 | apply canonical_imp_canonical with (a := a) ];
auto.
cut (~ zeroP (A:=A) A0 eqA (n:=n) a);
[ intros Z0 | apply canonical_nzeroP with (ltM := ltM) (p := l); auto ].
cut (~ zeroP (A:=A) A0 eqA (n:=n) a0);
[ intros Z1 | apply canonical_nzeroP with (ltM := ltM) (p := l0) ];
auto.
Qed.
Hint Resolve spolyf_canonical.

(* Specifications: *)
Theorem spolyf_pO :
forall (a : list (Term A n)) (Ca : canonical A0 eqA ltM a),
eqP A eqA n (spolyf a a Ca Ca) (pO A n).