Answers:
请暂时忽略图片。我们会尽快处理。程序应该是停止测试器:当我们给H输入程序a(以a作为程序列表)的输入时,以及b,H (a ,b )的所有值表现如下
无法构建的论点取决于特定的“反常”程序P的动作,该程序使用H作为子例程。P将任何程序x的列表作为输入,并执行以下操作:
P(x) =
run H(x, x)
if H(x, x) answers "yes"
loop forever
else
halt
不难看出
当且仅当程序 x在给出其自己的描述作为输入时将永远运行时, P (x )才会停止。
到目前为止很好:只要的子例程H是程序,它肯定是程序。
现在返回图片。如果给定自己的描述作为输入,会发生什么?该图仅描述了该场景:令p为程序P的描述,然后代入上面突出显示的部分,
仅当程序 P (p )永远运行时, P (p )才会停止。
显然,这种自相矛盾的行为是不可能的,因此我们不得不得出这样的结论:子程序不能成为停止测试器,因为它在给定(p ,p )作为输入的情况下会失败。在其他情况下,H可能会按其应有的方式工作,但由于H至少在一种情况下会失败,因此它不能按要求成为完整的停机测试仪。
H
不会被多次调用,无论如何P
都不会递归。H(P, P)
不会执行P
,它只是“神奇地”确定P
通过自身时是否停止。
H(P,P)
不必执行P
,但必须H(x ↦ H(x,x), P)
作为确定是否P
暂停的一部分执行。扩展到H(x ↦ H(y ↦ H(y,y), x), P)
等等。
H
在此证明中未指定的实现。所以,不,它不具有执行什么,不管是P
或本身。证明首先假设H
存在某种程序,该程序神奇地决定了暂停问题,然后继续证明该程序的存在本身就是矛盾的,因此不存在这种程序。
尝试对动画进行更漂亮的证明。而且由于答案不仅仅包含指向站点的链接,所以这是您问题的答案。
首先,让我们回顾一下“停止”预言的不存在证明是如何工作的。我们证明给任何候选人H
的停机甲骨文,有一个程序P
,并输入a
了这H
未能正确预测什么P(a)
呢。
定理:假设H
任何接受两个输入并总是返回halt
或的程序loop
。则存在一个节目Q
和输入a
,使得Q(a)
暂停,当且仅当,H(Q,a)
返回loop
。
证明。考虑程序
program P(y):
if H(y,y) = halt then
loop forever
else:
return
让Q = P
和a = P
。无论是H(Q,a) = halt
或H(Q,a) = loop
:
H(Q,a) = halt
那么Q(a)
(只是P(P)
)根据的定义永远运行P
。H(Q,a) = loop
然后Q(a)
停止的定义P
。优质教育
您问为什么我们考虑H(P,P)
而不是H(P,X)
其他X
。显而易见的答案是“因为H(P,P)
是使证明起作用的原因”!如果您习惯于H(P,X)
任意使用X
,那么您将陷入困境。确实,证明将如下所示:
破碎的证明。考虑程序
program P(y):
if H(y,y) = halt then
loop forever
else:
return
让Q = P
和a = X
为任意X
。无论是H(Q,X) = halt
或H(Q,X) = loop
:
H(Q,X) = halt
那时我们不能说出是什么P(X)
,因为P(X)
停顿是否取决于H(X,X)
回报。我们被卡住。但是,如果我们知道P(X)
并且X(X)
相同,我们就可以取得进步。(因此,我们确实应该接受X = P
)。H(Q,a) = loop
话,我们将再次陷入困境,而如果,我们将陷入困境X = P
。没有QED。
我希望这表明我们必须考虑H(P,P)
以使我们的想法可行。
证明的结果是这样的类比: