Доказательство неразрешимости проблемы остановки

25

У меня возникли проблемы с пониманием доказательства неразрешимости проблемы остановки.

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

Если возвращает то, останавливается ли программа a на входе b , почему мы должны передавать код P для a и b ?H(a,b)abPab

Почему мы не можем подать с помощью P и некоторого произвольного ввода, скажем, x ?H()Px

Netik
источник
Имейте в виду, что в используемой здесь вычислительной модели допускается любой (закодированный) ввод. Там нет проверки типа или что-то в этом роде. Вы всегда можете закодировать программу и передать ее в качестве входных данных для себя.
asmeurer
2
Вы могли бы кормить любой вклад, который вы хотите. Структура этого доказательства требует рассмотрения конкретного входа. H
Дэвид Ричерби
1
Вы можете предоставить любой вклад в программу. Цель состоит в том, чтобы найти противоречие. Теоретически машина 'H' должна работать для всех видов входов. Таким образом, мы рассматриваем один из всех возможных входов, который приводит к противоречию.
Ugnes
Это доказательство слегка ошибочно. Подумайте, есть ли у меня H (), которая работает для всего, кроме себя; это все равно будет общим решением проблемы остановки.
Иисус Навин
Связанные, возможно, дубликаты: cs.stackexchange.com/questions/42819/…
Илмари Каронен

Ответы:

27

Цель доказательства - найти противоречие. Вы должны понять, что является противоречием, чтобы понять, почему используется как вход для себя. Противоречие неофициально: если у нас есть машина H (a, b), которая решает «a принимает b», то мы можем построить машину, которая принимает машины, которые не принимают себя. (Read , что несколько раз , пока вы не получите.) Машина , указанный на картинке - давайте назовем его M - M ( P ) = это P не принимает P ?PMM(P)=PP

Противоречие происходит , когда вы спросите: это принимает M ? Попробуйте выработать два варианта, чтобы увидеть, как возникает противоречие.MM

принимаетM тогда и только тогдакогда M не принимаетM ; это явно противоречие.MMMM

Вот почему важно, чтобы доказательство запускало на себе, а не на произвольном вводе. Это общая тема в доказательствах невозможности, известных как диагональные аргументы.P

aelguindy
источник
38

Проигнорируйте картину на мгновение; мы доберемся до этого в ближайшее время. Предполагается, что программа является тестером остановки: когда мы даем H ввод программы a (представляем a как список программы) и что-нибудь вообще для b , H ( a , b ) действует следующим образомH(a,b)HaabH(a,b)

  1. Если программа представлена привалах , когда дается б в качестве входных данных, H ( , б ) будет отвечать «да». С другой стороны, если программа, описываемая командой run, работает вечно при заданном вводе b, то H ( a , b ) ответит «нет».abH(a,b)abH(a,b)
  2. Важно отметить, что программа всегда будет останавливаться и давать правильный ответ для любых пар ( a , b ) .H(a,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)x

Пока все хорошо: , безусловно, будет программой, если ее подпрограмма H - это программа.PH

Теперь вернитесь к картинке. Что произойдет, если будет дано собственное описание в качестве входных данных? Изображение описывает именно этот сценарий: пусть p будет описанием программы P , затем, подставив в выделенную часть выше, мы получимPpP

остановится тогда и только тогда, когда программа P ( p ) будет работать вечно.P(p)P(p)

Понятно, что это парадоксальное поведение невозможно, поэтому мы вынуждены прийти к выводу, что подпрограмма не может быть тестером остановки, так как она терпит неудачу в одном случае, когда она задается ( p , p ) в качестве входных данных. Могут быть и другие случаи, когда H работает должным образом, но, поскольку H дает сбой хотя бы в одной ситуации, он не может быть полным тестером остановки, как требуется.H(p,p)HH

Рик Декер
источник
Мне нравится этот ответ. Хотя теперь, когда я понимаю доказательство, это просто доказывает, что H может генерировать исключение из предела рекурсии.
Факс
2
@ Факс Hне вызывается более одного раза, в этом нет никакой рекурсии P. H(P, P)не выполняется P, он просто «волшебным образом» определяет, Pостанавливается ли он при прохождении.
Ajedi32
@ 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
1
@ Факс Вы все же поднимаете хороший вопрос о том, может ли существовать программа, которая решает проблему остановки, за исключением случаев, когда она вызывается сама. См. Есть ли доказательства неразрешимости проблемы остановки, которая не зависит от самоссылки или диагонализации? за интересный вопрос по этому поводу.
Ajedi32
9

Попробуйте красивое доказательство с анимацией. А поскольку ответы должны содержать больше, чем просто ссылку на сайт, вот ответ на ваш вопрос.

Во-первых, давайте вспомним, как работает доказательство несуществования оракула Остановки. Мы доказываем, что для любого кандидата Hна оракула Halting существует программа 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.

QED

Вы спросили, почему мы рассматривали, 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.

Нет КЭД.

Я надеюсь, что это показывает, что мы должны рассмотреть H(P,P), чтобы наша идея работала.

Андрей Бауэр
источник
Ха - ха. Потрясающе! :)
aelguindy
2

Результатом доказательства является эта аналогия:

Если человек утверждает, что он / она ( PP(P)P(P)P(P)(P)(P)

(P)(P)

Ахмед Нассар
источник