9 System T of Higher Order Recursion¶
约 1563 个字 13 行代码 10 张图片 预计阅读时间 5 分钟
9.1 知识补充¶
在介绍 System T 之前,我们补充一些预备知识。
部分函数 (partial functions)。如果
全函数 (total functions)。如果
非终止性。在数学中的函数基本是全函数;但部分函数对于计算机科学来说是重要的。一个算法可以表示为求出
例如:
f :: Int -> Int
f 1 = 1
f n = n + f(n - 2)
这个函数 f
对于偶自然数和负数都不会终止,因此它是一个部分函数。
递归函数论。递归函数论是和图灵机以及
原始递归 (primitive recursion) 运算。设
则称
9.2 Gödel's System T¶
System T 是函数类型和自然数类型的结合,同时引入了原始递归机制。
T 语言的抽象和具体语法如下:

其闭值由以下规则定义,这是动态语义的一部分:

与前面的讨论类似,这里方括号括起的部分也是用来区分不同的解释的。在 eager form of T 中方括号中的内容应当保留,在 lazy form 中则应去掉。后文中涉及动态语义的部分省略相关解释。
Note
这里我们仍然可以使用之前「按值调用」和「按名调用」的说法,但是我们改为用 eager 和 lazy 描述;这是因为,
我们分几个部分来讨论和解释上述语法。
9.2.1 Abstraction and Application¶
T 对于函数的处理和 EF 是一致的,其静态语义由以下规则定义:

相关闭值的定义已经在前文讨论过了。动态语义中相关的转换规则如下:

可以看到,这和 EF 中的并无区别。
9.2.2 Natural Numbers¶
T 对于自然数的定义和我们在 2.2 节中定义的基本一致,只是采用的符号略有不同。其静态语义由以下规则定义:

相关闭值的定义已经在前文讨论过了。动态语义中相关的转换规则如下:

我们把
9.2.3 Recursion¶
与 E 不同,T 中对于自然数的操作只有原始递归。但事实上,这种操作更加通用,因此实际上可以实现 E 中的所有算术操作,甚至更多。
我们下面来讨论 T 语言中的递归操作。递归式 (recursor) 的抽象语法是
它表示的含义其实就是:如果
用 9.1 节中「原始递归」的方法表示,其实就是:
上面的描述可能还是有点抽象,不妨举一个例子。我们在 OCaml 中定义如下的 nat
类型:
type nat =
| Z
| S of nat;;
我们定义「加倍」函数:
let rec double a =
match a with
| Z -> Z
| S x -> S(S(double x));;
double (S (S Z));;
尝试运行可以得到正确的结果:

进一步地,我们将其改写为递归式的形式:
let rec double a =
match a with
| Z -> Z
| S x -> let y = double x in S(S y);;

因此,我们可以容易地写出 double
对应的递归式:
即
迭代式
可以看到,这里在
这样,我们其实就容易理解课本中说「递归式
因此,我们就可以给出递归的静态和动态语义了。
静态语义:

动态语义:

9.2.4 Definability¶
自然数上的一个数学函数