Теорема дедукцииВ своем доказательстве я буду использовать теорему дедукции. Скажу как и для чего её применяют, а затем докажу. В логике часто используют такую схему вывода:
Шаг 1. Гипотеза:

.... всякие логические выводы на основе правила вывода

(когда из истинных

и

делают вывод об истинности

) и используя

как истину...
Шаг N. Результат вывода из гипотезы

:
Шаг N+1. Результат вывода без всякой гипотезы

:

Вот такая методика. Она основана на том, что на каждом шаге вывода есть некая текущая промежуточная формула

. И на каждом шаге эту промежуточную формулу можно заменить на истинную формулу

. И уже без всякой гипотезы. Тогда Шаг N действительно превратиться в Шаг N+1, а Шаг 1 превратиться в тавтологию

.
Как сделать такой переход, если используем только правило вывода

? Достаточно разобрать один пример, чтоб понять. Пусть есть такой вывод пункта 3 из пунктов 1 и 2 по правилу

:
1. Выведено раньше:

2. Выведено раньше:

3. Из пп. 1 и 2 получим:

А нужно заменить это на следующее:
1. Выведено раньше:

2. Выведено раньше:

3. Из пп. 1 и 2 получим:

Но такую последовательность надо дополнить промежуточными шагами, чтобы использовать только правило вывода

