我想问几个关于以下证明的问题。证明最初来自教科书,然后是下面关于 stackoverflow 的问题。
问题一:
下面的证明本质上是否使 H 成为其输入机器的模拟器?
换句话说,说 H = M 与证明中的以下描述之间有重要区别吗?
H([M,w]) = {accept if M accepts w}
= {reject if M does not accept w.}
问题2:
我的以下评论如何正确或不正确?
我认为停止问题是决定给定机器是否会停止而不管其输出(接受/拒绝)的问题。如果存在停止问题的解决方案,它必须是分析源代码的东西,如编译器/反编译器/反汇编器,而不是实际运行它。如果它需要运行它,显然它永远不会确定“否”的答案。
注意到证明中的明显问题,整个证明似乎没有显示停止问题的不可判定性。
相反,证明似乎表明了这一点:以下算法不会停止:
boolean D()
{
return not D();
}
以下是 Sipser 从 Intro to the Theory of Computation 重新键入的相关证明。
停机问题无法确定
现在我们准备证明定理 4.11,语言的不可判定性
ATM = {[M,w] | M 是一个 TM 并且 M 接受 w}。
证明:我们假设ATM是可判定的,得到一个矛盾。假设 H 是 ATM 的决策者。在输入时,M 是一个 TM,w 是一个字符串,如果 M 接受 w,H 会停止并接受。此外,如果 M 未能接受 w,H 将停止并拒绝。换句话说,我们假设 H 是一个 TM,其中
H([M,w]) = {accept if M accepts w}
= {reject if M does not accept w.}
现在我们构造一个新的图灵机 D,其中 H 作为子程序。当 M 的输入是它自己的描述时,这个新的 TM 调用 H 来确定 M 做什么。一旦 D 确定了这个信息,它就会做相反的事情。也就是说,如果 M 接受则拒绝,如果 M 不接受则接受。以下是对 D 的描述。
D = "On input [M], where M is a TM:
1. Run H on input [M, [M]].
2. Output the opposite of what H outputs; that is, if H accepts, reject and if H rejects, accept."
不要对根据自己的描述运行机器的想法感到困惑!这类似于以自身作为输入运行程序,在实践中偶尔会发生这种情况。例如,编译器是翻译其他程序的程序。Pascal 语言的编译器本身可能是用 Pascal 编写的,因此在其自身上运行该程序是有意义的。总之,
D([M]) = { accept if M does not accept [M]
= { reject if M accepts [M]
当我们以自己的描述作为输入运行 D 时会发生什么> 在这种情况下,我们得到:
D([D]) = {accept if D does not accept [D]
= {reject if D accepts [D]
不管 D 做什么,都是强制反其道而行之,这显然是矛盾的。因此,TM D 和 TM H 都不存在。