Глава 5 Машины Тьюринга

We use cookies. Read the Privacy and Cookie Policy

Глава 5

Машины Тьюринга

На что я могу надеяться?

Иммануил Кант

«Евр…» Бетти нетерпеливо ожидала, когда телеграфный механизм остановится, чтобы прочитать сообщение целиком. «Европа». Прошло больше пяти лет с того дня, как журнал, который она любила читать в часы, свободные от работы прислугой в одной из богатейших лондонских семей, устроил конкурс кроссвордов. «Европа ник…» Каждый день она вспоминала, как удивило ее известие о победе в конкурсе и как она не решалась попросить недельный отпуск. «Европа никогда». Затем она попыталась восстановить в памяти путешествие с другими любителями логических задач, пока очертания Блетчли-парка не стали в ее памяти столь же ясными, как в тот осенний день, когда она впервые увидела его. «Европа никогда не будет».

Она боялась забыть малейшие подробности истории, которую собиралась рассказать всему миру, когда закончится война. Р-у-с-с-к-о-й. Последнее слово появилось с небольшим опозданием, но Бетти могла праздновать очередную победу союзных войск: ей удалось перехватить сообщение «Европа никогда не будет русской». Было 15 апреля 1945 года, и с этой фразой Адольф Гитлер обратился к высокопоставленным членам нацистской партии.

Они не единственными получили умоисступленное сообщение диктатора за две недели до его самоубийства: Гиммлер и не подозревал, что его переписку с Гитлером читало одновременно десять тысяч человек в маленьком поселке в восьмидесяти километрах от Лондона, надежно спрятанном, чтобы избежать бомбардировок. Именно там в 1939 году была создана правительственная школа кодов и шифров, которая занималась расшифровкой сообщений, кодируемых нацистами на машине «Энигма» — самой совершенной шифровальной машине того времени. «Энигму» в 1918 году начал производить инженер Артур Шербиус. Вначале он продавал машину частным лицам, однако потом ее потенциал оценили немецкая армия и флот, и «Энигма» начала широко использоваться военными, службой безопасности и разведкой. Когда войска вермахта вторглись в Польшу в начале сентября 1939 года, методы шифрования «Энигмы» достигли такой сложности, что возможность их взлома даже не рассматривалась.

И лишь совместная работа группы, состоявшей из математиков, физиков, переводчиков и уже упомянутых нами женщин — победительниц конкурса кроссвордов, помогла разгадать загадку дьявольской машины, которая посредством электрических импульсов и системы роторов преобразовывала одну и ту же букву, записанную два раза подряд, в разные символы. Одетые в костюмы пиратов, словно скучающая знать, ищущая развлечений в годы войны, первые дешифровщики в 1939 году разместились в бараках рядом с викторианским поместьем. Ни одна душа в соседнем поселке не должна была заподозрить, какую важную задачу решали обитатели Station X — так назывался центр в сообщениях союзников, отправляемых на передовую. Даже Уинстон Черчилль называл Блетчли-парк «курицей, несущей золотые яйца, которая никогда не кудахчет».

Справа — немецкие военные кодируют сообщения на машине «Энигма», один из экземпляров которой изображен на рисунке слева.

Вверху — зал Блетчли-парка, в котором происходила расшифровка кодов «Энигмы». Внизу — современная фотография поместья.

Поляки заметили одну особенность «Энигмы», делавшую ее уязвимой: каждая буква вне зависимости от положения всегда кодировалась одной и той же буквой. И все равно потребовалось ответить еще на много вопросов, прежде чем за пять дней до высадки союзников в Нормандии обитатели Блетчли-парка смогли отпраздновать расшифровку секретного сообщения Гитлера. В сообщении утверждалось, что американский десант высадится в Кале, почти в трехстах километрах к северо-востоку от пляжа Арроманш. Возможно, высадка союзников вообще не состоялась бы, если бы не была получена информация о местонахождении нацистских подлодок, которую удалось расшифровать в Station X. Это было особенно удивительно, если учесть, что в 1939 году у дешифровщиков не было ни одной машины «Энигма», на которой можно было бы проверять свои гипотезы.

Работая день и ночь сменами по восемь часов, дешифровщики из Блетчли-парка сконструировали прототип машины, идентичной той, что находилась в руках у на цистов, однако успех предприятия был бы невозможен без юного английского математика, которого многие студенты Кембриджа сравнивали с греческим «богом из машины»: он появился словно из ниоткуда, чтобы помочь выиграть войну. Без Алана Тьюринга (1912–1954) было бы нелегко понять, что во всех сообщениях обязательно упоминались дата и время, к которым они относились, и именно с этого следовало начинать их расшифровку.

