计算机的能力的确很强,但也有其局限性,有一些问题甚至不存在可解的算法,这是非常令人耳目一新的事情。

除了思想上的启发性,可计算性划定了计算这个抽象概念的边界,在一定程度上也划定了智能的边界。

可判定性

可判定性的定义由图灵可判定性给出,不再重复。不可判定性的存在不难理解,从可判定性的定义中就可以看出:只需要构造某个语言让图灵机陷入循环即可。

可识别性

可识别性的定义由图灵可识别性给出。比较令人惊讶的是,图灵不可识别性:存在一个语言,它不能被任何图灵机识别。

不可识别性本质上来说是两个无限集之间的规模比较:所有图灵机构成的集合是可数的,而所有语言的集合是不可数的。

更具体地,图灵不可识别的语言要从哪里寻找呢?这里列举一个不加证明的定理:

一个语言是可判定的,当且仅当这个语言本身和它的补都是可识别的。

根据这个定理,如果一个语言是可识别的,但又不可判定,那么这个语言本身或者它的补集有一个是不可识别的

思考

从上面的分析看来,可判定性与可识别性似乎只是问题本身的性质,但为什么说它们划定了计算的边界呢?

从工程的角度来看,我们需要解决的都是一些实际的问题,这些问题本身才是客观实在的,而计算实际上是一种求解问题的方法。实际上,我们总是先得到一个问题,然后再分析问题是否可识别或可判定,如果不可识别或不可判定,那么我们就可以直接改变问题本身或者求其近似解。

从逻辑分析的角度来说,计算的边界其实就是回答什么样的问题计算能够解决,什么样的问题计算不能够解决。图灵机是一个能力足够强大但又足够简单的具象的计算载体,所有的计算行为都有了明确的执行者,因此计算的含义得到了明确:就是在图灵机上发生的各种各样的操作。因此”可计算”这个集合中的元素是各种各样的问题,这些问题构成了计算的边界。

那么”可计算”这个集合里面到底包含哪些元素?这个问题其实和”自然数到底有哪些”等价。“可计算”集中包含了无限多的问题,这个概念本身是一个理论存在,实际上没法验证的东西。值得一提的是,尽管”可计算”集中包含了无限多的问题,但实际上也是整个问题集中的很少一部分,还有大量的问题是不可计算的。

注意

这里的”可计算”其实是非常严格的”可计算”,也就是绝对意义上的无限精度的”可计算”

精度决定一切

如果说某一个问题,图灵机并不能获得其无限精度的解,那么图灵机能不能获得一个有限精度的解?

援引《计算理论导引》中的一个不可计算问题:软件验证问题。问题本身描述如下:如果你有一个程序和一份它的说明书,你想设计一个程序来自动验证这个程序和它的说明书是否匹配。

直观上来说,这个问题应该是可解的,因为这个工作正是所有电子器件厂商正在做的,他们应当能够验证他们自己制造的东西与它的说明书匹配是否匹配。但这个问题是一个典型的不可计算问题。

是什么造成了这种直观理解与理论分析的差异?其实就是精度

图灵可计算这个概念本身非常严苛!它隐含地要求问题的解具有无限的精度。但是从工程的角度我们并不需要无限的精度,只需要令人满意的精度

例如对于软件验证问题,你是一个毫无道德感的老板,你并不关心你生产的东西与说明书是否匹配,只是为了从政策上蒙混过关,那么你完全可以设计一台只输出”接受”的图灵机。问题还是同一个问题,并且你成功的用图灵机解决了这个问题。虽然结果的精确度并不高,但已经足够让你满意了。

这个例子明显的说明了精度是计算的一个重要前提条件。而另一个问题也随之而来:如果我不考虑精度,图灵机可以解决所有问题;如果我需要无限的精度,图灵机智只能解决部分问题。那么如果我需要一个有限的精度,图灵机是否可以解决所有问题?在我不断提高精度要求,不断逼近无限精度的过程中那些不能被图灵机解决的问题是如何被踢出”可计算”这个集合的?

针对这些问题,我提出一个非常主观的猜想:在有限精度的情况下,图灵机可以在足够长的时间内解决所有的问题。

注意这里面出现了计算时间的概念,这是一个自然而然的引入,因为更高的精度总是意味着更长的求解时间,而当我们不断提高精度时,求解的时间也不断延长,直到问题从工程上变得”不可计算”。

在精度的作用下,被图灵机掩藏的复杂性显现了出来,问题 、计算主体 、精度 、计算时间 这四者之间具有复杂的关系。

应该有一个约束方程来描述他们之间的关系,暂时抽象地写作:

至于问题、计算主体、精度以及计算时间到底是如何形式化定义的,有待后续研究🧐