Универсальная тьюрингова программа и пример невычислимой функции
В этом параграфе речь пойдет об универсальной тьюринговой программе , которая может имитировать любую программу, работающую над фиксированным алфавитом . Эта программа , получив на входе псевдослово, содержащее в определенном виде код произвольной программы и псевдослово , должна оставить на ленте код программы
и псевдослово — результат работы программы на псевдослове .
Читатель, построивший универсальную программу, может считать себя изобретателем компьютера.
Пусть — множество всех функций из в таких, что каждая из них определена в точке 0 и вычислима программой, состоящей не более чем из тьюринговых команд. Рассмотрим функцию , где максимум берется по всем функциям из . Очевидно, всюду определена и монотонна. Более того, справедлива
Теорема.
Для любой всюду определенной вычислимой функции существует такое, что при любом
выполняется неравенство .
Действительно, пусть — произвольная всюду определенная функция из в , тогда очевидно, что функция
будет также всюду определенной и вычислимой. Пусть в унарном коде ее вычисляет программа , состоящая из команд. Рассмотрим программу , которая сначала записывает на ленте число , а затем работает как . Очевидно, что она состоит из команд и вычисляет некоторую функцию .
По определению и имеем . Используя монотонность функции , получим при всех , следовательно, , . Отсюда следует, что при
выполняется неравенство , что и требовалось доказать.
Следствие.
Функция невычислима, так как она растет быстрее, чем любая вычислимая функция.
Заметим, что при любом фиксированном
значение можно попытаться вычислить путем перебора всех программ длины и определения для каждой из них времени работы до момента остановки или доказательства ее незавершаемости. Но вопрос о завершаемости программ в общем виде алгоритмически неразрешим. Уточним основные моменты этого утверждения.
Пусть — тьюрингова программа, работающая в алфавите , и пусть — слово в алфавите , кодирующее программу (на деталях кодирования не останавливаемся).
Программа называется самоприменимой, если при подаче ей на вход ее собственного кода она через конечное число шагов остановится, в противном случае программа называется несамоприменимой. Пусть — множество кодов самоприменимых программ.
Теорема.
Множество алгоритмически неразрешимо.
Доказательство.
Пусть — алгоритмически разрешимо. Тогда существуют две программы и такие, что останавливается только на словах из , а — только на словах из .
Тогда, если на собственном коде остановится, то
по определению , но по определению .
Если же на своем коде не остановится, то по определению , а по определению
. Итак, в любом случае имеем противоречие.
Еще одним примером алгоритмически неразрешимого множества является множество кодов программ, которые останавливаются при пустом входе. Легко показать, что если бы было разрешимым, то множество
тоже было бы разрешимым.