intros p; case p; auto.
intros x; case x; simpl in |- *; auto.
intros a l H' J.
cut (~ zeroP (A:=A) A0 eqA (n:=n) a); [ intros Z | idtac ].
apply divTerm_def with (nZb := Z).
apply canonical_nzeroP with (p := l) (ltM := ltM); auto.
apply
(eqTerm_trans _ _ _ _ _ _ _ _ _ cs n)
with (y := multTerm (A:=A) multA (n:=n) (T1 A1 n) a);
auto.
apply (eqTerm_sym _ _ _ _ _ _ _ _ _ cs n); auto.
apply canonical_nzeroP with (p := l) (ltM := ltM); auto.
Qed.

(* Specifications: *)
Theorem redacc_divp :
forall (L1 L2 : list (poly A0 eqA ltM)) (p : poly A0 eqA ltM),
~ zerop A A0 eqA n ltM p ->
In p (L1 ++ L2) ->
exists q : poly A0 eqA ltM,
In q (redacc L1 L2 ++ L2) /\
divp A A0 eqA multA divA n ltM p q /\ ~ zerop A A0 eqA n ltM q.