Inductive OBuch :
list (poly A0 eqA ltM) ->
list (poly A0 eqA ltM) -> list (poly A0 eqA ltM) -> Prop :=
  | OBuch0 : forall aL : list (poly A0 eqA ltM), OBuch aL nil aL
  | OBuch1 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch
        (addEnd A A0 eqA n ltM
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP)
        (genPcPf
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP Q) R ->
      ~
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R
  | OBuch2 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch aP Q R ->
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R.Inductive OBuch :
list (poly A0 eqA ltM) ->
list (poly A0 eqA ltM) -> list (poly A0 eqA ltM) -> Prop :=
  | OBuch0 : forall aL : list (poly A0 eqA ltM), OBuch aL nil aL
  | OBuch1 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch
        (addEnd A A0 eqA n ltM
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP)
        (genPcPf
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP Q) R ->
      ~
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R
  | OBuch2 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch aP Q R ->
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R.Inductive OBuch :
list (poly A0 eqA ltM) ->
list (poly A0 eqA ltM) -> list (poly A0 eqA ltM) -> Prop :=
  | OBuch0 : forall aL : list (poly A0 eqA ltM), OBuch aL nil aL
  | OBuch1 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch
        (addEnd A A0 eqA n ltM
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP)
        (genPcPf
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP Q) R ->
      ~
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R
  | OBuch2 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch aP Q R ->
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R.Inductive OBuch :
list (poly A0 eqA ltM) ->
list (poly A0 eqA ltM) -> list (poly A0 eqA ltM) -> Prop :=
  | OBuch0 : forall aL : list (poly A0 eqA ltM), OBuch aL nil aL
  | OBuch1 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch
        (addEnd A A0 eqA n ltM
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP)
        (genPcPf
           (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
              ltM_dec os a aP) aP Q) R ->
      ~
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R
  | OBuch2 :
      forall (a : poly A0 eqA ltM) (aP Q R : list (poly A0 eqA ltM)),
      OBuch aP Q R ->
      BuchAux.zerop A A0 eqA n ltM
        (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec
           os a aP) -> OBuch aP (a :: Q) R.

Theorem OBuch_Stable : forall P Q R : list (poly A0 eqA ltM), OBuch P Q R -> (forall a : poly A0 eqA ltM, In a Q -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec a P) -> stable P R.