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).
apply (filter010IsPR _ succIsPR).