Inductive pickinSetp :
Term A n -> list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | pickinSeteqp :
      forall (a b : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX b p)) (P : list (poly A0 eqA ltM)),
      divP A A0 eqA multA divA n a b ->
      pickinSetp a (pX b p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX b p) H :: P)
  | pickinSetskip :
      forall (a b : Term A n) (p : list (Term A n)) 
        (q : poly A0 eqA ltM) (P : list (poly A0 eqA ltM)),
      pickinSetp a p P -> pickinSetp a p (q :: P).Inductive pickinSetp :
Term A n -> list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | pickinSeteqp :
      forall (a b : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX b p)) (P : list (poly A0 eqA ltM)),
      divP A A0 eqA multA divA n a b ->
      pickinSetp a (pX b p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX b p) H :: P)
  | pickinSetskip :
      forall (a b : Term A n) (p : list (Term A n)) 
        (q : poly A0 eqA ltM) (P : list (poly A0 eqA ltM)),
      pickinSetp a p P -> pickinSetp a p (q :: P).Inductive pickinSetp :
Term A n -> list (Term A n) -> list (poly A0 eqA ltM) -> Prop :=
  | pickinSeteqp :
      forall (a b : Term A n) (p : list (Term A n))
        (H : canonical A0 eqA ltM (pX b p)) (P : list (poly A0 eqA ltM)),
      divP A A0 eqA multA divA n a b ->
      pickinSetp a (pX b p)
        (exist (fun l0 : list (Term A n) => canonical A0 eqA ltM l0) 
           (pX b p) H :: P)
  | pickinSetskip :
      forall (a b : Term A n) (p : list (Term A n)) 
        (q : poly A0 eqA ltM) (P : list (poly A0 eqA ltM)),
      pickinSetp a p P -> pickinSetp a p (q :: P).

(* Specifications: *)
Lemma pickin_is_pX : forall (a : Term A n) (p : list (Term A n)) (Q : list (poly A0 eqA ltM)), pickinSetp a p Q -> exists b : Term A n, (exists q : list (Term A n), p = pX b q).