Теорема дедукцииВ своем доказательстве я буду использовать теорему дедукции. Скажу как и для чего её применяют, а затем докажу. В логике часто используют такую схему вывода:
Шаг 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, например.
План доказательства такой:
Сначала мы изучаем свойства 

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

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

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

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

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

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

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