Inductive reduce (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> list (Term A n) -> Prop :=
  | reducetop :
      forall (a b : Term A n) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b)
        (p q r : list (Term A n)),
      inPolySet (pX b q) Q ->
      divP A A0 eqA multA divA n a b ->
      eqP A eqA n
        (spminusf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec a
           b nZb p q) r -> reduce Q (pX a p) r
  | reduceskip :
      forall (a b : Term A n) (p q : list (Term A n)),
      reduce Q p q ->
      eqTerm (A:=A) eqA (n:=n) a b -> reduce Q (pX a p) (pX b q).Inductive reduce (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> list (Term A n) -> Prop :=
  | reducetop :
      forall (a b : Term A n) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b)
        (p q r : list (Term A n)),
      inPolySet (pX b q) Q ->
      divP A A0 eqA multA divA n a b ->
      eqP A eqA n
        (spminusf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec a
           b nZb p q) r -> reduce Q (pX a p) r
  | reduceskip :
      forall (a b : Term A n) (p q : list (Term A n)),
      reduce Q p q ->
      eqTerm (A:=A) eqA (n:=n) a b -> reduce Q (pX a p) (pX b q).Inductive reduce (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> list (Term A n) -> Prop :=
  | reducetop :
      forall (a b : Term A n) (nZb : ~ zeroP (A:=A) A0 eqA (n:=n) b)
        (p q r : list (Term A n)),
      inPolySet (pX b q) Q ->
      divP A A0 eqA multA divA n a b ->
      eqP A eqA n
        (spminusf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec a
           b nZb p q) r -> reduce Q (pX a p) r
  | reduceskip :
      forall (a b : Term A n) (p q : list (Term A n)),
      reduce Q p q ->
      eqTerm (A:=A) eqA (n:=n) a b -> reduce Q (pX a p) (pX b q).

Theorem mults_eqp_inv : forall (a : Term A n) (p q : list (Term A n)), eqP A eqA n (mults (A:=A) multA (n:=n) a p) (mults (A:=A) multA (n:=n) a q) -> ~ zeroP (A:=A) A0 eqA (n:=n) a -> eqP A eqA n p q.