Turing Machine Halting Problem
停机问题:指判断任意一个程序是否能在有限的时间之内结束运行的问题。图灵机停机问题是不可判定的,意思即是不存在一个图灵机能够判定任意图灵机对于任意输入是否停机。
证明一:
为了证明这个问题的不可判定性,我们将基于莱斯定理(Rice’s Theorem)将其规约成另外的问题来判定某个图灵机是否能在给定的输入上,在有限步数内给出确定的是或者不是的答案。
图灵机的停机问题可以描述为以下模式:
输入:一个图灵机
M
, 和一个输入字符串
问题:所给定的图灵机
M
是否能在有限步数内结束对字符串
证明:首先,我们将假定确实是存在一个图灵机解决这样的问题,接着我们将描述这个假定是如何与它本身相违背的。我们将称这种图灵机为可停机机器(HM)——能在有限时间内停机并且给出’yes’或者’no’的答案,即当HM能在有限时间内停机时,我们所构建的图灵机HM输出yes
,否则输出no
。
下面的方框图所表示的就是我上面所描述的可停机机器:
现在我们将设计一个反可停机机器(HM’):
1. 如果HM返回‘yes’,则进入一个死循环中
2. 如果HM返回‘no’,则停机
下面的方框图所表示的就是我上面所描述的反可停机机器:
最后,若对于输入是其本身的图灵机 HM2 :
- 如果 HM2 在某个输入停机了,则会进入死循环中
- 否则,停机
显然这与我们一开始的假设是相违背的,因此图灵机的可停机问题是不可判定的。
证明二:
另外一种过程一样但更加易懂的解释:
假设图灵机停机问题是可判定的,即存在一个图灵机
HM
能够判断任意图灵机
M
在给定输入yes
,反之输出no
。然而图灵机
M
本身也是字符串的描述,因此它也可以作为自身的输入。故
- 如果HM(M, M)输出
no
,则U(M)停机 - 如果HM(M, M)输出
yes
,则U(M)就进入死循环
即是说U(M)做的是与HM(M, M)相反的动作。将HM(M, M)包装在U(M)中,也就是用U()来模拟HM()。 HM() 的输出可能出现两种情况:
- 假设HM(U, U)输出
yes
,则U(U)则进入死循环中。而由定义可知这两个结果是矛盾的。(与HM的定义矛盾,因为按照HM的定义,HM(U, U)的结果应和U(U)相同,但是U()的定义导致它永远输出和HM()相反的结果 - 假设HM(U, U)输出
no
,则U(U)停机。同上,这两者一样矛盾。
因此HM不能够总给出正确答案,与之前的假设相矛盾,故图灵机的停机问题是不可判定的。