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