Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 11:

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

Универсальная тьюрингова программа и пример невычислимой функции

В этом параграфе речь пойдет об универсальной тьюринговой программе U, которая может имитировать любую программу, работающую над фиксированным алфавитом A = \{a_1, a_2 \dts a_n\}. Эта программа U, получив на входе псевдослово, содержащее в определенном виде код произвольной программы T и псевдослово X, должна оставить на ленте код программы T и псевдослово T(X) — результат работы программы T на псевдослове X.

Читатель, построивший универсальную программу, может считать себя изобретателем компьютера.

Пусть \Psi_n — множество всех функций из N в N таких, что каждая из них определена в точке 0 и вычислима программой, состоящей не более чем из n тьюринговых команд. Рассмотрим функцию s(n)
= \max f(0), где максимум берется по всем функциям из \Psi_n. Очевидно, s(n) всюду определена и монотонна. Более того, справедлива

Теорема. Для любой всюду определенной вычислимой функции {f\colon N {\to}
N} существует k \in N такое, что при любом m \ge k выполняется неравенство f(m) < s(m).

Действительно, пусть f(n) — произвольная всюду определенная функция из N в N, тогда очевидно, что функция

\eq*{
F(n) = \max(f(3n), f(3n + 1), f(3n+ 2)) + 1
}
будет также всюду определенной и вычислимой. Пусть в унарном коде ее вычисляет программа T_F, состоящая из k команд. Рассмотрим программу T = [[1, r]^n, T_F], которая сначала записывает на ленте число n, а затем работает как T_F. Очевидно, что она состоит из 2n + k команд и вычисляет некоторую функцию F\in \Psi_{2n+k}.

По определению F' и s имеем F(n) = F'((0)
\le s(2n + k). Используя монотонность функции s, получим F(n) \le
s(3n) при всех n \ge k, следовательно, f(3n+i) <
s(3n+i), (i = 0, 1, 2). Отсюда следует, что при m \ge 3k выполняется неравенство f(m) < s(m), что и требовалось доказать.

Следствие. Функция s(n) невычислима, так как она растет быстрее, чем любая вычислимая функция.

Заметим, что при любом фиксированном n значение s(n) можно попытаться вычислить путем перебора всех программ длины \le n и определения для каждой из них времени работы до момента остановки или доказательства ее незавершаемости. Но вопрос о завершаемости программ в общем виде алгоритмически неразрешим. Уточним основные моменты этого утверждения.

Пусть T — тьюрингова программа, работающая в алфавите A, и пусть {\rm kod}(T)слово в алфавите A, кодирующее программу T (на деталях кодирования не останавливаемся).

Программа T называется самоприменимой, если при подаче ей на вход ее собственного кода она через конечное число шагов остановится, в противном случае программа называется несамоприменимой. Пусть M — множество кодов самоприменимых программ.

Теорема. Множество M алгоритмически неразрешимо.

Доказательство. Пусть M — алгоритмически разрешимо. Тогда существуют две программы T_1 и T_2 такие, что T_1 останавливается только на словах из M, а T_2 — только на словах из A^\ast \backslash  M.

Тогда, если T_2 на собственном коде остановится, то {\rm kod}(T_2) \in M по определению M, но {\rm kod}(T_2) \not \in M по определению T_2.

Если же T_2 на своем коде не остановится, то по определению M {\rm kod}(T_2)\not\in M, а по определению T_2 {\rm kod}(T_2) \in M. Итак, в любом случае имеем противоречие.

Еще одним примером алгоритмически неразрешимого множества является множество M_1 кодов программ, которые останавливаются при пустом входе. Легко показать, что если бы M_1 было разрешимым, то множество M тоже было бы разрешимым.

Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...
 

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