Проблема остановки машины Тьюринга: почему она неразрешима

Проблема остановки машины Тьюринга - самый известный пример задачи, которую невозможно решить никаким алгоритмом в принципе. Вопрос звучит обманчиво просто: можно ли заранее, не запуская программу, определить, завершит ли она работу на данном входе или зациклится навсегда? Алан Тьюринг в 1936 году доказал, что универсального алгоритма для такого предсказания не существует, и сделал это раньше, чем появились первые компьютеры. Разберём, что именно утверждает теорема, как устроено её доказательство через самоприменение и диагональ и почему неразрешимость проблемы остановки лежит в основе всей теории вычислимости.
Ниже - сборщик разбора: выберите, что нужно понять про проблему остановки, и получите развёрнутый пошаговый ответ.
Как формулируется проблема остановки
Формально задача ставится так. Дана машина Тьюринга и входное слово . Требуется построить алгоритм , который для любой пары на вход выдаёт «да», если на когда-нибудь остановится, и «нет», если на работает бесконечно. Важно, что должен сам всегда останавливаться и давать ответ за конечное время - иначе он не алгоритм, а просто запуск самой машины.
Здесь и кроется ловушка. Запустить на и подождать недостаточно: если машина остановится, мы это увидим, но если она зациклилась, ждать придётся вечно, и мы никогда не узнаем, что ответ - «нет». Нужен анализатор, который выносит вердикт без бесконечного ожидания. Теорема Тьюринга говорит, что такого анализатора нет.
Проблема остановки - это не «трудная» задача, для которой пока не нашли алгоритм. Доказано, что алгоритма не существует и не может появиться: это свойство самой модели вычислений.
Доказательство от противного
Допустим, искомый алгоритм существует. Значит, есть машина Тьюринга, которая по описанию и входу за конечное время выдаёт:
Из построим новую машину - «диагональную». Она принимает на вход описание одной машины и внутри вызывает , то есть спрашивает: остановится ли , если подать ей на вход её собственное описание. Дальше делает прямо противоположное полученному ответу:
Машина совершенно законна: раз - алгоритм, то тоже можно собрать. И теперь зададим роковой вопрос.

Самоприменение: запускаем D на самой себе
Подадим машине на вход её собственное описание . Рассмотрим оба возможных исхода.
Если на входе останавливается, то по определению это произошло только когда , то есть когда анализатор утверждает, что зацикливается. Противоречие: остановилась, хотя сказал, что она зациклится.
Если на входе зацикливается, то по определению это случилось только когда , то есть когда анализатор утверждает, что остановится. Снова противоречие: работает вечно, хотя предсказал остановку.
Оба варианта невозможны одновременно с корректной работой . Единственное допущение, которое мы сделали, - существование . Значит, оно ложно: алгоритм, решающий проблему остановки, существовать не может. Этот приём - заставить объект отрицать собственное предсказание о себе - называется диагональным аргументом и восходит к канторовской технике из доказательства теоремы Кантора - Бернштейна и несчётности континуума.
Частая ошибка - считать, что мы «не нашли» $H$ из-за ограничений. Нет: само предположение о существовании $H$ ведёт к логическому противоречию, поэтому $H$ невозможен математически.
Почему нельзя просто запустить и подождать
Интуиция подсказывает: запусти программу и смотри. Этот метод называется полуразрешимостью. Множество пар , на которых машина останавливается, рекурсивно перечислимо: если остановка произойдёт, симуляция её обнаружит за конечное число шагов. Но дополнение - множество зацикливающихся пар - уже не перечислимо: для бесконечного цикла нет момента, в который симуляция выдаст «нет».
Именно асимметрия между «да» и «нет» делает задачу неразрешимой. Разрешимость требует, чтобы алгоритм останавливался на обоих ответах. Проблема остановки полуразрешима, но не разрешима - это эталонный пример различия двух понятий.
Чтобы почувствовать разницу, удобно представить «универсальный таймаут». Можно предложить: запусти на ровно на миллион шагов; если не остановилась - считаем, что зациклилась. Такой алгоритм всегда даёт ответ, но он неверен: существуют машины, которые честно останавливаются на шаге миллион плюс один. Любую конечную границу шагов легко обмануть машиной, которая работает чуть дольше. Поэтому «подождать подольше» не превращает полуразрешимую задачу в разрешимую - нужна именно гарантия конечного и при этом корректного ответа на каждой паре.

