У меня возникли проблемы с пониманием доказательства неразрешимости проблемы остановки.
Если возвращает то, останавливается ли программа a на входе b , почему мы должны передавать код P для a и b ?
Почему мы не можем подать с помощью P и некоторого произвольного ввода, скажем, x ?
Ответы:
Цель доказательства - найти противоречие. Вы должны понять, что является противоречием, чтобы понять, почему используется как вход для себя. Противоречие неофициально: если у нас есть машина H (a, b), которая решает «a принимает b», то мы можем построить машину, которая принимает машины, которые не принимают себя. (Read , что несколько раз , пока вы не получите.) Машина , указанный на картинке - давайте назовем его M - M ( P ) = это P не принимает ⟨ P ⟩ ?п M M( P) = п ⟨ P⟩
Противоречие происходит , когда вы спросите: это принимает ⟨ M ⟩ ? Попробуйте выработать два варианта, чтобы увидеть, как возникает противоречие.M ⟨ M⟩
принимает ⟨ M ⟩ тогда и только тогдакогда M не принимает ⟨ M ⟩ ; это явно противоречие.M ⟨ M⟩ M ⟨ M⟩
Вот почему важно, чтобы доказательство запускало на себе, а не на произвольном вводе. Это общая тема в доказательствах невозможности, известных как диагональные аргументы.п
источник
Проигнорируйте картину на мгновение; мы доберемся до этого в ближайшее время. Предполагается, что программа является тестером остановки: когда мы даем H ввод программы a (представляем a как список программы) и что-нибудь вообще для b , H ( a , b ) действует следующим образомЧАС( а , б ) ЧАС a a б ЧАС( а , б )
Аргумент о том, что невозможно создать, основан на действии конкретной «порочной» программы P , которая использует H в качестве подпрограммы. P принимает в качестве входных данных список любой программы x и выполняет следующие действия:ЧАС п ЧАС п Икс
Нетрудно понять, что
Пока все хорошо: , безусловно, будет программой, если ее подпрограмма H - это программа.п ЧАС
Теперь вернитесь к картинке. Что произойдет, если будет дано собственное описание в качестве входных данных? Изображение описывает именно этот сценарий: пусть 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
на оракула Halting существует программаP
и вход,a
для которогоH
не удается правильно предсказать, чтоP(a)
делает.Теорема: Пусть
H
любая программа , которая принимает два входа и всегда возвращают либоhalt
илиloop
. Тогда существует программаQ
и входные данныеa
, которыеQ(a)
останавливаются тогда и только тогда, когдаH(Q,a)
возвращаетсяloop
.Доказательство. Рассмотрим программу
Пусть
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
.QED
Вы спросили, почему мы рассматривали,
H(P,P)
а неH(P,X)
для какой-то другойX
. Очевидный ответ «потому чтоH(P,P)
это то, что заставляет доказательство работать»! Если бы вы использовалиH(P,X)
для какого-то произвольногоX
, то вы бы застряли. Действительно, тогда доказательство будет выглядеть так:Сломанное доказательство. Рассмотрим программу
Пусть
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
.Нет КЭД.
Я надеюсь, что это показывает, что мы должны рассмотреть
H(P,P)
, чтобы наша идея работала.источник
Результатом доказательства является эта аналогия:
Если человек утверждает, что он / она ( Pп ( P) P′ (P′) P (P) (P) (P)
источник