Definition mks :
  forall p : list (Term A n), canonical A0 eqA ltM p -> poly A0 eqA ltM.Definition selectdivf :
  forall a : Term A n,
  ~ zeroP (A:=A) A0 eqA (n:=n) a ->
  forall Q : list (poly A0 eqA ltM),
  {q : list (Term A n) |
  exists b : Term A n,
    (exists p : list (Term A n),
       divP A A0 eqA multA divA n a b /\
       inPolySet A A0 eqA n ltM q Q /\ q = pX b p)} +
  {(forall (b : Term A n) (q : list (Term A n)),
    inPolySet A A0 eqA n ltM (pX b q) Q -> ~ divP A A0 eqA multA divA n a b)}.Definition selectpolyf :
  forall (Q : list (poly A0 eqA ltM)) (r : list (Term A n)),
  canonical A0 eqA ltM r ->
  {q : list (Term A n) |
  reduce A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q r q} +
  {irreducible A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q r}.Definition Reducef :
  forall (Q : list (poly A0 eqA ltM)) (p : poly A0 eqA ltM),
  {q : poly A0 eqA ltM |
  reducestar Q (s2p A A0 eqA n ltM p) (s2p A A0 eqA n ltM q)}.

Theorem reducestar_inv : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)), reducestar Q p q -> canonical A0 eqA ltM p -> eqP A eqA n p q /\ irreducible A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p \/ (exists r : list (Term A n), reduce A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p r /\ reducestar Q r q).