Definition evalStrongRecHelp (n : nat) (f : naryFunc (S (S n))) :
  naryFunc (S n) :=
  evalPrimRecFunc n (evalComposeFunc n 0 (Vector.nil _) (codeList nil))
    (evalComposeFunc (S (S n)) 2
       (Vector.cons _ f _
          (Vector.cons _ (evalProjFunc (S (S n)) n (lt_S _ _ (lt_n_Sn _))) _
             (Vector.nil _))) (fun a b : nat => S (cPair a b))).Definition evalStrongRec (n : nat) (f : naryFunc (S (S n))) :
  naryFunc (S n) :=
  evalComposeFunc (S n) 1
    (Vector.cons _ (fun z : nat => evalStrongRecHelp n f (S z)) _ (Vector.nil _))
    (fun z : nat => cPairPi1 (pred z)).

(* Specifications: *)
Lemma evalStrongRecIsPR : forall (n : nat) (f : naryFunc (S (S n))), isPR _ f -> isPR _ (evalStrongRec n f).
Lemma computeEvalStrongRecHelp : forall (n : nat) (f : naryFunc (S (S n))) (c : nat), evalStrongRecHelp n f (S c) = compose2 n (evalStrongRecHelp n f c) (fun a0 : nat => evalComposeFunc n 2 (Vector.cons (naryFunc n) (f c a0) 1 (Vector.cons (naryFunc n) (evalConstFunc n a0) 0 (Vector.nil (naryFunc n)))) (fun a1 b0 : nat => S (cPair a1 b0))).
Lemma evalStrongRecHelp1 : forall (f : naryFunc 2) (n m : nat), m < n -> codeNth (n - S m) (evalStrongRecHelp _ f n) = evalStrongRec _ f m.
Lemma evalStrongRecHelpParam : forall (a n c : nat) (f : naryFunc (S (S (S a)))), extEqual a (evalStrongRecHelp (S a) f n c) (evalStrongRecHelp a (fun x y : nat => f x y c) n).
Lemma evalStrongRecHelp2 : forall (a : nat) (f : naryFunc (S (S a))) (n m : nat), m < n -> extEqual _ (evalComposeFunc _ 1 (Vector.cons _ (evalStrongRecHelp _ f n) 0 (Vector.nil _)) (fun b : nat => codeNth (n - S m) b)) (evalStrongRec _ f m).
Lemma callIsPR : forall g : nat -> nat, isPR 1 g -> isPR 2 (fun a recs : nat => codeNth (a - S (g a)) recs).
Lemma div2IsPR : isPR 1 div2.