Теорема дедукцииВ своем доказательстве я буду использовать теорему дедукции. Скажу как и для чего её применяют, а затем докажу. В логике часто используют такую схему вывода:
Шаг 1. Гипотеза:
.... всякие логические выводы на основе правила вывода
(когда из истинных
и
делают вывод об истинности
) и используя
как истину...
Шаг N. Результат вывода из гипотезы
:
Шаг N+1. Результат вывода без всякой гипотезы
:
Вот такая методика. Она основана на том, что на каждом шаге вывода есть некая текущая промежуточная формула
. И на каждом шаге эту промежуточную формулу можно заменить на истинную формулу
. И уже без всякой гипотезы. Тогда Шаг N действительно превратиться в Шаг N+1, а Шаг 1 превратиться в тавтологию
.
Как сделать такой переход, если используем только правило вывода
? Достаточно разобрать один пример, чтоб понять. Пусть есть такой вывод пункта 3 из пунктов 1 и 2 по правилу
:
1. Выведено раньше:
2. Выведено раньше:
3. Из пп. 1 и 2 получим:
А нужно заменить это на следующее:
1. Выведено раньше:
2. Выведено раньше:
3. Из пп. 1 и 2 получим:
Но такую последовательность надо дополнить промежуточными шагами, чтобы использовать только правило вывода
и аксиомы теории. Для этого подойдет тавтология:
Тогда по правилу
в этой тавтологии убирается начало, совпадающее с п.1, затем начало от остатка, совпадающее с п.2 и остается то, что в п.3. Иногда данную тавтологию делают одной из аксиом логики (для удобства доказательства теоремы дедукции, видимо), впрочем, она не наглядна в качестве исходного истинного утверждения.
Поэтому там, где я буду использовать теорему дедукции – можно написать и «механический» вывод из истинных утверждений при помощи
без всяких гипотез. Кто хочет – может это легко проделать, но тут для краткости я будут использоваться теорему дедукции.
Нужная тавтологияЕще я буду использовать тавтологию
. Разумеется, ее можно вывести из аксиом логики (из аксиом логики по теореме о полноте можно вывести любую тавтологию), но просто покажу, что это тавтология:
1. Раскроем данное утверждение, заменяя импликацию
на эквивалентную ей дизъюнкцию
:
2. Заменим
на эквивалентное утверждение
, а
на
и уберем лишние скобки для ассоциативной операции
:
3. Воспользуемся дистрибутивностью операции
:
В результате мы получили утверждение, эквивалентное исходному утверждению. Оно истинное, если истинно
в силу последнего члена дизъюнкции
. А если
ложное, то утверждение будет истинным при истинности любого из
,
– в силу первого члена дизъюнкции
. Но если и они ложные – то выражение все равно истинное в силу среднего члена дизъюнкции
. Поэтому – это тавтология.
Лемма о диагонализации В доказательстве теоремы
будет использована возможность подставлять в алгоритм
текст самого алгоритма.
Чтоб отличить в формулах алгоритмы от их текстов, буду обозначать текст алгоритма чертой над обозначением алгоритма. Вот так, например:
Очевидно, что всегда можно сделать алгоритм
, который сначала выписывает текст алгоритма
, а затем запускает алгоритм
с этим текстом в качестве аргумента. Так вот, у этого алгоритма
тоже есть текст его «программы», и этот текст может быть получен из текста алгоритма
по некоторому алгоритму
. Это довольно очевидно и такая возможность берется за исходную посылку. То есть - нам нужны достаточно выразительные теории, которые способны представлять алгоритмы и тогда алгоритм
- будет среди них.
В теории алгоритмов для аналогичных целей используется теорема о неподвижной точке, но там нумерация алгоритмов сплошная и неполиномиальная поэтому, а нам нужна нумерация в духе «тексты алгоритмов». Да, не все тексты будут текстами алгоритмов, но этот случай нас не пугает - тогда такие «алгоритмы» ничего не возвращают и это можно понять.
Поэтому за основу возьмем Лемму о диагонализации из книги «Вычислимость и логика» Дж. Булос, Р. Джеффри. Только там она для предиката доказана, а мы докажем ее для алгоритма. В остальном я практически переписываю доказательство. И еще один момент - там доказательство на основе «представлений», а я оперирую с алгоритмами - логика та же, просто через представления возникает дополнительный «этаж» манипуляций, но мы просто можем считать, что наша теория более выразительная, чем теория Пеано и можно оперировать прямо со свойствами алгоритмов.
Лемма о диагонализации. Для произвольного алгоритма
найдется алгоритм
, такой что
.
Доказательство. Назовем алгоритмом
тот алгоритм, который выполняет расчет как
. Собственно,
отличается от
только тем, что алгоритм
сначала выписывает аргумент
, а затем запускает композицию функций
с этим аргументом. И - текст этого алгоритма
получается вот так:
. Ведь алгоритм
построен именно так, чтоб возвращать текст подобных алгоритмов.
1. По свойствам
:
2. По построению
:
3. Из п. 1 подстановкой частей равенства в
:
4. Из пп. 2 и 3:
Лемма доказана. Вот так мы переписали доказательство для предикатов в доказательство для алгоритмов. И вся разница между предикатом и алгоритмом в том - что вместо значка эквивалентности в последнем предложении стоит знак равенства. Но по сути тут огромное отличие. Ведь алгоритм выдает при одних и тех же аргументах один и тот же результат - и если он не останавливается, то он нигде не останавливается. И ни от какой теории это не зависит. И поэтому можно построить «Универсальный алгоритм», который полностью моделирует поведение алгоритма-аргумента (точнее, алгоритма, чей текст передан в качестве аргумента).
А вот у предиката нет возможности «не останавливаться» - у него нет своей «самостоятельной жизни» вне теории. Поэтому с предикатами нет возможности построить универсальный предикат, который получал бы текст другого предиката и был точно таким же истинным или ложным как он:
Ведь универсальный предикат при помощи отрицания становится универсальным анти-предикатом, который всегда возвращал бы противоположное, чем предикат-аргумент (точнее, предикат, чей текст получен в качестве аргумента). А это невозможно, потому что по лемме о диагонализации найдется эквивалентный предикат для данного анти-предиката. Значит, универсальный анти-предикат невозможен, значит, невозможен и универсальный предикат.
В ходе доказательства теоремы
мы увидим, как это различие между предикатами и алгоритмами выльется в существенное отличие получившейся неполноты от конструкции теорем Гёделя.
Постановка задачиРассмотрим следующую задачу из класса
, сформулированную в 2-ух пунктах:
1. Имеется некоторая непротиворечивая (важно!) система аксиом
. В качестве слов будем рассматривать
– записанные на языке теории алгоритмы. В качестве слова-свидетеля будем рассматривать текст доказательства для
. Где i – некоторое число (можно считать, что число записано в десятичном представлении, но это не принципиально). Если имеется слово
и слово-свидетель
, то, как известно из логики, можно при помощи алгоритма автоматической проверки доказательств
за полиномиальное время (число шагов)
от размеров
и
проверить, доказывает ли
какое-то равенство
для
на базе аксиом
. На размер
накладывается стандартное для NP ограничение некоторым полиномом
. Разумеется, если в качестве
и/или
выступает какой-то бессмысленный текст, то
возвращает «ложь».
Размеры всех упомянутых полиномов считаем достаточно большими для наших целей - по контексту будет видно, что это легко достижимо.
2. Если система аксиом
противоречива или это какой-то бессмысленный текст, то в качестве
выбран предикат, который всегда выдает «ложь» и явно быстрее, чем
.
Берем нашу задачу из пунктов 1 и 2. Берем метод поиска слов-свидетелей
, подходящих для заданного слова
(то есть,
и
дает истину). Назовем наш метод поиска слов-свидетелей для слова
- алгоритмом
.
Есть мнение, что всегда есть метод поиска, который всегда находит нужное слово-свидетель, если оно вообще есть. Это - прямой перебор всех
, таких что
. Это мнение ошибочно, как мы увидим, в силу пункта 2 нашей задачи. А если бы было верно
, то у нас был бы алгоритм поиска, который находил бы слово-свидетель (если оно есть) за полиномиальное время. Но мы докажем, что любой метод будет неполон - если он корректен, поэтому насчет полиномиальности скорости поиска мы даже не будем думать, главное, чтоб алгоритм поиска завершал свою работу в пределах заранее известного (от размера заданного слова и аксиом) времени.
Для простоты считаем, что
выдает не текст доказательства (слово-свидетель), а результат этого доказательства (число
в некотором представлении) как прогноз результата работы алгоритма
. Напомню, что текст некоторого алгоритма
подставлен на место переменной
, когда решается вопрос про результат работы этого алгоритма.
Наше упрощение (результат вместо доказательства) вполне уместно, потому что мы будем опровергать полноту, а полный метод обнаружения доказательств давал бы возможность и для полного метода обнаружения результатов (для которых есть подходящее доказательство). Поэтому если нет полного метода для результата, то нет полного метода и для доказательств.
Если же нужного доказательства среди подходящих по размеру доказательств найти не удалось, то
возвращает
. Ясно, что результаты
не прямо равны результатам
- просто потому, что результаты могут быть какие угодно, а нам надо еще занять место для
, который ведь тоже может выдаваться какими-то алгоритмами. Есть разные способы ставить значения в соответствие друг другу, например - канторова пара из признака 1 и результата работы
, либо просто
и
- для
.
Просто введем следующее обозначение для соответствия результатов самих алгоритмов и результатов прогнозов для них от
:
Если
, и
выдает правильный прогноз, то
.
Разумеется,
обратим - то есть, по нему можно узнать
. И
никогда не возвращает
.
Теперь сформулируем частичное условие корректности для
при
:
Сначала рассмотрим заключение в данной импликации:
Очень важно, что
не зависит от аксиом, хотя
зависит. И мы можем написать это равенство благодаря п.2 нашей задачи. Потому что если заданные аксиомы выдают абсурдные выводы про работы алгоритмов, то это противоречие и эти выводы не имеют значения и в силе будет
. Противоречие возникнет из-за 2х разных выводов про результат работы
- эталонного (который отражают теоремы Пеано без расширений, например) и ложного.
Но проблема в том, что алгоритм
может ведь и не остановится. И не будет эталона для сравнения. И в таких случаях есть угроза, что теория содержит непротиворечивую, хоть и абсурдную аксиому, что где-то в бесконечности алгоритм все же что-то вернет. Чтобы избежать таких накладок, мы будем рассматривать только алгоритмы с остановкой. И для этого у нас в частичной корректности есть посылка импликации:
Это такой алгоритм, который проверяет, что разбираемый алгоритм
делает меньше шагов, чем 100-кратное количество шагов работы у алгоритма
. Технически это можно сделать последовательным исполнением того и другого по одному шагу. И если
отработал 100 раз, а
еще не закончил работу, то мы не можем пользоваться нашей частичной корректностью. Но зато когда можем - то мы уверены, что можем использовать для проверки
- который независим от аксиом.
Утверждение частичной корректности можно переписать с использованием универсального алгоритма
, который исполняет любой алгоритм по его тексту и возвращает результат (если остановится) в формате
. Если текст абсурден - то возвращает
. Как известно, универсальный алгоритм
существует и его легко построить - в отличие от универсального предиката. О чем уже было сказано в разделе «Лемма о диагонализации». Тогда мы могли бы вместо
поставить
и квантор общности, но нам частичная корректность потребуется только для одного алгоритма, поэтому сойдёт и так.
И, разумеется, время (количество шагов ) работы
конечно и ограничено некоторым всюду определённым алгоритмом
.
То, что сформулировано про корректность - сформулировано «со стороны». Мы как бы рассматриваем
в какой-то непротиворечивой теории, притом аксиомы этой теории не обязательно равны аксиомам
. И принцип корректности, кстати, распространяется и на противоречивые теории - в соответствии с пунктом 2. А противоречивую теорию можно рассмотреть только с точки зрения непротиворечивой.
Существует ли хоть одна корректная
? Да - которая всегда возвращает knockout, например.
План доказательства такой:
Сначала мы изучаем свойства
«со стороны» (всегда есть непротиворечивая теория, соответствующая арифметике в стандартной интерпретации , в которой можно изучить
- с заданным в ней
), затем мы делаем выводы о поведении
в целом - при любых
, на основании этого выписываем истинное в стандартной интерпретации арифметики свойство, берем его в качестве аксиомы, расширяем им непротиворечивую теорию. Теория остается при этом непротиворечивой, а затем в этой теории доказываем неполноту
. Перейдем к реализации этого плана.
(Тексты логических выводов перепишу в формулы
и выложу сегодня-завтра. Да и большой текст сразу выложить невозможно даже кусками - форум не дает)