Inductive reds :
poly A0 eqA ltM -> poly A0 eqA ltM -> list (poly A0 eqA ltM) -> Prop :=
  | reds0 :
      forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM),
      red A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec
        (spolyp A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
           ltM_dec os a b) P -> reds a b P
  | reds1 :
      forall (P : list (poly A0 eqA ltM)) (a b c : poly A0 eqA ltM),
      In c P ->
      reds a c P ->
      reds c b P ->
      divp A A0 eqA multA divA n ltM
        (ppcp A A0 A1 eqA plusA invA minusA multA divA cs n ltM a b) c ->
      reds a b P.Inductive reds :
poly A0 eqA ltM -> poly A0 eqA ltM -> list (poly A0 eqA ltM) -> Prop :=
  | reds0 :
      forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM),
      red A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec
        (spolyp A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
           ltM_dec os a b) P -> reds a b P
  | reds1 :
      forall (P : list (poly A0 eqA ltM)) (a b c : poly A0 eqA ltM),
      In c P ->
      reds a c P ->
      reds c b P ->
      divp A A0 eqA multA divA n ltM
        (ppcp A A0 A1 eqA plusA invA minusA multA divA cs n ltM a b) c ->
      reds a b P.Inductive reds :
poly A0 eqA ltM -> poly A0 eqA ltM -> list (poly A0 eqA ltM) -> Prop :=
  | reds0 :
      forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM),
      red A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec
        (spolyp A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM
           ltM_dec os a b) P -> reds a b P
  | reds1 :
      forall (P : list (poly A0 eqA ltM)) (a b c : poly A0 eqA ltM),
      In c P ->
      reds a c P ->
      reds c b P ->
      divp A A0 eqA multA divA n ltM
        (ppcp A A0 A1 eqA plusA invA minusA multA divA cs n ltM a b) c ->
      reds a b P.

(* Specifications: *)
Theorem reds_com : forall (P : list (poly A0 eqA ltM)) (a b : poly A0 eqA ltM), reds a b P -> reds b a P.