Связь с тезисом Чёрча - Тьюринга
Теорема доказана для машин Тьюринга, но её сила гораздо шире. Согласно тезису Чёрча - Тьюринга, любая интуитивно вычислимая функция вычислима машиной Тьюринга. Поэтому неразрешимость проблемы остановки означает: её не решит никакая модель вычислений - ни лямбда-исчисление, ни рекурсивные функции, ни реальный компьютер с любым объёмом памяти.
Это фундаментальная граница. Существование универсальной машины Тьюринга, способной эмулировать любую другую, как раз и позволяет машине запускать анализатор над произвольным кодом - без универсальности конструкция самоприменения не собралась бы.
Практический вывод из тезиса важен для программиста: барьер не зависит от языка и железа. Переписать гипотетический анализатор на более мощном языке, дать ему квантовый компьютер или бесконечную память бесполезно - все эти модели сводятся к машине Тьюринга и наследуют ровно ту же границу. Неразрешимость проблемы остановки - это утверждение не о технологии, а о пределах самого понятия «механически вычислить».
Следствия: что ещё неразрешимо
От проблемы остановки неразрешимость распространяется на множество задач через приём сведения: если задачу можно свести к задаче , и неразрешима, то и неразрешима. Так доказали неразрешимость целого ряда вопросов:
- Теорема Райса: любое нетривиальное свойство функции, вычисляемой программой (например «программа печатает 0», «программа вычисляет константу»), неразрешимо.
- Проблема соответствий Поста - комбинаторная задача о подборе последовательности доминошек.
- Десятая проблема Гильберта - существование целочисленных корней у произвольного диофантова уравнения.
- Проблема эквивалентности программ - определить, вычисляют ли две программы одну и ту же функцию.
Все они «заражены» неразрешимостью именно от проблемы остановки. Логика сведения всегда одинакова: если бы существовал решатель для , мы бы по правилам сведения построили из него решатель для проблемы остановки - а его нет. Поэтому решателя для тоже не существует. Проблема остановки служит «корневым» неразрешимым примером, от которого неразрешимость растекается по теории вычислимости, подобно тому как от одной невозможной точки опоры рушится вся опирающаяся на неё конструкция.
Частые ошибки
- «Проблему остановки решили современные анализаторы кода». Статические анализаторы и верификаторы работают на частных классах программ или дают приближённые ответы с «не знаю». Универсального решателя для всех программ нет и быть не может.
- Путать неразрешимость и сложность. Проблема остановки не «очень долгая» - она в принципе невычислима, это качественно иной барьер, чем NP-трудность.
- Считать, что для конкретной программы ответ непредсказуем. Для многих конкретных машин остановка очевидна. Неразрешимость - про отсутствие единого алгоритма для всех случаев, а не про каждый отдельный случай.
- Думать, что доказательство опирается на нехватку памяти или времени. Машина Тьюринга имеет бесконечную ленту; барьер чисто логический, а не ресурсный.
- Смешивать полуразрешимость с разрешимостью. Остановку можно подтвердить запуском, а вот зацикливание - нет; именно поэтому задача только полуразрешима.
FAQ
Кто и когда доказал неразрешимость проблемы остановки? Алан Тьюринг в статье 1936 года «On Computable Numbers». Независимо близкий результат о неразрешимости получил Алонзо Чёрч через лямбда-исчисление; отсюда совместное название тезиса Чёрча - Тьюринга.
Можно ли решить проблему остановки для ограниченных программ? Да, для узких классов. Например, для программ без циклов или с заранее известной верхней границей шагов остановка тривиально проверяется. Неразрешимость касается множества всех машин Тьюринга сразу.
Чем диагональный аргумент Тьюринга похож на аргумент Кантора? Оба строят объект, который по построению отличается от каждого элемента предполагаемого «полного» списка. У Кантора это число, отличающееся в каждой диагональной цифре; у Тьюринга - машина , противоречащая предсказанию анализатора о ней самой.
Коротко
Проблема остановки машины Тьюринга - задача определить, завершится ли произвольная программа на данном входе. Тьюринг доказал её неразрешимость от противного: из гипотетического анализатора строится диагональная машина , которая, будучи запущенной на собственном описании, обязана сделать противоположное тому, что предскажет , - и приходит к противоречию. Задача остаётся полуразрешимой (остановку можно подтвердить запуском), но не разрешимой, а через сведения её неразрешимость наследуют теорема Райса, проблема Поста и десятая проблема Гильберта.
Читайте также

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

Примитивно рекурсивные функции: база и операторы
Примитивно рекурсивные функции простыми словами: базисные функции, операторы суперпозиции и примитивной рекурсии, примеры сложения и умножения, отличие от функции Аккермана.

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