intros a b nZb H'; inversion H'.
intros p; elim p; simpl in |- *; auto.
intros a1 p1 H'0 H'1.
cut (canonical A0 eqA ltM p1);
[ intros Op0 | apply canonical_imp_canonical with (a := a1) ];
auto.
cut (~ zeroP (A:=A) A0 eqA (n:=n) a1);
[ intros Z0 | apply canonical_nzeroP with (ltM := ltM) (p := p1) ];
auto.
apply
(eqp_trans _ _ _ _ _ _ _ _ _ cs n)
with
(y := pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec
(pX
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n)
(multTerm (A:=A) multA (n:=n) a a1) (b:=b) nZb)
(pO A n))
(mults (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=b) nZb)
p1)); auto.
cut
(eqTerm (A:=A) eqA (n:=n)
(multTerm (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=b) nZb) a1)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n)
(multTerm (A:=A) multA (n:=n) a a1) (b:=b) nZb));
auto.
intros H'2.
apply
(eqp_trans _ _ _ _ _ _ _ _ _ cs n)
with
(y := pX
(multTerm (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=b) nZb)
a1)
(pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM)
ltM_dec (pO A n)
(mults (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=b)
nZb) p1))); auto.
apply (eqp_sym _ _ _ _ _ _ _ _ _ cs n); auto.
rewrite pluspf_inv1_eqa; auto.
change
(canonical A0 eqA ltM
(mults (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=b) nZb)
(pX a1 p1))) in |- *; auto.
apply (eqTerm_sym _ _ _ _ _ _ _ _ _ cs n);
apply divTerm_multTerm_r with (1 := cs); auto.
Qed.

(* Specifications: *)
Theorem Rminus_is_mult :
forall (r p q : list (Term A n)) (a : Term A n)
(nZa : ~ zeroP (A:=A) A0 eqA (n:=n) a),
canonical A0 eqA ltM p ->
canonical A0 eqA ltM q ->
canonical A0 eqA ltM r ->
divPp a r ->
eqP A eqA n (Rminus a nZa p q r)
(minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec p
(Dmult a nZa r q)).