Inductive CombLinear (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> Prop :=
  | CombLinear_0 : CombLinear Q (pO A n)
  | CombLinear_1 :
      forall (a : Term A n) (p q s : list (Term A n)),
      ~ zeroP (A:=A) A0 eqA (n:=n) a ->
      inPolySet A A0 eqA n ltM q Q ->
      CombLinear Q p ->
      eqP A eqA n s
        (pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec
           (mults (A:=A) multA (n:=n) a q) p) -> CombLinear Q s.Inductive CombLinear (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> Prop :=
  | CombLinear_0 : CombLinear Q (pO A n)
  | CombLinear_1 :
      forall (a : Term A n) (p q s : list (Term A n)),
      ~ zeroP (A:=A) A0 eqA (n:=n) a ->
      inPolySet A A0 eqA n ltM q Q ->
      CombLinear Q p ->
      eqP A eqA n s
        (pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec
           (mults (A:=A) multA (n:=n) a q) p) -> CombLinear Q s.Inductive CombLinear (Q : list (poly A0 eqA ltM)) :
list (Term A n) -> Prop :=
  | CombLinear_0 : CombLinear Q (pO A n)
  | CombLinear_1 :
      forall (a : Term A n) (p q s : list (Term A n)),
      ~ zeroP (A:=A) A0 eqA (n:=n) a ->
      inPolySet A A0 eqA n ltM q Q ->
      CombLinear Q p ->
      eqP A eqA n s
        (pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec
           (mults (A:=A) multA (n:=n) a q) p) -> CombLinear Q s.

(* Specifications: *)
Theorem CombLinear_canonical : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), CombLinear Q p -> canonical A0 eqA ltM p.
Theorem CombLinear_comp : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), CombLinear Q p -> forall q : list (Term A n), canonical A0 eqA ltM q -> eqP A eqA n p q -> CombLinear Q q.
Theorem CombLinear_pluspf : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), CombLinear Q p -> forall q : list (Term A n), CombLinear Q q -> CombLinear Q (pluspf (A:=A) A0 (eqA:=eqA) plusA eqA_dec (n:=n) (ltM:=ltM) ltM_dec p q).
Theorem CombLinear_mults1 : forall (Q : list (poly A0 eqA ltM)) (a : Term A n) (p : list (Term A n)), ~ zeroP (A:=A) A0 eqA (n:=n) a -> CombLinear Q p -> CombLinear Q (mults (A:=A) multA (n:=n) a p).
Theorem CombLinear_minuspf : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), CombLinear Q p -> forall q : list (Term A n), CombLinear Q q -> CombLinear Q (minuspf A A0 A1 eqA invA minusA multA eqA_dec n ltM ltM_dec p q).
Theorem CombLinear_id : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), inPolySet A A0 eqA n ltM p Q -> CombLinear Q p.
Theorem CombLinear_spoly : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)) (Cp : canonical A0 eqA ltM p) (Cq : canonical A0 eqA ltM q), inPolySet A A0 eqA n ltM p Q -> inPolySet A A0 eqA n ltM q Q -> CombLinear Q (spolyf A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec p q Cp Cq).
Theorem CombLinear_reduce : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)), reduce A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p q -> canonical A0 eqA ltM p -> CombLinear Q q -> CombLinear Q p.
Theorem CombLinear_reduceplus : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)), reduceplus A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p q -> canonical A0 eqA ltM p -> CombLinear Q q -> CombLinear Q p.
Theorem CombLinear_reducestar : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)), reducestar A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p q -> canonical A0 eqA ltM p -> CombLinear Q q -> CombLinear Q p.
Theorem Reducestar_pO_imp_CombLinear : forall (Q : list (poly A0 eqA ltM)) (p q : list (Term A n)), reducestar A A0 A1 eqA invA minusA multA divA eqA_dec n ltM ltM_dec Q p q -> canonical A0 eqA ltM p -> eqP A eqA n q (pO A n) -> CombLinear Q p.