intros a b nZa nZb p q Cpxa Cpxb; simpl in |- *; auto.
cut (canonical A0 eqA ltM p); [ intros Op1 | auto ]; auto.
cut (canonical A0 eqA ltM q); [ intros Op2 | auto ]; unfold LetP in |- *;
simpl in |- *; auto.
apply canonical_imp_canonical with (a := b); auto.
apply canonical_imp_canonical with (a := a); auto.
Qed.
Hint Resolve spolyf_def.

Theorem eqTerm_spolyf_red2 :
forall (a b c : Term A n) (nZa : ~ zeroP (A:=A) A0 eqA (n:=n) a)
(nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b)
(nZppab : ~ zeroP (A:=A) A0 eqA (n:=n) (ppc (A:=A) A1 (n:=n) a b)),
divP A A0 eqA multA divA n c a ->
divP A A0 eqA multA divA n c b ->
forall (p q r : list (Term A n)) (Cpxa : canonical A0 eqA ltM (pX a p))
(Cpxb : canonical A0 eqA ltM (pX b q)),
canonical A0 eqA ltM r ->
eqP A eqA n
(mults (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) c
(b:=ppc (A:=A) A1 (n:=n) a b) nZppab)
(spolyf (pX a p) (pX b q) Cpxa Cpxb))
(minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec
(spminusf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec c b
nZb r q)
(spminusf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec c a
nZa r p)).