intros a nZa p; elim p; simpl in |- *; auto.
intros a0 l H'0 q H'1 H'2.
cut (canonical A0 eqA ltM l);
[ intros Op0 | apply canonical_imp_canonical with (a := a0); auto ].
cut
(canonical A0 eqA ltM
(multpf A A0 eqA plusA multA eqA_dec n ltM ltM_dec l q));
[ intros Op1 | auto ].
cut (~ zeroP (A:=A) A0 eqA (n:=n) a0);
[ intros Z0 | apply canonical_nzeroP with (ltM := ltM) (p := l); auto ].
apply eqp_pluspf_com with (1 := cs); auto.
apply
(eqp_trans _ _ _ _ _ _ _ _ _ cs n)
with
(y := mults (A:=A) multA (n:=n)
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n)
(multTerm (A:=A) multA (n:=n) a a0) (b:=a) nZa) q).
apply (eqp_sym _ _ _ _ _ _ _ _ _ cs n).
apply divp_is_multTerm; auto.
apply mults_comp with (1 := cs); auto.
apply
(eqTerm_trans _ _ _ _ _ _ _ _ _ cs n)
with
(y := multTerm (A:=A) multA (n:=n) a0
(divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) a (b:=a) nZa));
auto.
apply
(eqTerm_trans _ _ _ _ _ _ _ _ _ cs n)
with
(y := divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n)
(multTerm (A:=A) multA (n:=n) a0 a) (b:=a) nZa);
auto.
apply (eqTerm_sym _ _ _ _ _ _ _ _ _ cs n); auto.
Qed.

(* Specifications: *)
Theorem sp_Rminus :
forall (a b : Term A n) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b)
(p q : list (Term A n)),
canonical A0 eqA ltM (pX a p) ->
canonical A0 eqA ltM (pX b q) ->
eqP A eqA n
(Rminus b nZb
(minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec
(mults (A:=A) multA (n:=n) b p) (mults (A:=A) multA (n:=n) a q))
(pX b q) (mults (A:=A) multA (n:=n) b p))
(mults (A:=A) multA (n:=n) (invTerm (A:=A) invA (n:=n) (T1 A1 n))
(multpf A A0 eqA plusA multA eqA_dec n ltM ltM_dec (pX a p) q)).