暂停问题的不确定性证明


25

我无法理解暂停问题无法确定的证据。

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

如果返回是否该程序输入暂停,为什么我们要通过的代码两个和?a b P a bH一种b一种bP一种b

为什么我们不能用和任意输入给?HPX


请记住,在此处使用的计算模型中,任何(编码的)输入都是允许的。没有类型检查或类似的东西。您始终可以对程序进行编码,并将其作为输入传递给自身。
asmeurer's

2
可以养活任何你想要的输入。该证明的结构需要考虑特定的输入。H
David Richerby,2016年

1
您可以向程序提供任何输入。目的是找到矛盾。理论上,机器“ H”应适用于各种输入。因此,我们考虑所有可能的输入之一,这会导致矛盾。
格尼斯

该证据有缺陷。考虑一下我是否有一个H()可以用于除自身之外的所有东西;仍然是停止问题的一般解决方案。
约书亚

相关的,可能是重复的:cs.stackexchange.com/questions/42819/...
ILMARI Karonen

Answers:


27

该证明旨在寻找矛盾。您必须了解所产生的矛盾是什么,以便了解为什么将用作自身的输入。非正式地,矛盾是:如果我们有一个决定“ a接受b”的机器H(a,b),那么我们就可以构造一个接受不接受自己的机器的机器。(读了几次,直到你得到它。)在图中所示的机器-我们称之为 -不不接受?中号中号P = P P PMM(P)=PP

当您问:接受吗?尝试找出这两个选项,以了解如何产生矛盾。中号中号中号

中号中号中号中号接受当且仅当不接受 ; 这显然是一个矛盾。中号中号中号

这就是为什么对证明本身必须运行而不是任意输入的原因。这是不可能证明中的常见主题,称为对角线参数。P


38

请暂时忽略图片。我们会尽快处理。程序应该是停止测试器:当我们给H输入程序a(以a作为程序列表)的输入时,以及bH a b )的所有值表现如下H一种bH一种一种bH一种b

  1. 如果在给定b作为输入时 hal 表示的程序停止,则H a b 将回答“是”。在另一方面,如果该程序通过描述一个给定的输入时永远运行b然后ħ b 将回答“否”。一种bH一种b一种bH一种b
  2. 重要的是,程序始终会停止并给出任何a b 的正确答案。H一种b

无法构建的论点取决于特定的“反常”程序P的动作,该程序使用H作为子例程。P将任何程序x的列表作为输入,并执行以下操作:HPHPX

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

不难看出

当且仅当程序 x在给出其自己的描述作为输入时将永远运行时, P x 才会停止。PXX

到目前为止很好:只要的子例程H是程序它肯定是程序。PH

现在返回图片。如果给定自己的描述作为输入,会发生什么?该图仅描述了该场景:令p为程序P的描述,然后代入上面突出显示的部分,PpP

仅当程序 P p 永远运行时, P p 才会停止。PpPp

显然,这种自相矛盾的行为是不可能的,因此我们不得不得出这样的结论:子程序不能成为停止测试器,因为它在给定p p 作为输入的情况下会失败。在其他情况下,H可能会按其应有的方式工作,但由于H至少在一种情况下会失败,因此它不能按要求成为完整的停机测试仪。HppHH


我喜欢这个答案。尽管现在我了解了证明,但似乎只是证明H可以引发递归限制异常。
传真

2
@Fax H不会被多次调用,无论如何P都不会递归。H(P, P)不会执行P,它只是“神奇地”确定P通过自身时是否停止。
Ajedi32 '16

@ Ajedi32 H(P,P)不必执行P,但必须H(x ↦ H(x,x), P)作为确定是否P暂停的一部分执行。扩展到H(x ↦ H(y ↦ H(y,y), x), P)等等。
传真

@Fax H在此证明中未指定的实现。所以,不,它不具有执行什么,不管是P或本身。证明首先假设H存在某种程序,该程序神奇地决定了暂停问题,然后继续证明该程序的存在本身就是矛盾的,因此不存在这种程序。
Ajedi32 '16

1
@Fax您确实提出了一个好点,那就是是否存在一个程序,该程序可以决定暂停问题(除非本身被调用)。请参阅是否有任何证据证明不依赖于自引用或对角化的停止问题的不确定性?对此有一个有趣的问题。
Ajedi32 '16

9

尝试对动画进行更漂亮的证明。而且由于答案不仅仅包含指向站点的链接,所以这是您问题的答案。

首先,让我们回顾一下“停止”预言的不存在证明是如何工作的。我们证明给任何候选人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 = Pa = P。无论是H(Q,a) = haltH(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 = Pa = X为任意X。无论是H(Q,X) = haltH(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)以使我们的想法可行。


哈哈。太棒了!:)
aelguindy's

2

证明的结果是这样的类比:

PPPPPPPP

PP

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.