Definition buch : list (poly A0 eqA ltM) -> list (poly A0 eqA ltM).

(* Specifications: *)
Theorem buch_Stable : forall P : list (poly A0 eqA ltM), stable P (buch P).
Theorem buch_reds : forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM), In a (buch P) -> In b (buch P) -> reds a b (buch P).
Theorem reds_SpolyQ : forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM), reds a b P -> Spoly_1 A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec P (s2p A A0 eqA n ltM a) (s2p A A0 eqA n ltM b).
Theorem imp_in : forall (P : list (poly A0 eqA ltM)) (a : list (Term A n)), inPolySet A A0 eqA n ltM a P -> exists b : poly A0 eqA ltM, In b P /\ a = s2p A A0 eqA n ltM b.
Theorem reds_SpolyQ1 : forall P : list (poly A0 eqA ltM), (forall a b : poly A0 eqA ltM, In a P -> In b P -> reds a b P) -> SpolyQ A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec P.
Theorem buch_spolyQ : forall P : list (poly A0 eqA ltM), SpolyQ A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec (buch P).
Theorem buch_Grobner : forall P : list (poly A0 eqA ltM), Grobner A A0 A1 eqA plusA invA minusA multA divA eqA_dec n ltM ltM_dec (buch P).