在前面的章节中,我们知道递归就是一种有退出机制的嵌套。在本章中我们将接触计算机程序设计语言继续深入探讨递归。
Bloop
Bloop是一种这样的编程语言,他的循环是有上界的,也就是说它是有退出机制的,是我们用来定义可预知终止的计算机语言。可以用Bloop来计算的函数我们叫原始递归函数,原始递归是简单的,但是并不是说鱼油原始递归性质是简单的。原始递归可以发现很多性质,较强的形式系统如TNT系统对原始递归是完全的。
现在让我们来考虑一个集合,这个集合拥有所有待调用的Bloop函数,并且这些函数恰好有一个输入值。这些函数都有一个序号,根据函数的长度排列。下面我们要介绍一种证明方式来证明,这个集合不存在!这听起来不可能但是却是有这种证法,它就是对角线法。我们将用这个集合定义一个单变量函数——蓝对角[N]。同时我们定义上述集合为蓝程序,我们定义一个等式1:蓝对角[n]=1+蓝程序{#N}[N],这里我们注意蓝对角是属于蓝程序集合的,所以必定有蓝对角[n]=蓝程序{#N}[N],矛盾出现了!所以蓝对角是不属于蓝程序的。
下面这个例子可以让我们更好地理解对角线法则:我们考虑0到1之间的实数集合,对这个集合取对角线得到:0.12820...,将它们每一位减1得到0.01719...这个数的第一位不等于第一个实数的第一位,第二位不等于第二个实数的第二位以此类推,这个实数不在我们定义的实数集合里!
Floop
Floop是一个很强大的程序设计语言,它允许无限递归,它可能终止,也可能永远运行下去。那么如何区分你的程序是可终止的还是无限循环的?用Bloop程序是个好办法,将Floop程序哥德尔配数,放入Bloop程序中,问题解决!但是图灵在就证明这并非想的那么简单,为什么?
让我们来定义一个和蓝程序一样的绿程序,绿程序里面是Floop程序,那么是否有:绿对角[n]=1+绿程序{#N}[N]。可能不行,因为我们不知道绿程序是否能终结。即使有一个终止检测器过滤掉不可终止Floop,那么我们就回到了蓝程序集合,它同样是不可计算的。
Gloop
那么是否存在一种语言像Floop打破Bloop那样?目前来看不行。