Статуя Алана Тьюринга из угольного сланца работы британского скульптора Стивена Кеттла рядом с портретом Тьюринга, который хранится в Национальном музее компьютеров в Блетчли-парке

(источник: Джон Каллас).

Тьюринг также предложил сконструировать огромный компьютер «Бомба», который позволял моделировать работу десяти «Энигм» одновременно. Да, Тьюринг видел дальше своих коллег, и происходило это не потому, что он обучался в лаборатории с новейшим оборудованием, а потому, что он долгое время исследовал границы теоремы Гёделя — прекраснейшего, по его мнению, творения человеческого разума.

* * *

ДИАЛОГ ИЗ ФИЛЬМА «ВЗЛОМАТЬ КОД»

(РЕЖИССЕР ХЕРБЕРТ УАЙЗ, АВТОР СЦЕНАРИЯ ХЬЮ УАЙТМОР, 1996)

Дилли Нокс: Я ознакомился с некоторыми подробностями вашей работы, господин Тьюринг, и должен признаться, что многие из них мне непонятны.

Тьюринг: Меня это не слишком удивляет.

Дилли Нокс: Когда я был молод, я был неплохим математиком, но некоторые фразы совершенно сбивают меня с толку. Например, вот эта: «О вычислимых числах в приложении к проблеме разрешения». Можете сказать что-либо по этой теме?

Тьюринг: Что именно?

Дилли Нокс: Не знаю, что-нибудь, несколько слов, объясните в общих чертах.

Тьюринг: Несколько слов?

Дилли Нокс: Да.

Тьюринг: В общих чертах?

Дилли Нокс: Да, если это возможно…

Тьюринг: Хорошо. В общих чертах — речь идет об истинном и ложном. Это техническая статья по математической логике, в которой также рассматривается, как трудно отличить истинное и ложное. Люди, то есть многие люди, думают, что в математике всегда известно, что истинно, а что нет, но это не так! И это никогда не будет так! Это проблема, над которой математики работают уже сорок или пятьдесят лет. Как вам это объяснить? Нужно понять, как отличить истинное отложного, понимаете? […]

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

* * *

Думать как машина

Постройка «Бомбы», или «Колосса», первого программируемого компьютера, также изготовленного в Блетчли-парке, вписывалась в череду открытий, восходящую как минимум ко второму десятилетию XVII века, когда немецкий астроном Вильгельм Шиккард (1592–1635) создал первые «часы для счета» — хитроумный механизм, способный выполнять сложение, вычитание, умножение и деление.

За Шиккардом следовал Блез Паскаль (1623–1662), в девятнадцать лет начавший работу над своей вычислительной машиной, чтобы облегчить труд отца — сборщика налогов в Руане. Его «Паскалина» произвела фурор в аристократических салонах, вызвав удивление ученых и членов знатных семейств. Там же ее увидел и Готфрид Лейбниц (1646–1716). Он был убежден, что «терять время на вычисления, подобно рабам, недостойно выдающихся людей», поэтому неудивительно, что «Паскалина» вызвала у Лейбница большой энтузиазм и желание немедленно ее усовершенствовать. Ученый мечтал создать машину, способную распознавать все истинные высказывания.

«Паскалина», придуманная французским ученым Блезом Паскалем, стала первой вычислительной машиной в истории.

В начале XIX века вычислительные машины Паскаля и Лейбница вдохновили английского математика Чарльза Бэббиджа (1791–1871) и его ученицу Аду Байрон (1815–1852) на исследования по теории вычислений. Для создания аналитической машины (Analytical Engine) Бэббидж и Байрон выделили обязательные элементы всех процессов в информатике. Во-первых, должна существовать программа, указывающая операции, которые нужно выполнить. Она представляет собой ряд инструкций, которые на основе множества входных данных позволяют вычислить результат, возвращаемый пользователю на выходе программы. Например, на вход программы «умножить» подаются пары чисел вида (2, 3), выводом является их произведение — в этом случае 2·3 = 6. Чтобы программа (далее мы будем называть ее алгоритмом) могла быть исполнена, необходимы процессор, выполняющий инструкции, и память, в которой хранятся входные данные, инструкции и все промежуточные расчеты. В аналитической машине Бэббиджа входные данные вводились с помощью перфорированных карт, которые использовались в ткацком станке Жаккара, предназначенном для автоматического создания узоров.

