Inductive inPolySet : list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | incons :
      forall (a : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX a p)) (P : list (poly A0 eqA ltM)),
      inPolySet (pX a p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX a p) H :: P)
  | inskip :
      forall (a : poly A0 eqA ltM) (p : list (Term A n))
        (P : list (poly A0 eqA ltM)), inPolySet p P -> inPolySet p (a :: P).Inductive inPolySet : list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | incons :
      forall (a : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX a p)) (P : list (poly A0 eqA ltM)),
      inPolySet (pX a p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX a p) H :: P)
  | inskip :
      forall (a : poly A0 eqA ltM) (p : list (Term A n))
        (P : list (poly A0 eqA ltM)), inPolySet p P -> inPolySet p (a :: P).Inductive inPolySet : list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | incons :
      forall (a : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX a p)) (P : list (poly A0 eqA ltM)),
      inPolySet (pX a p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX a p) H :: P)
  | inskip :
      forall (a : poly A0 eqA ltM) (p : list (Term A n))
        (P : list (poly A0 eqA ltM)), inPolySet p P -> inPolySet p (a :: P).

(* Specifications: *)
Lemma inPolySet_imp_canonical : forall (p : list (Term A n)) (L : list (poly A0 eqA ltM)), inPolySet p L -> canonical A0 eqA ltM p.
Lemma not_nil_in_polySet_elm : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), inPolySet p Q -> p <> pO A n.
Theorem not_nil_in_polySet : forall (Q : list (poly A0 eqA ltM)) (p : list (Term A n)), ~ inPolySet (pO A n) Q.
Lemma inPolySet_is_pX : forall (p : list (Term A n)) (L : list (poly A0 eqA ltM)), inPolySet p L -> exists a : Term A n, (exists q : list (Term A n), p = pX a q).