Section Strong_Recursion.
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))).