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.

(* Specifications: *)
Theorem incl_addEnd1 : forall (a : poly A0 eqA ltM) (L1 L2 : list (poly A0 eqA ltM)), incl (addEnd A A0 eqA n ltM a L1) L2 -> incl (a :: L1) L2.
Theorem ObuchPincl : forall aP R Q : list (poly A0 eqA ltM), OBuch aP Q R -> incl aP R.
Theorem ObuchPred : forall aP R Q : list (poly A0 eqA ltM), OBuch aP Q R -> forall a : poly A0 eqA ltM, In a aP -> red A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec a R.
Theorem ObuchQred : forall aP R Q : list (poly A0 eqA ltM), OBuch aP Q R -> forall a : poly A0 eqA ltM, In a Q -> red A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec a 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.