我想问几个关于以下证据的问题。证据最初来自教科书,然后是关于stackoverflow的问题。
How does this proof, that the halting problem is undecidable, work?
下面的证明是否基本上使H成为其输入机器的模拟器?
换句话说,在说明H = M和以下来自证明的描述之间是否存在重要差异?
H([M,w]) = {accept if M accepts w}
= {reject if M does not accept w.}
我的以下评论如何正确或不正确?
我认为暂停问题是决定给定机器是否会停止而不管其输出(接受/拒绝)的问题。如果存在停顿问题的解决方案,则必须分析源代码,如编译器/反编译器/反汇编程序,而不是实际运行它。如果它需要运行它,显然它永远不会确定“否”答案。
注意到证据中的明显问题,整个证据似乎没有表明停止问题的不可判断性。
相反,证据似乎表明了这一点: 以下算法不会停止:
boolean D()
{
return not D();
}
以下是Sipser的Intro to Computation of Intro重新输入的证据。
阻碍问题难以理解
现在我们准备证明定理4.11,语言的不可判断性
ATM = {[M,w] | M是TM,M接受w}。
PROOF: 我们假设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作为子程序。这个新的TM调用H来确定当M的输入是它自己的描述时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都不存在。
答案 0 :(得分:0)
换句话说,在说明H = M和以下来自证明的描述之间是否存在重要差异?
H机器被称为通用图灵机(UTM),能够模拟任何其他图灵机,包括它自己。
如果M是像H这样的通用图灵机,可以说H = M,否则这很奇怪。
我认为暂停问题是决定给定机器是否会停止而不管其输出(接受/拒绝)的问题。如果存在停顿问题的解决方案,则必须分析源代码,如编译器/反编译器/反汇编程序,而不是实际运行它。如果它需要运行它,显然它永远不会确定“否”答案。
这就是为什么证据基于矛盾而起作用并且很难理解。 基本上它首先假定存在这样一台机器,对任何给定的输入回答“是”或“否”。 [假设]
我们叫这台机器Q. 假设Q有效并且它是UTM,它可以模拟按照以下步骤工作的另一台机器S:
现在让我们想象输入Q(S,S)。 Q将接收程序S,S的参数是S本身。此输入将使S无限期地调用Q并且永远不会停止。
由于Q和S是合法程序,但有一种输入使Q永不停止,Q是一台不可能建立的机器,因此无法确定程序S是否停止。 因此,我们有证据表明暂停问题是不可判定的。
Sipser解释得很好。现在再读一遍,看看你是否理解了这个想法:)
现在,再次回答你的问题。图灵机是我们用来表示问题的最强大的机器。作为识别机器,它必须通过输入并运行算法以确定它是否有效。如果不运行算法,就不可能知道算法的输出。
编译器只是语法和语义的翻译器。它无法预见人们将如何使用该程序以及输出将是什么。