Fixpoint ignoreParams (n m : nat) (f : naryFunc n) {struct m} :
 naryFunc (m + n) :=
  match m return (naryFunc (m + n)) with
  | O => f
  | S x => fun _ => ignoreParams n x f
  end.Definition projectionListPR (n m : nat) (p : m <= n) : PrimRecs n m.Definition projectionList (n m : nat) (p : m <= n) : 
  Vector.t (naryFunc n) m := evalPrimRecs n m (projectionListPR n m p).

(* Specifications: *)
Lemma projectionListInd : forall (n m : nat) (p1 p2 : m <= n), projectionList n m p1 = projectionList n m p2.
Lemma projectionListApplyParam : forall (m n c : nat) (p1 : m <= n) (p2 : m <= S n), extEqualVector _ _ (projectionList n m p1) (evalOneParamList n m c (projectionList (S n) m p2)).
Lemma projectionListId : forall (n : nat) (f : naryFunc n) (p : n <= n), extEqual n f (evalComposeFunc n n (projectionList n n p) f).
Lemma ignoreParamsIsPR : forall (n m : nat) (f : naryFunc n), isPR _ f -> isPR _ (ignoreParams n m f).
Lemma reduce1stCompose : forall (c n m : nat) (v : Vector.t (naryFunc n) m) (g : naryFunc (S m)), extEqual n (evalComposeFunc n _ (Vector.cons (naryFunc n) (evalConstFunc n c) _ v) g) (evalComposeFunc n _ v (g c)).
Lemma reduce2ndCompose : forall (c n m : nat) (v : Vector.t (naryFunc n) m) (n0 : naryFunc n) (g : naryFunc (S (S m))), extEqual n (evalComposeFunc n _ (Vector.cons (naryFunc n) n0 _ (Vector.cons (naryFunc n) (evalConstFunc n c) _ v)) g) (evalComposeFunc n _ (Vector.cons (naryFunc n) n0 _ v) (fun x : nat => g x c)).
Lemma evalPrimRecParam : forall (n c d : nat) (g : naryFunc (S n)) (h : naryFunc (S (S (S n)))), extEqual _ (evalPrimRecFunc n (g d) (fun x y : nat => h x y d) c) (evalPrimRecFunc (S n) g h c d).
Lemma compose2IsPR : forall (n : nat) (f : naryFunc n) (p : isPR n f) (g : naryFunc (S n)) (q : isPR (S n) g), isPR n (compose2 n f g).
Lemma compose1_NIsPR : forall (n : nat) (g : naryFunc (S n)), isPR (S n) g -> forall f : naryFunc 1, isPR 1 f -> isPR (S n) (fun x : nat => g (f x)).