Ада Байрон была дочерью великого английского поэта лорда Байрона и Анабеллы Милбэнк, которую муж называл «королевой параллелограммов», так как она обучалась алгебре и геометрии у главы кафедры Кембриджа. Лорд Байрон оставил семью после рождения Ады, и Анабелла начала обучать дочь наукам с очень раннего возраста. В семнадцать лет девушка познакомилась с Чарльзом Бэббиджем, произошло это на ужине, организованном ее подругой и наставницей Мэри Сомервилл, которая всегда поощряла занятия Ады математикой. Вскоре Ада объяснила Бэббиджу, как можно вычислить числа Бернулли с помощью перфокарт. Эта задача по своей сложности намного превосходила те, которые к тому времени удалось решить изобретателю аналитической машины. С помощью своего метода, позволявшего «ткать алгебраические задачи», Байрон не только написала первую в истории программу, но и показала, что для решения задачи алгоритмически необязательно начинать с нуля. При решении почти всех задач повторялся определенный набор базовых операций, поэтому часто было достаточно скомбинировать уже имеющиеся перфокарты в правильном порядке. Такие базовые операции современные программисты называют подпрограммами.

Используя тот же подход, что и Ада Байрон, Алан Тьюринг смог заложить основы теории алгоритмов в статье «О вычислимых числах в приложении к проблеме разрешения», опубликованной в 1937 году в журнале Proceedings of the London Mathematical Society. В то время как Бэббидж на смертном одре был убежден, что, проживи он еще несколько лет, и его аналитическая машина стала бы известной всему миру, Байрон и Тьюринг поняли, что прежде чем можно будет сконструировать первый компьютер, необходимо значительно продвинуться в теории алгоритмов. Наибольших размышлений требовал вопрос, какие задачи можно решить с помощью машины Бэббиджа, а какие — нет. Нечто подобное происходит сегодня с квантовыми вычислениями, теория которых заметно отстает от практических результатов, полученных в попытках сконструировать первый квантовый компьютер.

Гениальная идея Тьюринга, позволившая определить границы возможностей компьютеров будущего, заключалась в том, чтобы со всей серьезностью обдумать, что означает «мыслить как машина». Очевидно, что компьютер не обладает ни разумом, ни воображением человека, которые позволяют нам действовать в совершенно незнакомых ситуациях. С другой стороны, машины не устают и не скучают, выполняя трудоемкие вычисления, у них никогда не бывает «плохих дней». Они — машины! Чтобы отличить задачи, которые компьютер не способен решить ввиду технических ограничений (например, потому что время выполнения написанной программы будет сопоставимо с возрастом вселенной), от тех, которые неразрешимы из-за особенностей формулировки самой задачи, Тьюринг описал идеальный компьютер с бесконечным объемом памяти и бесконечным временем выполнения программ. Задача, которую не могла решить эта машина Тьюринга, не поддалась бы самому мощному компьютеру будущего, таким образом, метод, разработанный английским математиком, позволял определить границы возможностей компьютеров.

Вверху — памятная марка, выпущенная в честь столетия со дня рождения Чарльза Бэббиджа. Внизу — табличка у садов Барселоны, посвященных Аде Байрон

(фото: Анна Наварро Дюран).

* * *

ЧИСЛА БЕРНУЛЛИ

В одной из известнейших историй о Карле Фридрихе Гауссе рассказывается, что как-то раз его учитель в начальной школе захотел немного передохнуть и дал ученикам задание сложить все числа от 1 до 100. Учитель не рассчитывал, что юный Гаусс мгновенно найдет ответ, применив метод, который он затем использовал для вычисления суммы чисел от 1 до 1000. Пусть нужно найти сумму всех натуральных чисел, предшествующих числу n. Идея Гаусса заключалась в том, чтобы записать сумму 1 + 2 + … + n в обратном порядке и воспользоваться симметрией ее членов так, как показано ниже:

Читатель легко может убедиться, что если сгруппировать каждое слагаемое с тем, что записано под ним, их сумма всегда будет равна n + 1. Так как этот процесс повторяется раз, результатом сложения будет n(n + 1). Однако в этой сумме каждое число учитывается дважды: один раз — в первом ряду, один раз — во втором. Следовательно, полученную сумму нужно разделить на два:

Читатель спросит, сможем ли мы, заменив первые n чисел на первые n квадратов, получить похожую формулу. Применив несколько более сложный метод, можно доказать, что

и что сумма первых кубов рассчитывается по формуле

В общем случае, k-е число Бернулли связано с коэффициентами, которые появляются в формуле суммы n первых степеней многочлена k-го порядка от переменной n. Этим числам легко дать словесное определение, но сложно вычислить по формуле, поэтому алгоритм, разработанный Адой Байрон, стал огромным шагом вперед.

* * *

Вычислимые функции

