文法
原始递归函数是一种函数式的计算模型,其文法定义如下:
其中
,
或者任何你喜欢的符号分隔,毕竟文法不重要),其中的元素是
语义
人话语义
每个原始递归函数都接受一个自然数参数列表,并返回一个自然数。
用 JS 表示就是:
const comp = function(f, gs, args) {
return f(...gs.map(g => g(args))));
}
- 当前结果为
- 将当前结果与调用
的次数作为参数,调用 ,直到调用 的次数达到 次。
用 JS 表示就是:
const rec = function(f, g, n, args) {
let result = f(args);
for (let i = 0; i < n; i++) {
result = g(result, i);
}
return result;
}
指称语义
其中 index
定义如下:
注意这里的参数列表是反着写的,不过这只是一个 design choice, 对理解“这是什么”影响不大。
大步 operational 语义
index
定义同上。
计算能力
直觉地,我们可以看出“原始递归函数” 这个计算模型应当能计算 所有 在 固定次数的循环 中能计算出来的 函数的 值。
不能算什么
self-interpreter
我们无法用 原始递归函数 来编写 原始递归函数 的解释器。
形式化地,不存在这样的 原始递归函数
其中
这个编码方式可以参考 哥德尔数。
我们假设
证明思路是构造 g = comp suc (nil, comp eval (nil, f))
,其中
我们可以得到 code
是将
Iterated exponentials
Ackermann 函数
ack ∈ ℕ × ℕ → ℕ
ack (zero, n) = suc n
ack (suc m, zero) = ack (m, suc zero)
ack (suc m, suc n) = ack (m, ack (suc m, n))
和其他计算模型的关系
和 PRF 相似,但比 PRF 更弱的计算模型是 elementary recursive function,说实话它并不递归。
和 PRF 相似,但比 PRF 更强的计算模型是 (General)递归函数(一般简称为 RF)。
简单来说,相比 PRF,RF 添加了一个运算
PRF 能计算所有算数阶层中
不那么严格的,“只允许使用有界循环”的面向过程程序强于