(* Specifications: *)
Theorem eqA_A0 : forall a b : A, eqA a A0 -> eqA a b -> eqA b A0.
Theorem plusA_eqA_comp_l : forall a b c : A, eqA a b -> eqA (plusA a c) (plusA b c).
Theorem plusA_eqA_comp_r : forall a b c : A, eqA a b -> eqA (plusA c a) (plusA c b).
Theorem eqA0_left : forall a b : A, eqA a A0 -> eqA b (plusA a b).
Theorem eqA0_right : forall a b : A, eqA b A0 -> eqA a (plusA a b).
Theorem invA0 : eqA A0 (invA A0).
Theorem invA0_comp : forall a : A, eqA a A0 -> eqA a (invA a).
Theorem invA0_inv : forall a : A, eqA a (invA (invA a)).
Theorem multA_eqA_comp_l : forall a b c : A, eqA a b -> eqA (multA a c) (multA b c).
Theorem multA_eqA_comp_r : forall a b c : A, eqA a b -> eqA (multA c a) (multA c b).
Theorem multA_dist_r : forall a b c : A, eqA (plusA (multA a c) (multA b c)) (multA (plusA a b) c).
Theorem multA_A0_r : forall a : A, eqA (multA a A0) A0.
Theorem multA_A1_r : forall a : A, eqA (multA a A1) a.
Theorem multA_invA_com_l : forall a b : A, eqA (multA (invA a) b) (invA (multA a b)).
Theorem multA_invA_com_r : forall a b : A, eqA (multA a (invA b)) (invA (multA a b)).
Theorem divA_multA_comp_l : forall (a b c : A) (nZc : ~ eqA c A0), eqA (divA (multA a b) c nZc) (multA a (divA b c nZc)).
Theorem invA_is_invA1 : forall a : A, eqA (invA a) (multA (invA A1) a).
Theorem divA_A0_l : forall (a : A) (nZa : ~ eqA a A0), eqA (divA A0 a nZa) A0.
Theorem A_sep : forall a b : A, eqA (multA a b) A0 -> eqA a A0 \/ eqA b A0.
Theorem divA_A1 : forall (a : A) (nZa : ~ eqA a A0), eqA (divA a a nZa) A1.
Theorem divA_nZ : forall a b : A, ~ eqA b A0 -> forall nZa : ~ eqA a A0, ~ eqA (divA b a nZa) A0.
Theorem zerop_nf_cb : forall (L : list poly) (p : poly), zerop (nf L p) -> cb L p.
Theorem Cb_addEnd_cons : forall (L : list (poly A0 eqA ltM)) (p q : poly A0 eqA ltM), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (addEnd A A0 eqA n ltM p L) -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (p :: L).
Theorem Cb_cons_addEnd : forall (L : list (poly A0 eqA ltM)) (p q : poly A0 eqA ltM), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (p :: L) -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (addEnd A A0 eqA n ltM p L).
Theorem Cb_trans_cons : forall (L : list (poly A0 eqA ltM)) (p q : poly A0 eqA ltM), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (p :: L) -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec p L -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q L.
Theorem Cb_cons : forall (p : poly A0 eqA ltM) (L : list (poly A0 eqA ltM)), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec os p L) (p :: L).
Theorem Cb_comp : forall L1 L2 : list (poly A0 eqA ltM), (forall p : poly A0 eqA ltM, In p L1 -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec p L2) -> forall q : poly A0 eqA ltM, Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q L1 -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q L2.
Theorem Cb_nf : forall (p : poly A0 eqA ltM) (L : list (poly A0 eqA ltM)), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec p (nf A A0 A1 eqA plusA invA minusA multA divA cs eqA_dec n ltM ltM_dec os p L :: L).
Theorem zerop_elim_Cb : forall (L : list (poly A0 eqA ltM)) (p q : poly A0 eqA ltM), zerop A A0 eqA n ltM p -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q (p :: L) -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q L.
Theorem Cb_compo : forall (p : poly A0 eqA ltM) (L1 : list (poly A0 eqA ltM)), Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec p L1 -> forall L2 : list (poly A0 eqA ltM), (forall q : poly A0 eqA ltM, In q L1 -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec q L2) -> Cb A A0 eqA plusA multA eqA_dec n ltM ltM_dec p L2.
Theorem divP_is_not_order : forall a b : Term A n, divP A A0 eqA multA divA n a b -> ~ ltT ltM a b.
Theorem divP_ltT_comp : forall (a b : Term A n) (p : list (Term A n)), canonical A0 eqA ltM (pX b p) -> divP A A0 eqA multA divA n a b -> canonical A0 eqA ltM (pX a p).
Lemma map_in : forall (A B : Set) (f : A -> B) (b : B) (xs : list A), In b (map f xs) -> ex (fun a : A => b = f a /\ In a xs).
Lemma map_app : forall (A B : Set) (f : A -> B) (l1 l2 : list A), map f (l1 ++ l2) = map f l1 ++ map f l2.
Lemma map_rev : forall (A B : Set) (f : A -> B) (l : list A), map f (rev l) = rev (map f l).
Lemma rev_in : forall (A : Set) (a : A) (l : list A), In a (rev l) -> In a l.
Lemma in_rev : forall (A : Set) (a : A) (l : list A), In a l -> In a (rev l).