Первым успехом Тьюринга стало определение вычислимой функции. Далее всякий раз, когда мы будем говорить о функции, мы будем иметь в виду функцию, определенную на множестве натуральных чисел и принимающую натуральные значения. Напомним, что функция — это не более чем способ сопоставить каждому числу другое число, которое мы будем называть отображением первого. Чтобы лучше понять изложенное ниже, читатель может представить функцию как машину, которая придает форму закладываемому в нее материалу. Так, наша функция превращает число 3 в другое число, которое мы будем обозначать f(3), где f — первая буква латинского слова «функция». Процесс получения f(n) по известному n может описываться последовательностью алгебраических операций или более сложной словесной формулировкой. Например, если эта функция сопоставляет каждому числу следующее за ним (как вы уже знаете из предыдущих глав, эта функция используется в аксиомах Пеано), то мы можем записать f(n) = n + 1, и результатом будет f(3) = 3 + 1 = 4. Если же, напротив, функция определяет n-е простое число, то f(3) будет равно 3, а f(4) будет равно 7, так как первыми простыми числами являются 2, 3, 3, 7, 11. В этом случае функция задается словесным описанием, а не простой формулой, определяющей значение функции в каждой точке.

Образ машины может быть обманчивым, и читатель, возможно, поверит, что идеальная машина Тьюринга, о которой мы говорим, в состоянии вычислить значение любой функции, которую только можно себе представить. В действительности дело обстоит с точностью до наоборот: действия, скрытые между входным значением и выходным значением f(n), могут быть настолько сложными, что даже машина Тьюринга будет неспособна их выполнить. Чтобы читатель лучше понимал эту ситуацию, необходимо подробно объяснить, как работают машины, которые придумал Алан Тьюринг, когда ему было немногим больше двадцати лет.

Первым элементом машины Тьюринга является лента, не имеющая начала и конца (напомним, что речь идет об идеальной машине), разделенная на ячейки. В каждую ячейку помещается только один символ — 0 или 1. Эти символы соответствуют, как известно, двум возможным значениям истинности. Вторым элементом машины Тьюринга является устройство чтения-записи, способное определять, какой символ записан в определенной ячейке, и производить запись поверх него.

После прочтения любого символа устройство чтения-записи может повести себя пятью различными способами: стереть ранее записанное число и записать 0, заменить записанный символ на 1, сместиться вправо, сместиться влево (чтобы эти две операции могли быть выполнены, крайне важно, чтобы бумажная лента не имела ни начала, ни конца) или просто остановиться, никак не реагируя на прочитанный символ. Последовательность действий контролируется конечной последовательностью инструкций, которые указывают, как машина должна реагировать в каждом возможном случае. Например, первая инструкция может звучать так: «Если считан символ 1, сместиться влево и перейти к третьей инструкции». Все инструкции следуют одной и той же схеме.

Принцип действия машины Тьюринга

 (источник: «Complexity» Мелани Митчелл).

