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)以使我们的想法可行。
证明的结果是这样的类比: