proposition: Theorem spoly_is_minus : forall (a b : Term A n) (nZa : ~ zeroP (A:=A) A0 eqA (n:=n) a) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b) (p q : list (Term A n)) (Cpxa : canonical A0 eqA ltM (pX a p)) (Cpxb : canonical A0 eqA ltM (pX b q)), eqP A eqA n (spolyf (pX a p) (pX b q) Cpxa Cpxb) (minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) (pX a p)) (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) (pX b q))).
proof: Proof. Proof using plusA os cs. simpl in |- *; unfold LetP in |- *; simpl in |- *. intros a b nZa nZb p q Cpxa Cpxb. cut (canonical A0 eqA ltM p); [ intros Op | apply canonical_imp_canonical with (a := a); auto ]. cut (canonical A0 eqA ltM q); [ intros Oq | apply canonical_imp_canonical with (a := b); auto ]. cut (~ zeroP (A:=A) A0 eqA (n:=n) (ppc (A:=A) A1 (n:=n) a b)); [ intros nZppab | auto ]. apply (eqp_trans _ _ _ _ _ _ _ _ _ cs n) with (minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) p) (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) q)); auto. apply (eqp_trans _ _ _ _ _ _ _ _ _ cs n) with (y := minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec (pX (ppc (A:=A) A1 (n:=n) a b) (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) p)) (pX (ppc (A:=A) A1 (n:=n) a b) (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) q))). apply (eqp_sym _ _ _ _ _ _ _ _ _ cs n). apply minuspf_zero with (1 := cs); auto. cut (eqTerm (A:=A) eqA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (multTerm (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) a)); [ intros Z2 | auto ]. cut (eqTerm (A:=A) eqA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (multTerm (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) b)); [ intros Z3 | auto ]. apply minuspf_comp with (1 := cs); auto. apply canonical_pX_eqT with (a := multTerm (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) a); auto. change (canonical A0 eqA ltM (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) (pX a p))) in |- *; auto. apply (eqT_sym A n); apply (eqTerm_imp_eqT A eqA n); auto. apply canonical_pX_eqT with (a := multTerm (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) b); auto. change (canonical A0 eqA ltM (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) (pX b q))) in |- *; auto. apply (eqT_sym A n); apply (eqTerm_imp_eqT A eqA n); auto. change (canonical A0 eqA ltM (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=a) nZa) (pX a p))) in |- *; auto. change (canonical A0 eqA ltM (mults (A:=A) multA (n:=n) (divTerm (A:=A) (A0:=A0) (eqA:=eqA) divA (n:=n) (ppc (A:=A) A1 (n:=n) a b) (b:=b) nZb) (pX b q))) in |- *; auto. Qed.