为了更好地理解停机问题,我们必须了解可判定性、不可判定性和图灵机、判定问题以及称为可计算性理论和计算复杂性理论的理论。
一些重要术语:
- 可计算性理论——
计算理论的一个分支,研究哪些问题可以使用不同的模型进行计算解决。在计算机科学中,算法的计算复杂性或简单的复杂性是运行它所需的资源量。 - 决策问题——
决策问题在任何输入上只有两个可能的输出(是或否)。在可计算性理论和计算复杂性理论中,决策问题是可以作为输入值的是非问题提出的问题。比如有没有解决特定问题的方法?答案要么是肯定的,要么是否定的。决策问题是对无限输入集的任意是/否问题。 - 图灵机——
图灵机是计算的数学模型。图灵机是控制计算机完成的所有数据操作的 CPU 的一般示例。图灵机可以是停机的,也可以是非停机的,这取决于算法和与算法相关的输入。
现在,让我们讨论停机问题:
停机问题——给定一个程序/算法是否会停机?
停止意味着特定输入的程序将接受它并停止或拒绝它并停止并且它永远不会进入无限循环。基本上停止意味着终止。那么我们可以有一个算法来判断给定的程序是否会停止。就图灵机而言,它会在某些具有特定给定输入字符串的机器上运行时终止。
答案是否定的,我们不能设计一个通用算法,它可以恰当地说明给定的程序是否会停止?
唯一的方法是运行程序并检查它是否停止。
我们也可以这样避免停止问题:给定一个用某种编程语言(c/c++/ Java)编写的程序,它会进入无限循环(循环永不停止)还是总是终止(停止)?
这是一个不可判定的问题,因为我们不能有一个算法来告诉我们一个给定的程序是否会以广义的方式停止,即通过特定的程序/算法。一般来说,我们不能总是知道这就是为什么我们不能有一个通用的算法。最好的方法是运行程序,看看它是否停止。这样对于许多程序我们可以看到它有时会循环并总是停止。
矛盾证明——
问题陈述:我们能否设计一台机器,如果给定一个程序,它可以找出该程序在特定输入上是否总是停止或不停止?
解决方案:假设我们可以设计一种称为 HM(P, I) 的机器,其中 HM 是机器/程序,P 是程序,I 是输入。在输入这两个参数时,机器 HM 将告诉程序 P 是否停止。
如果我们可以设计这样一个程序,这允许我们编写另一个程序,我们称这个程序为 CM(X),其中 X 是任何程序(作为参数),并且根据图中所示程序 CM(X) 的定义。
在程序 CM(X) 中,我们调用函数HM(X),我们已经定义了它,并向 HM() 传递参数 (X, X),根据 HM() 的定义,它可以接受两个参数,即一个是程序,另一个是输入。现在在第二个程序中,我们将 X 作为程序传递,X 作为输入传递给函数HM()。我们知道程序 HM() 给出两个输出“Halt”或“Not Halt” ”。但在第二个程序中,当 HM(X, X) 将停止循环时,主体告诉进入循环,当它没有停止时,则意味着循环,它被要求返回。
现在我们再考虑一种情况,即程序 CM 作为参数传递给 CM()函数。那么就会出现一些不可能的情况,即出现不可能的情况。
如果外部函数的代码(内部主体)处于循环中,则外部函数不可能停止,即使内部代码停止后,外部非停止函数也不可能停止。所以这两个条件对于CM机器/程序都是非停机的,即使我们一开始就假设它会停机。所以这是矛盾的,我们可以说我们的假设是错误的,这个问题,即停机问题是不可判定的。
这就是我们如何证明停机问题是不可判定的。