intros a b H' p q H'0 H'1 c H'2.
cut (canonical A0 eqA ltM p);
[ intros Op0 | apply canonical_imp_canonical with (a := a) ];
auto.
cut (canonical A0 eqA ltM q);
[ intros Op1 | apply canonical_imp_canonical with (a := b) ];
auto.
cut (~ zeroP (A:=A) A0 eqA (n:=n) a);
[ intros Z0 | apply canonical_nzeroP with (ltM := ltM) (p := p) ];
auto.
cut (~ zeroP (A:=A) A0 eqA (n:=n) b);
[ intros Z1 | apply canonical_nzeroP with (ltM := ltM) (p := q) ];
auto.
apply minuspf_spoly_in with (a := a) (b := b) (nZa := Z0) (nZb := Z1); auto.
intros c0 H'6.
apply multTerm_or_z_d1 with (p := p); auto.
intros c0 H'6.
apply multTerm_or_z_d2 with (p := q); auto.
Qed.

(* Specifications: *)
Theorem divPp_mults1 :
forall a : Term A n,
~ zeroP (A:=A) A0 eqA (n:=n) a ->
forall p : list (Term A n),
(forall b : Term A n, In b p -> ~ zeroP (A:=A) A0 eqA (n:=n) b) ->
divPp a (mults (A:=A) multA (n:=n) a p).