Definition isPR (n : nat) (f : naryFunc n) : Set :=
  {p : PrimRec n | extEqual n (evalPrimRec _ p) f}.Definition isPRrel (n : nat) (R : naryRel n) : Set :=
  isPR n (charFunction n R).

(* Specifications: *)
Lemma succIsPR : isPR 1 S.
Lemma const0_NIsPR : forall n : nat, isPR 0 n.
Lemma const1_NIsPR : forall n : nat, isPR 1 (fun _ => n).
Lemma idIsPR : isPR 1 (fun x : nat => x).
Lemma pi1_2IsPR : isPR 2 (fun a b : nat => a).
Lemma pi2_2IsPR : isPR 2 (fun a b : nat => b).
Lemma pi1_3IsPR : isPR 3 (fun a b c : nat => a).
Lemma pi2_3IsPR : isPR 3 (fun a b c : nat => b).
Lemma pi3_3IsPR : isPR 3 (fun a b c : nat => c).
Lemma pi1_4IsPR : isPR 4 (fun a b c d : nat => a).
Lemma pi2_4IsPR : isPR 4 (fun a b c d : nat => b).
Lemma pi3_4IsPR : isPR 4 (fun a b c d : nat => c).
Lemma pi4_4IsPR : isPR 4 (fun a b c d : nat => d).
Lemma filter01IsPR : forall g : nat -> nat, isPR 1 g -> isPR 2 (fun a b : nat => g b).
Lemma filter10IsPR : forall g : nat -> nat, isPR 1 g -> isPR 2 (fun a b : nat => g a).
Lemma filter100IsPR : forall g : nat -> nat, isPR 1 g -> isPR 3 (fun a b c : nat => g a).
Lemma filter010IsPR : forall g : nat -> nat, isPR 1 g -> isPR 3 (fun a b c : nat => g b).
Lemma filter001IsPR : forall g : nat -> nat, isPR 1 g -> isPR 3 (fun a b c : nat => g c).
Lemma filter011IsPR : forall g : nat -> nat -> nat, isPR 2 g -> isPR 3 (fun a b c : nat => g b c).
Lemma filter110IsPR : forall g : nat -> nat -> nat, isPR 2 g -> isPR 3 (fun a b c : nat => g a b).
Lemma filter101IsPR : forall g : nat -> nat -> nat, isPR 2 g -> isPR 3 (fun a b c : nat => g a c).
Lemma filter0011IsPR : forall g : nat -> nat -> nat, isPR 2 g -> isPR 4 (fun a b c d : nat => g c d).
Lemma filter1000IsPR : forall g : nat -> nat, isPR 1 g -> isPR 4 (fun a b c d : nat => g a).
Lemma filter1011IsPR : forall g : nat -> nat -> nat -> nat, isPR 3 g -> isPR 4 (fun a b c d : nat => g a c d).
Lemma filter1100IsPR : forall g : nat -> nat -> nat, isPR 2 g -> isPR 4 (fun a b c d : nat => g a b).
Lemma compose1_1IsPR : forall f : nat -> nat, isPR 1 f -> forall g : nat -> nat, isPR 1 g -> isPR 1 (fun x : nat => g (f x)).
Lemma compose1_2IsPR : forall f : nat -> nat, isPR 1 f -> forall f' : nat -> nat, isPR 1 f' -> forall g : nat -> nat -> nat, isPR 2 g -> isPR 1 (fun x : nat => g (f x) (f' x)).
Lemma compose1_3IsPR : forall f1 : nat -> nat, isPR 1 f1 -> forall f2 : nat -> nat, isPR 1 f2 -> forall f3 : nat -> nat, isPR 1 f3 -> forall g : nat -> nat -> nat -> nat, isPR 3 g -> isPR 1 (fun x : nat => g (f1 x) (f2 x) (f3 x)).
Lemma compose2_1IsPR : forall f : nat -> nat -> nat, isPR 2 f -> forall g : nat -> nat, isPR 1 g -> isPR 2 (fun x y : nat => g (f x y)).
Lemma compose2_2IsPR : forall f : nat -> nat -> nat, isPR 2 f -> forall g : nat -> nat -> nat, isPR 2 g -> forall h : nat -> nat -> nat, isPR 2 h -> isPR 2 (fun x y : nat => h (f x y) (g x y)).
Lemma compose2_3IsPR : forall f1 : nat -> nat -> nat, isPR 2 f1 -> forall f2 : nat -> nat -> nat, isPR 2 f2 -> forall f3 : nat -> nat -> nat, isPR 2 f3 -> forall g : nat -> nat -> nat -> nat, isPR 3 g -> isPR 2 (fun x y : nat => g (f1 x y) (f2 x y) (f3 x y)).
Lemma compose2_4IsPR : forall f1 : nat -> nat -> nat, isPR 2 f1 -> forall f2 : nat -> nat -> nat, isPR 2 f2 -> forall f3 : nat -> nat -> nat, isPR 2 f3 -> forall f4 : nat -> nat -> nat, isPR 2 f4 -> forall g : nat -> nat -> nat -> nat -> nat, isPR 4 g -> isPR 2 (fun x y : nat => g (f1 x y) (f2 x y) (f3 x y) (f4 x y)).
Lemma compose3_1IsPR : forall f : nat -> nat -> nat -> nat, isPR 3 f -> forall g : nat -> nat, isPR 1 g -> isPR 3 (fun x y z : nat => g (f x y z)).
Lemma compose3_2IsPR : forall f1 : nat -> nat -> nat -> nat, isPR 3 f1 -> forall f2 : nat -> nat -> nat -> nat, isPR 3 f2 -> forall g : nat -> nat -> nat, isPR 2 g -> isPR 3 (fun x y z : nat => g (f1 x y z) (f2 x y z)).
Lemma compose3_3IsPR : forall f1 : nat -> nat -> nat -> nat, isPR 3 f1 -> forall f2 : nat -> nat -> nat -> nat, isPR 3 f2 -> forall f3 : nat -> nat -> nat -> nat, isPR 3 f3 -> forall g : nat -> nat -> nat -> nat, isPR 3 g -> isPR 3 (fun x y z : nat => g (f1 x y z) (f2 x y z) (f3 x y z)).
Lemma compose4_2IsPR : forall f1 : nat -> nat -> nat -> nat -> nat, isPR 4 f1 -> forall f2 : nat -> nat -> nat -> nat -> nat, isPR 4 f2 -> forall g : nat -> nat -> nat, isPR 2 g -> isPR 4 (fun w x y z : nat => g (f1 w x y z) (f2 w x y z)).
Lemma compose4_3IsPR : forall f1 : nat -> nat -> nat -> nat -> nat, isPR 4 f1 -> forall f2 : nat -> nat -> nat -> nat -> nat, isPR 4 f2 -> forall f3 : nat -> nat -> nat -> nat -> nat, isPR 4 f3 -> forall g : nat -> nat -> nat -> nat, isPR 3 g -> isPR 4 (fun w x y z : nat => g (f1 w x y z) (f2 w x y z) (f3 w x y z)).
Lemma swapIsPR : forall f : nat -> nat -> nat, isPR 2 f -> isPR 2 (fun x y : nat => f y x).
Lemma indIsPR : forall f : nat -> nat -> nat, isPR 2 f -> forall g : nat, isPR 1 (fun a : nat => nat_rec (fun n : nat => nat) g (fun x y : nat => f x y) a).
Lemma ind1ParamIsPR : forall f : nat -> nat -> nat -> nat, isPR 3 f -> forall g : nat -> nat, isPR 1 g -> isPR 2 (fun a b : nat => nat_rec (fun n : nat => nat) (g b) (fun x y : nat => f x y b) a).
Lemma ind2ParamIsPR : forall f : nat -> nat -> nat -> nat -> nat, isPR 4 f -> forall g : nat -> nat -> nat, isPR 2 g -> isPR 3 (fun a b c : nat => nat_rec (fun n : nat => nat) (g b c) (fun x y : nat => f x y b c) a).
Lemma plusIndIsPR : isPR 3 (fun n fn b : nat => S fn).
Lemma plusIsPR : isPR 2 plus.
Lemma multIndIsPR : isPR 3 (fun n fn b : nat => fn + b).
Lemma multIsPR : isPR 2 mult.
Lemma predIsPR : isPR 1 pred.
Lemma minusIndIsPR : isPR 3 (fun n fn b : nat => pred fn).
Lemma minusIsPR : isPR 2 minus.