Как мы уже упоминали, инструкции нумеруются начиная с 1, используются символы 0 и 1, а допустимыми операциями являются запись 0 (0), запись 1(1), переход на ячейку вправо (R), переход на ячейку влево (L) или останов (N). Таким образом, любую инструкцию можно описать всего четырьмя параметрами. Если первая инструкция звучит так: «Если считан символ 1, сместиться влево и перейти к третьей инструкции», достаточно записать (#1, 1, L, #3). Читатель уже наверняка понял, что для каждой ячейки требуются две инструкции: одна указывает, что нужно делать, если считан символ 0, другая указывает, что нужно делать, если считан символ 1. Если в предыдущем примере третья инструкция указывает только действие, выполняемое в случае, если считан 0, но в действительности считан символ 1, то машина не сможет продолжить работу. Возможное решение этой проблемы может выглядеть так: в случае когда машина Тьюринга не имеет четких инструкций (а сама по себе она не способна «придумать», что делать дальше), она останавливается.

Чтобы сделать объяснение более понятным, укажем явно инструкции для всех возможных случаев. Рассмотрим очень простой пример с машиной Тьюринга Т, для которой заданы следующие три команды.

Инструкция № 1: Если считан 0, записать 1 и перейти к инструкции № 3.

Инструкция № 1: Если считан 1, сместиться вправо и перейти к инструкции № 2.

Инструкция № 2: Если считан 0, записать 1 и перейти к инструкции № 3.

Инструкция № 2: Если считан 1, остановить выполнение.

Инструкция № 3: Если считан 0, записать 1 и перейти к инструкции № 1.

Инструкция № 3: Если считан 1, остановить выполнение.

При кодировании машины Тьюринга согласно описанной системе возникает вопрос: что делать, когда машина останавливается? Ведь в этом случае не указано, какая инструкция должна быть следующей. Простейшим решением будет приписать символ 0: это гарантирует отсутствие ошибок, так как машина Тьюринга попытается найти инструкцию 0, но ни одна из инструкций не обозначена этим числом. Применив этот прием, запишем следующую последовательность инструкций, полностью описывающих работу Т:

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

Программа начинает выполнение первой инструкции. Так как считан 0, а инструкция гласит «Если считан 0, записать 1 и перейти к инструкции № 3», достаточно заменить 0 на 1 и посмотреть, как звучит третья инструкция.

Инструкция № 3 состоит из двух частей: первая указывает, что если считан 0, то нужно записать 1 и вернуться к инструкции № 1, однако согласно второй части этой инструкции, если считан символ 1, машина Тьюринга должна остановить работу. Так как в этом случае считан именно символ 1, программа прекращает выполнение. Следовательно, если подать на вход машины Тьюринга ленту, заполненную нулями, Т остановится после того, как запишет 1 в исходной точке.

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

Начнем с первой инструкции: так как считан символ 1, нужно сместиться вправо и перейти к инструкции № 2. Никакой загадки нет.

Теперь, согласно инструкции № 2, если считан 0, машина Тьюринга должна заменить его на 1 и перейти к инструкции № 3. Последуем этой инструкции.

И вновь, согласно инструкции № 3, машина Т должна остановиться, если считан 1, следовательно, программа прекратит выполнение, а результатом ее работы будет лента, на которой записаны две единицы посреди бесконечного множества нулей, при этом устройство чтения-записи будет располагаться рядом с единицей, записанной справа. Если мы вновь запустим эту машину Тьюринга, в результате получим ленту, на которой будет записано три единицы, таким образом Т вычисляет не что иное, как значение функции f(n) = n + 1. В общем случае функция является вычислимой, если существует машина Тьюринга, вычисляющая каждое из ее значений.

Допустим, что натуральное число n закодировано, как мы показали в предыдущем примере, путем ввода бумажной ленты, на которой записано единиц посреди бесконечного множества нулей справа и слева, при этом устройство чтения-записи расположено на ячейке с последней единицей. Функция f будет вычислимой, если существует такая машина Тьюринга, что при вводе произвольного значения n описанным способом ее выходным значением будет f(n). Мы доказали, что функция «прибавить единицу» является вычислимой на машине Тьюринга. Так как для вычисления функции f(n) = n + 2 достаточно выполнить это же множество инструкций два раза, а для вычисления f(n) = n + 3 — трижды, операция сложения является вычислимой. Вычислимой является и операция умножения, поскольку умножить 3 на 3 означает сложить число 3 с самим собой три раза или сложить число 3 с самим собой пять раз. Мы указали, что функция является вычислимой, если существует машина Тьюринга, вычисляющая каждое из ее значений, но это не означает, что мы всегда можем найти такую машину. Рассмотрим, например, функцию, которая принимает в качестве входных и выходных значений только нули и единицы. Следовательно, достаточно определить значение f(0), которое может равняться 0 или 1, и f(1), которое также будет иметь одно из этих значений.

Читателю несложно убедиться, что существует всего четыре функции с подобными свойствами: та, которая всегда возвращает значение 0; та, значение которой всегда равно 1; та, которая при входном значении 0 принимает значение 0, при входном значении 1–1, и та, которая сопоставляет числу 0–1 и наоборот, числу 1–0.

Так как число этих вариантов конечно, все эти функции являются вычислимыми, так как возможно (хотя бы теоретически) описать множество инструкций для вычисления их значения в каждом конкретном случае. Однако описание алгоритма для отображения какого-либо из этих значений может оказаться столь сложным, что мы не сможем в явном виде описать машину Тьюринга, которая вычисляла бы его. Рассмотрим пример, предложенный Артуро Сангалли.

Пусть на множестве чисел от 1 до 9 определена некая функция, которая ставит в соответствие n значение 1, если десятичная запись числа ? содержит n последовательных цифр n (например, число 4444 для n = 4), и 0 в противном случае. Согласно этому определению f(1) равно 1, так как десятичная запись ?, которая начинается с 3,141592 …, содержит 1 (это первый знак после запятой).

Аналогично f(2) также равно 1, однако чтобы найти первую последовательность цифр 22, нужно просмотреть 135 первых знаков ?: …44609550582231725359408.

Следующая таблица была составлена с помощью программы для подобных экспериментов, которая находится на сайте http://www.angio.net/pi/bigpi.cgi.

Из таблицы видно, что наша функция принимает значение 1 для первых восьми натуральных чисел, так как запись числа ? содержит последовательности цифр 333, 4444, 55555, 666666, 7777777 и 88888888. Чтобы вычислить значение f(9), можно написать программу, которая будет обходить все знаки ?, пока не будет найдена искомая последовательность из девяти девяток подряд. Если такая последовательность в записи ? действительно существует, то программа обязательно обнаружит ее, и функция примет значение 1. Время выполнения программы в данном случае не имеет значения, поскольку, как мы неоднократно указывали, речь идет об идеальной машине, не имеющей физических ограничений, свойственных компьютерам. Однако если последовательность из девяти девяток подряд в записи ? отсутствует, программа никогда не остановится, и мы не сможем определить значение f(9). Следовательно, мы никогда не сможем узнать, является ли функция f вычислимой, если только не докажем, что в записи числа ? присутствует последовательность из девяти девяток подряд. Однако в этом случае программа будет бесполезной, так как из нашего доказательства будет следовать, что f(9) равно 1. Эта функция является вычислимой, хотя на первый взгляд может показаться, что это не так.

* * *

А ЧТО, ЕСЛИ ВСЕ ЕСТЬ ЧИСЛО?

В своем рассказе «Вавилонская библиотека» аргентинский писатель Хорхе Луис Борхес предполагает, что вся информация во вселенной может содержаться в единственной книге, которая «содержит бесконечное число бесконечно тонких страниц». Но зачем хранить информацию в этом громадном томе, если, возможно, она поместится в одно число? Одна из самых таинственных гипотез современной математики заключается в том, что в десятичной записи числа ?, равного отношению длины окружности к ее диаметру, рано или поздно встречается любая числовая последовательность. Если это в самом деле так, то в записи этого числа содержится не только последовательность 999999999, но и числовая последовательность, кодирующая любое сообщение прошлого, настоящего и будущего.

* * *

Чтобы доказать это, нужно рассуждать точно так же, как мы рассуждали выше: так как число функций, определенных для чисел от 1 до 9 и принимающих значения 0 и 1, является конечным (в нашем случае таких функций 512 — управиться с ними будет несколько труднее, чем с функциями, определенными только для 0 и 1 и принимающими значения 0 и 1), существует машина Тьюринга, вычисляющая значение каждой из них. Это пример вычислимой функции, машину Тьюринга для которой мы не можем описать в явном виде.

Другим классом вычислимых функций являются рекурсивные функции, то есть такие функции, в которых значение f(n) можно вычислить на основе значений, которые принимает эта функция для других чисел, меньших n. Большинство функций, постоянно используемых в математике, являются рекурсивными, но все ли они вычислимы? Алан Тьюринг моментально дал отрицательный ответ на этот вопрос: существует множество функций, значение которых не сможет вычислить ни одна машина Тьюринга, более того, если выбрать функцию произвольным образом, то она почти наверняка не будет вычислимой. В то же время по другую сторону Атлантики логик Алонзо Чёрч (1903–1995) из Принстонского университета пришел к тем же выводам, разработав формальную систему, которую он назвал лямбда-исчислением. Обе эти идеи были столь новаторскими, что единственным, кого смогли найти редакторы журнала Proceedings of the London Mathematical Society для рецензирования статьи Тьюринга, оказался именно Чёрч. Так началось их плодотворное сотрудничество, прервавшееся на время войны, результатом которого стал принцип, сегодня известный под названием «тезис Чёрча — Тьюринга». Возможны и другие определения вычислимой функции, но если принять этот тезис, то все они будут эквивалентны существованию машины Тьюринга, вычисляющей значения функции.

Алонзо Чёрч, коллега Тьюринга и создатель лямбда-исчисления.

Чтобы доказать, что почти никакие функции не являются вычислимыми, Алан Тьюринг использовал хитроумный вариант диагонального метода Кантора, рассмотренный в главе 2. В ней мы рассказали, что не существует способа упорядочить список последовательностей, состоящих из нулей и единиц. Когда мы предполагали, что можем расположить одну последовательность после другой, изменяя значения элементов по диагонали, нам удалось сформировать последовательность из нулей и единиц, которая не совпадала ни с одной последовательностью в списке. Аналогичным образом можно показать, что множество функций не является счетным.

Мы указали, что функция — это отображение, сопоставляющее 0 и f(0), 1 и f(1), 2 и f(2) и т. д. до бесконечности. Следовательно, вся информация содержится в последовательности чисел f(0), f(1), f(2), f(3)… Для простоты будем рассматривать только функции, которые принимают значения 0 и 1, например функцию f, значение которой равно 0 для четных чисел и 1 — для нечетных. В этом случае вся информация f содержится в последовательности 0101010101…, так как если мы хотим найти отображение n, достаточно перейти к n-му члену этой последовательности. Надеемся, мы убедили читателя, что функции, которые принимают только значения 0 и 1, эквивалентны бесконечным последовательностям нулей и единиц. Следовательно, множество функций не является счетным!

Каждая машина Тьюринга вычисляет значение единственной функции, поэтому утверждать, что все функции являются вычислимыми, можно, лишь доказав, что существует по меньшей мере столько же машин, сколько и функций, значения которых мы хотим вычислить. Однако Тьюринг установил, что бесконечное множество его машин намного меньше. Чтобы показать, что множество функций не является счетным, сначала следовало записать их в виде последовательностей из нулей и единиц. Мы можем записать в виде символов любую машину Тьюринга, поскольку она представляет собой конечную последовательность инструкций, и каждую из них можно записать несколькими символами. Как вы уже увидели, (#1,1, L, #3) означает то же, что и «Инструкция номер 1: если считан символ 1, сместиться влево и перейти к третьей инструкции». Представив машину Тьюринга как последовательность инструкций, читатель сможет найти способ, позволяющий записать все возможные машины Тьюринга в виде списка.

Больший интерес для нас будет иметь процесс «гёделизации», рассмотренный в главе 4. Он заключается в присвоении огромных натуральных чисел каждой формуле логики первого порядка так, что по известному числу можно восстановить исходную формулу. Этот метод, примененный к машинам Тьюринга, позволяет свести всю информацию, содержащуюся в программе, к одному числу. Как и в случае с «гёделизацией», машины Тьюринга соответствуют не всем числам, а только тем, которые обладают определенными свойствами. Хотя существует бесконечное множество машин Тьюринга, его размеры не могут превышать размеры множества натуральных чисел, так как всякая машина Тьюринга кодируется с помощью натуральных чисел.

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

Проблема остановки

Лейбниц, а в начале XX века и Давид Гильберт — мечтали создать машину, способную отличать истинные высказывания от ложных. Как мы отметили в главе 3, программа Гильберта по «очистке» математики от парадоксов заключалась не только в формировании ее устойчивого фундамента — с этим справились древние начиная с Евклида, и пока что основы математики стояли прочно. Для абсолютной уверенности в том, что в будущем никакой Рассел не вытащит из рукава новый парадокс, помимо укрепления логической структуры математики, требовалось рассчитать метаматематические структуры, чтобы доказать, что они способны выдержать вес всего здания науки. Первые два вопроса, которыми задался Гильберт, звучали так: является ли математика полной и непротиворечивой, иными словами, совпадает ли истинное и доказуемое, и нет ли риска столкнуться с противоречиями в математике. За три года до того, как Гёдель доказал, что для арифметики эти требования несовместимы, Давид Гильберт и его ученик Вильгельм Аккерман (1896–1962) добавили к этим вопросам еще один, который был изложен на первом пленарном заседании Международного математического конгресса в 1928 году.

Проблема разрешения (Entscheidungsproblem) заключалась в том, чтобы доказать существование алгоритма, на вход которого подается математическое высказывание, а возвращается — «истина» это или «ложь». Хотя множество аксиом должно быть рекурсивно перечислимым, для множества теорем, как вы увидите далее, это требование невыполнимо. Однако сначала воссоздадим сцену, связанную с новой проблемой Гильберта, свидетелем которой был автор этой книги. Этот случай произошел на Международном математическом конгрессе в Мадриде в августе 2006 года.

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

Это было рискованно: наиболее вероятно, что ответом на вопрос стал бы получасовой монолог, во время которого энтузиазм говорящего рос так же быстро, как угасал интерес слушателя. Однако в этот раз математик решил, что журналист не поймет его объяснений, поэтому ограничился тем, что сказал: «Смотрите: у меня есть машина, в которую я ввожу высказывание, и она отвечает, истинно это высказывание или ложно». Тогда мнимый журналист, который до того момента прекрасно скрывал свое истинное лицо, воскликнул: «Превосходно! Не сможете ли вы как-нибудь одолжить мне эту машину на денек-другой? Я работаю со множеством математических гипотез и совершенно не представляю, истинны они или ложны».

Да, всем нам хотелось бы иметь такую машину, однако Алан Тьюринг в ходе исследований, посвященных вычислимым функциям, доказал, что создать ее невозможно. Для этого он рассмотрел универсальную машину, входными значениями для которой могли выступать не только числа, но и инструкции произвольной машины Тьюринга. Если инструкции описывали то, что мы сегодня называем программой, то универсальная машина сама по себе была подобна компьютеру и была способна имитировать, по крайней мере теоретически, работу произвольной машины Тьюринга. Описав этот абстрактный компьютер, ученый на несколько лет предвосхитил архитектуру современных компьютеров, поэтому редакция журнала Time совершенно справедливо включила его в число людей тысячелетия с комментарием: «Каждый раз, когда мы нажимаем на клавишу компьютера, мы работаем с реинкарнацией машины Тьюринга». Использовав этот компьютер (которых, строго говоря, тогда еще не существовало), Тьюринг показал, что существование подобной «машины истинности» приводит к абсурдному результату.

Посмотрим, как Тьюринг справился с проблемой разрешения. Сначала он предположил, что мечту Гильберта можно воплотить в реальность, то есть существует механический метод, позволяющий за конечное время определить, является данное высказывание истинным или ложным. В частности, этот алгоритм позволяет оценить истинность высказывания «Машина Тьюринга Т останавливается, когда на ее вход подается значение n». Как мы уже указывали, благодаря методу «гёделизации» мы можем сопоставить каждой машине Тьюринга число так, что в нем будет закодирована вся структура машины. Если n — число, описывающее некую машину Тьюринга, мы будем обозначать эту машину как Т(n). В этой нотации проблема, которую мы хотим решить, может быть записана так: остановится ли машина Тьюринга Т(n), если на ее вход подать число m? Следует подчеркнуть, что если идеальная машина, которую представлял себе Гильберт, существует, то она сможет дать ответ на этот вопрос не в каких-то конкретных случаях, а для любых значений m и n.

Следовательно, речь идет о функции двух переменных, которая для данной пары чисел (m, n) определяет, остановится ли машина Тьюринга, описываемая числом n, когда ей на вход будет подана лента, на которой будет записано число m. Вернемся к примеру с числом ? и обозначим за число машины Тьюринга, которая просматривает десятичные знаки ? в поиске требуемой последовательности. При вводе параметров (9, f) наша функция вернет значение 1, если среди знаков ? обнаружится последовательность из девяти девяток подряд (так как в этом случае машина остановится), в противном случае — 0 (в этом случае машина будет продолжать работу бесконечно).

Если мы предположим, что существует машина Тьюринга Р, решающая эту проблему, мы получим противоречие. Чтобы убедиться в этом, повторим еще раз принцип действия Р: это машина Тьюринга, на вход которой подаются пары чисел (m, n) и выходным значением которой может быть одно из двух значений: 1, если машина Тьюринга Т(n) при заданном исходном значении в определенный момент остановится, и 0 — в противном случае. Иными словами, либо не существует машины Тьюринга, обозначаемой числом n (так как не все натуральные числа обозначают какую-либо машину Тьюринга), или же она существует, но программа выполняется бесконечно долго при введенном параметре m. Такая программа, представляющая собой настоящий кошмар для специалистов по информатике, называется бесконечным циклом. Здесь важно, что если бы в нашем распоряжении находилась такая машина Т, мы с легкостью смогли бы создать другую машину Тьюринга (обозначим ее через С), входным значением которой было бы одно число m и которая действовала бы следующим образом:

— если машина Тьюринга Т(n) останавливается, когда ее входное значение равно n (иными словами, если Р(n, n) равно 1), то С не остановится никогда;

— если машина Тьюринга Т(n) бесконечно долго продолжает работу, если ее входное значение равно n (иными словами, если Р(n, n) равно 0), то С остановится, едва начав работу.

В главе 2 вы увидели, как возникает парадокс лжеца, лишивший покоя мудреца Эпименида: это происходит, когда критянин говорит, что все критяне — лжецы, или когда высказывание описывает само себя так: «это высказывание ложно». Далее мы показали, как Гёдель использовал самоотносимость для формулировки истинного, но недоказуемого высказывания, гласящего: «это высказывание недоказуемо». Теперь читатель наверняка догадается, как следует закончить рассуждения: мы определили машину Тьюринга С, которая останавливается или безостановочно продолжает работу в зависимости от того, как работает другая машина, Т(n). Но что произойдет, если на вход С подать саму машину С, то есть соответствующее ей число с?

Если машина Т(с) остановится, то С не остановится. Если, напротив, Т(с) войдет в бесконечный цикл, то С остановится. Но С и Т(с) — это одна и та же машина! Она не может одновременно вести себя по-разному! Предположив, что проблема остановки имеет решение для любых шип, мы пришли к противоречию: демон самоотносимости нашептывает нам «выбери с», но одна и та же машина будет одновременно вести себя по-разному.

Мечта Гильберта и Лейбница оказалась несбыточной. Самоотносимость сначала побудила Бертрана Рассела сформировать новые, более прочные основы математики, затем позволила Геделю доказать, что оптимизм ученых того времени был неоправданным, а теперь Тьюринг вновь использовал ее, чтобы справиться с проблемой разрешения — на этот раз самоотносимость стала свойством теоретических машин, которые позднее дали начало первым компьютерам.

Мы сказали, что логика описывает не рассуждения повседневной жизни, а способ, которым нужно рассуждать, чтобы гарантированно прийти к истинному результату. В самом деле, пока что мы рассматривали только формулы, в которых значения истинности 0 и 1 были лишены какого-либо значения. Мы всегда выбирали между белым и черным. В следующей главе мы попытаемся описать мир оттенками серого — более естественно, но менее четко.