One of the ways of defining the set of recursive functions is to define first a language $L$ by induction in the following way:
- $\mathsf{Z}^1 \in L$;
- $\mathsf{S}^1 \in L$;
- $\mathsf{P}^n_k \in L$ for all $n, k$ with $n \ge 1$, $1 \le k \le n$;
- if $F^m, G_1^n, \dotsc, G_m^n \in L$, then $\mathsf{C}^n[F^m, G_1^n, \dotsc, G_m^n] \in L$;
- if $F^n, G^{n+2} \in L$ then $\mathsf{R}^{n+1}[F^n, G^{n+2}] \in L$;
- if $F^{n+1} \in L$, then $\mathsf{M}^n[F^{n+1}] \in L$.
Then one defines a function (we could call it interpretation) which associates to every $F^n \in L$ a partial function $i(F^n) : \mathbb{N}^n \rightarrow \mathbb{N}$. The interpretation is such that, intuitively, $\mathsf{Z}^1$ corresponds to the constant zero, $\mathsf{S}^1$ to the successor, $\mathsf{P}^n_k$ to the $k$-th projection, and then we have composition, primitive recursion and minimalization. One says that a partial function $f : \mathbb{N}^n \rightarrow \mathbb{N}$ is recursive if there is some $F^n \in L$ such that $f = i(F^n)$. (This way is particularly useful if one wants to deal precisely with intensional and extensional equalities.) Let's just call $i(L)$ the set of recursive functions in the sense of this definition.
My problem is that I can see at least two ways in which we could give the interpretation of $F^n$. The one I was taught corresponds to what I think computer scientists would call eager evaluation. But we could also define the interpretation in such a way that the evaluation is lazy. The definitions are quite long, but let me illustrate the key difference between the two: if $e$ stands for eager and $l$ stands for lazy, we would have for example that $$ e(\mathsf{C}^1 [\mathsf{P}_1^2, F^1, G^1])(x) = \left\{\begin{array}{l l} e(F^1)(x) & \text{if } e(G^1)(x) \text{ is defined,} \\ \text{undefined} & \text{otherwise.} \end{array}\right.$$ $$ l(\mathsf{C}^1 [\mathsf{P}_1^2, F^1, G^1])(x) = l(F^1)(x) \quad\text{for all } x $$ i.e., one can treat the projections in two ways, either requiring that all arguments be defined in order to return the $k$-th, or not – and consequently the same applies for other functions which don't really need all their arguments (this could be made precise, but it's very technical and not so interesting).
It is not obvious, to me, that the recursive functions defined using the eager evaluation are exactly the same as those defined using the lazy evaluation. I can't find any reference for this, because most texts adopt the eager evaluation without saying much about their choice (and some are not quite clear about the interpretation as well, maybe because they interchange functions and symbols for functions). So, my question is,
Why is $e(L) = l(L)$?
I think that $e(L) \subseteq l(L)$ should be simple, but of course we can't just say that if $f = e(F^n)$, then $f = l(F^n)$. On the contrary, the other inclusion seems quite complicated: in a sense, what is needed is a way to emulate parallel computation.
I know that in order to give a proof one needs to see the explicit definitions of $e$ and $l$, but I hope that this problem has already been dealt with somewhere, and that someone could point me to good references. Anyway, if it's really necessary I'll copy them here.