и аксиомы теории. Для этого подойдет тавтология:
![$C \to (A \to B) \to [ (C \to A) \to (C \to B) ]$ $C \to (A \to B) \to [ (C \to A) \to (C \to B) ]$](https://dxdy-03.korotkov.co.uk/f/6/5/c/65cb8f2335342733dc0f3f744fd4002482.png)
Тогда по правилу

в этой тавтологии убирается начало, совпадающее с п.1, затем начало от остатка, совпадающее с п.2 и остается то, что в п.3. Иногда данную тавтологию делают одной из аксиом логики (для удобства доказательства теоремы дедукции, видимо), впрочем, она не наглядна в качестве исходного истинного утверждения.
Поэтому там, где я буду использовать теорему дедукции – можно написать и «механический» вывод из истинных утверждений при помощи

без всяких гипотез. Кто хочет – может это легко проделать, но тут для краткости я будут использоваться теорему дедукции.
Нужная тавтологияЕще я буду использовать тавтологию
![$(X1 \to Y) \to [ (X2 \to Y) \to ( (X1 \vee X2) \to Y ) ]$ $(X1 \to Y) \to [ (X2 \to Y) \to ( (X1 \vee X2) \to Y ) ]$](https://dxdy-04.korotkov.co.uk/f/3/2/c/32c28251775abdffad71a4a3a17a7b2382.png)
. Разумеется, ее можно вывести из аксиом логики (из аксиом логики по теореме о полноте можно вывести любую тавтологию), но просто покажу, что это тавтология:
1. Раскроем данное утверждение, заменяя импликацию

на эквивалентную ей дизъюнкцию

:
![$\neg (\neg X1 \vee Y) \vee [ \neg (\neg X2 \vee Y) \vee ( \neg (X1 \vee X2) \vee Y ) ]$ $\neg (\neg X1 \vee Y) \vee [ \neg (\neg X2 \vee Y) \vee ( \neg (X1 \vee X2) \vee Y ) ]$](https://dxdy-02.korotkov.co.uk/f/1/4/f/14faa34a4b1f2a3aa2b9b34c2a0c8d0082.png)
2. Заменим

на эквивалентное утверждение

, а

на

и уберем лишние скобки для ассоциативной операции

:

3. Воспользуемся дистрибутивностью операции

:

В результате мы получили утверждение, эквивалентное исходному утверждению. Оно истинное, если истинно

в силу последнего члена дизъюнкции

. А если

ложное, то утверждение будет истинным при истинности любого из

,

– в силу первого члена дизъюнкции

. Но если и они ложные – то выражение все равно истинное в силу среднего члена дизъюнкции

. Поэтому – это тавтология.
Лемма о диагонализации В доказательстве теоремы

будет использована возможность подставлять в алгоритм

текст самого алгоритма.
Чтоб отличить в формулах алгоритмы от их текстов, буду обозначать текст алгоритма чертой над обозначением алгоритма. Вот так, например:

Очевидно, что всегда можно сделать алгоритм

, который сначала выписывает текст алгоритма

, а затем запускает алгоритм

с этим текстом в качестве аргумента. Так вот, у этого алгоритма

тоже есть текст его «программы», и этот текст может быть получен из текста алгоритма

по некоторому алгоритму

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

- будет среди них.
В теории алгоритмов для аналогичных целей используется теорема о неподвижной точке, но там нумерация алгоритмов сплошная и неполиномиальная поэтому, а нам нужна нумерация в духе «тексты алгоритмов». Да, не все тексты будут текстами алгоритмов, но этот случай нас не пугает - тогда такие «алгоритмы» ничего не возвращают и это можно понять.
Поэтому за основу возьмем Лемму о диагонализации из книги «Вычислимость и логика» Дж. Булос, Р. Джеффри. Только там она для предиката доказана, а мы докажем ее для алгоритма. В остальном я практически переписываю доказательство. И еще один момент - там доказательство на основе «представлений», а я оперирую с алгоритмами - логика та же, просто через представления возникает дополнительный «этаж» манипуляций, но мы просто можем считать, что наша теория более выразительная, чем теория Пеано и можно оперировать прямо со свойствами алгоритмов.
Лемма о диагонализации. Для произвольного алгоритма

найдется алгоритм

, такой что

.
Доказательство. Назовем алгоритмом

тот алгоритм, который выполняет расчет как

. Собственно,

отличается от

только тем, что алгоритм

сначала выписывает аргумент

, а затем запускает композицию функций

с этим аргументом. И - текст этого алгоритма

получается вот так:

. Ведь алгоритм

построен именно так, чтоб возвращать текст подобных алгоритмов.
1. По свойствам

:

2. По построению

:

3. Из п. 1 подстановкой частей равенства в

:

4. Из пп. 2 и 3:
Лемма доказана. Вот так мы переписали доказательство для предикатов в доказательство для алгоритмов. И вся разница между предикатом и алгоритмом в том - что вместо значка эквивалентности в последнем предложении стоит знак равенства. Но по сути тут огромное отличие. Ведь алгоритм выдает при одних и тех же аргументах один и тот же результат - и если он не останавливается, то он нигде не останавливается. И ни от какой теории это не зависит. И поэтому можно построить «Универсальный алгоритм», который полностью моделирует поведение алгоритма-аргумента (точнее, алгоритма, чей текст передан в качестве аргумента).
А вот у предиката нет возможности «не останавливаться» - у него нет своей «самостоятельной жизни» вне теории. Поэтому с предикатами нет возможности построить универсальный предикат, который получал бы текст другого предиката и был точно таким же истинным или ложным как он:
Ведь универсальный предикат при помощи отрицания становится универсальным анти-предикатом, который всегда возвращал бы противоположное, чем предикат-аргумент (точнее, предикат, чей текст получен в качестве аргумента). А это невозможно, потому что по лемме о диагонализации найдется эквивалентный предикат для данного анти-предиката. Значит, универсальный анти-предикат невозможен, значит, невозможен и универсальный предикат.
В ходе доказательства теоремы

мы увидим, как это различие между предикатами и алгоритмами выльется в существенное отличие получившейся неполноты от конструкции теорем Гёделя.
Постановка задачиРассмотрим следующую задачу из класса

, сформулированную в 2-ух пунктах:
1. Имеется некоторая непротиворечивая (важно!) система аксиом

. В качестве слов будем рассматривать

– записанные на языке теории алгоритмы. В качестве слова-свидетеля будем рассматривать текст доказательства для

. Где i – некоторое число (можно считать, что число записано в десятичном представлении, но это не принципиально). Если имеется слово

и слово-свидетель

, то, как известно из логики, можно при помощи алгоритма автоматической проверки доказательств

за полиномиальное время (число шагов)

от размеров

и

проверить, доказывает ли

какое-то равенство

для

на базе аксиом

. На размер

накладывается стандартное для NP ограничение некоторым полиномом

. Разумеется, если в качестве

и/или

выступает какой-то бессмысленный текст, то

возвращает «ложь».
Размеры всех упомянутых полиномов считаем достаточно большими для наших целей - по контексту будет видно, что это легко достижимо.
2. Если система аксиом

противоречива или это какой-то бессмысленный текст, то в качестве

выбран предикат, который всегда выдает «ложь» и явно быстрее, чем

.
Берем нашу задачу из пунктов 1 и 2. Берем метод поиска слов-свидетелей

, подходящих для заданного слова

(то есть,

и

дает истину). Назовем наш метод поиска слов-свидетелей для слова

- алгоритмом

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

, таких что

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

, то у нас был бы алгоритм поиска, который находил бы слово-свидетель (если оно есть) за полиномиальное время. Но мы докажем, что любой метод будет неполон - если он корректен, поэтому насчет полиномиальности скорости поиска мы даже не будем думать, главное, чтоб алгоритм поиска завершал свою работу в пределах заранее известного (от размера заданного слова и аксиом) времени.
Для простоты считаем, что

выдает не текст доказательства (слово-свидетель), а результат этого доказательства (число

в некотором представлении) как прогноз результата работы алгоритма

. Напомню, что текст некоторого алгоритма

подставлен на место переменной

, когда решается вопрос про результат работы этого алгоритма.
Наше упрощение (результат вместо доказательства) вполне уместно, потому что мы будем опровергать полноту, а полный метод обнаружения доказательств давал бы возможность и для полного метода обнаружения результатов (для которых есть подходящее доказательство). Поэтому если нет полного метода для результата, то нет полного метода и для доказательств.
Если же нужного доказательства среди подходящих по размеру доказательств найти не удалось, то

возвращает

. Ясно, что результаты

не прямо равны результатам

- просто потому, что результаты могут быть какие угодно, а нам надо еще занять место для

, который ведь тоже может выдаваться какими-то алгоритмами. Есть разные способы ставить значения в соответствие друг другу, например - канторова пара из признака 1 и результата работы

, либо просто

и

- для

.
Просто введем следующее обозначение для соответствия результатов самих алгоритмов и результатов прогнозов для них от

:
Если

, и

выдает правильный прогноз, то

.
Разумеется,

обратим - то есть, по нему можно узнать

. И

никогда не возвращает

.
Теперь сформулируем частичное условие корректности для

при

:
![\begin{multline*}
\operatorname{Check100Mt}(Aks, \overline{A()}) \to \\
\to ( [ \operatorname{Mt}(Aks, \overline{A()}) = \operatorname{FormatMt}(A()) ] \vee
[ \operatorname{Mt}(Aks, \overline{A()}) = knockout ] )
\end{multline*} \begin{multline*}
\operatorname{Check100Mt}(Aks, \overline{A()}) \to \\
\to ( [ \operatorname{Mt}(Aks, \overline{A()}) = \operatorname{FormatMt}(A()) ] \vee
[ \operatorname{Mt}(Aks, \overline{A()}) = knockout ] )
\end{multline*}](https://dxdy-01.korotkov.co.uk/f/4/d/7/4d729066ec0af0fb3a019489005d9d9682.png)
Сначала рассмотрим заключение в данной импликации:
![\begin{multline*}
[ \operatorname{Mt}(Aks, \overline{A()}) = \operatorname{FormatMt}(A()) ] \vee
[ \operatorname{Mt}(Aks, \overline{A()}) = knockout ]
\end{multline*} \begin{multline*}
[ \operatorname{Mt}(Aks, \overline{A()}) = \operatorname{FormatMt}(A()) ] \vee
[ \operatorname{Mt}(Aks, \overline{A()}) = knockout ]
\end{multline*}](https://dxdy-02.korotkov.co.uk/f/1/3/c/13cf4b4b3f3c7badf03676fd9cb7102d82.png)
Очень важно, что

не зависит от аксиом, хотя

зависит. И мы можем написать это равенство благодаря п.2 нашей задачи. Потому что если заданные аксиомы выдают абсурдные выводы про работы алгоритмов, то это противоречие и эти выводы не имеют значения и в силе будет

. Противоречие возникнет из-за 2х разных выводов про результат работы

- эталонного (который отражают теоремы Пеано без расширений, например) и ложного.
Но проблема в том, что алгоритм

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

Это такой алгоритм, который проверяет, что разбираемый алгоритм

делает меньше шагов, чем 100-кратное количество шагов работы у алгоритма

. Технически это можно сделать последовательным исполнением того и другого по одному шагу. И если

отработал 100 раз, а

еще не закончил работу, то мы не можем пользоваться нашей частичной корректностью. Но зато когда можем - то мы уверены, что можем использовать для проверки

- который независим от аксиом.
Утверждение частичной корректности можно переписать с использованием универсального алгоритма

, который исполняет любой алгоритм по его тексту и возвращает результат (если остановится) в формате

. Если текст абсурден - то возвращает

. Как известно, универсальный алгоритм

существует и его легко построить - в отличие от универсального предиката. О чем уже было сказано в разделе «Лемма о диагонализации». Тогда мы могли бы вместо

поставить

и квантор общности, но нам частичная корректность потребуется только для одного алгоритма, поэтому сойдёт и так.
И, разумеется, время (количество шагов ) работы

конечно и ограничено некоторым всюду определённым алгоритмом

.
То, что сформулировано про корректность - сформулировано «со стороны». Мы как бы рассматриваем

в какой-то непротиворечивой теории, притом аксиомы этой теории не обязательно равны аксиомам

. И принцип корректности, кстати, распространяется и на противоречивые теории - в соответствии с пунктом 2. А противоречивую теорию можно рассмотреть только с точки зрения непротиворечивой.
Существует ли хоть одна корректная

? Да - которая всегда возвращает knockout, например.
План доказательства такой:
Сначала мы изучаем свойства

«со стороны» (всегда есть непротиворечивая теория, соответствующая арифметике в стандартной интерпретации , в которой можно изучить

- с заданным в ней

), затем мы делаем выводы о поведении

в целом - при любых

, на основании этого выписываем истинное в стандартной интерпретации арифметики свойство, берем его в качестве аксиомы, расширяем им непротиворечивую теорию. Теория остается при этом непротиворечивой, а затем в этой теории доказываем неполноту

. Перейдем к реализации этого плана.
(Тексты логических выводов перепишу в формулы

и выложу сегодня-завтра. Да и большой текст сразу выложить невозможно даже кусками - форум не дает)