交互递归和丘齐数

来源:互联网 发布:fps鼠标推荐 知乎 编辑:程序博客网 时间:2024/05/17 08:41

上次说到丘齐数 的时候并没有提到怎么定义后继函数, succ(n) = n + 1。这两天读Pierced的书(顺便说一句,这本Types and Programming Languages的叙述清晰,推理自然,符号也用得非常简约。相比那本Principles of Program Analysis,Peirce这本书读起来轻松多了。也不知道是作者风格问题,还是类型系统的线条本来就比较清爽)时,突然意识到succ的定义其实暗合(多半是明合,不过我没有清晰的证明)交互递归。先看上次定义的丘齐数:

n  = lambda s z . sn z

如果把s看成后继函数,z看成0,n就很好理解了:对0做n次后继操作。

现在看后继函数的定义:succ = lambda n s z. s (n s z)

看到没有,如果我们同样把s看作后继函数,z看成0, 那succ(n)相当于对0做n次后继操作,然后再做一次。相当于说说succ(n) = n + 1。非常直观吧?再仔细观察,丘齐数的定义出现在后继函数的定义里,反之亦然。换句话说,俺们用到了交互递归。如果有老大不了解交互递归,不妨不用任何循环语句写一个打印有任意结构的树的程序。

那我们怎么知道这个交互递归收敛呢?那就要看0这个丘齐数的定义了:0 = lambda s z. z。同样,把s看成后继函数。s完全没有被应用到被看作0的z上。换句话说,当n等于0时,succ(n)=succ(0) = s (0 s z) = s z = z = 0。刚好收敛。当然,这不是严格的证明。严格的证明就留给各位老大了。

最后来道练习题(其实就是Pierce书上的练习5.2.2):用另外一种方式定义后继函数。

原创粉丝点击