В этом лекции мы установим, что классы частично рекурсивных функций, функций, вычислимых структурированными программами, и функций, вычислимых машинами Тьюринга, совпадают. Это (вместе с эквивалентностью этого класса многим другим определениям вычислимости, не рассматриваемым в этих лекциях) позволяет считать этот класс функций точно отражающим наши интуитивные представления о вычислимости.
Напомним, что в теореме 8.1 мы уже показали, что каждая ч.р.ф. вычислима некоторой структурированной программой.
Теорема 10.1. Для всякой ч.р.ф. f существует м.Т. \[ \mathcal{ M}_f \] , вычисляющая функцию f.
Доказательство. Доказательство проведем индукцией по определению частично рекурсивной функции f.
Базис. Вычислимость простейших функций машинами Тьюринга очевидна.
Индукционный шаг. Покажем, что операторы суперпозиции, примитивной рекурсии и минимизации сохраняют вычислимость по Тьюрингу. Все используемые м.Т. будем предполагать односторонними со стандартными заключительными конфигурациями.
Суперпозиция. Пусть Fm и fn1,..., fnm - ч.р.ф., вычислимые на м.Т. \[ \mathcal {M}_F, \mathcal { M}_{f_1}, \ldots, \mathcal {M}_{f_n} \] , соответственно. Пусть функция Gn получена из них с помощью суперпозиции: Gn=[Fm;fn1,..., fnm]. Тогда м.Т. \[ \mathcal { M}_G \] , вычисляющая G, работает следующим образом:
Если обозначить м.Т., выполняющую копирование на этапе (1), через Копm, а м.Т., выполняющую замену # на * на этапе (3), через Зам*#, то требуемую для суперпозиции м.Т. \[ \mathcal { M}_G \] можно представить как
\[ \textit{Коп}^m; \mathbf{par}_{\#}( \mathcal { M}_{f_1}, \ldots , \mathcal {M}_{f_n}); \textit{Зам}_*^\#; \mathcal {M}_F \]Примитивная рекурсия. Пусть функция Fn+1(x1,... ,xn,y) получена с помощью оператора примитивной рекурсии из функций gn(x1,..., xn) и fn+2(x1,... ,xn, y, z), которые вычислимы на м.Т. \[ \mathcal{ M}_g \] и \[ \mathcal {M}_f \] . Определим вспомогательные м.Т.:
Построение каждой из указанных м.Т. достаточно очевидно. Из них можно получить, используя определенные в предыдущем разделе конструкции "языка программирования" для машин Тьюринга, требуемую м.Т. \[ \mathcal {M}_F \] :
\[ \mathcal {M}_1\/;\ \mathbf{ while\ }\Phi\ \mathbf{ do\ } \mathcal{ M}_2\ \mathbf{enddo};\ \mathcal {M}_3 \]Минимизация. Пусть \[ f^{n}(x_{1},\dots , x_{n}) = \mu y [ g^{n+1}(x_{1},\dots , x_{n},y)=0] \] и м.Т. \[ \mathcal{M}_g \] вычисляет функцию gn+1. Определим следующие вспомогательные м.Т.:
\[ \mathcal {N}_1 \] приписывает аргумент 0 ко входу, т.е. вход вида \[ |^{ x_1}*\ldots *|^{x_n} \] переводит в конфигурацию на ленте \[ |^{x_1}*\ldots*|^{x_n}*\wedge \] (напомним, что при унарном кодировании 0 соответствует пустой символ).
\[ \mathcal{N}_2 \] копирует свой вход с разделителем #, т.е. по любому входу w выдает w # w.
Через E обозначим м.Т., которая ничего не делает.
Пусть \[ \mathcal{N}_3 = \mathbf{par}_{\#}(E, M_g) \] , т.е. вход вида \[ |^{x_1}*\ldots*|^{x_n}* |^y\# |^{x_1}*\ldots*|^{x_n}* |^y \] машина \[ \mathcal{N}_3 \] перерабатывает, используя \[ \mathcal{M}_g \] , в \[ |^{x_1}*\ldots*|^{x_n}* |^y\# |^z \] , где z= g(x1,... ,xn, y)
\[ \Phi \] на входе вида w # v проверяет непустоту v (т.е. условие v > 0 ).
\[ \Phi( w\#v)=\left \{ \aligned 0,\qquad \textit{если }v \neq \wedge\\ 1\qquad \textit{если }v= \wedge \endaligned \right . \]Таким образом, при v=g(x1,...,xn,y) машина \[ \Phi \] проверяет условие \[ g(x_{1},\dots ,x_{n},y) \ne 0 \] .
\[ \mathcal{N}_4 \] по входу вида \[ |^{x_1}*\ldots*|^{x_n}* |^y\# w \] стирает #w и прибавляет к y единицу, т.е. выдает результат: \[ |^{x_1}*\ldots*|^{x_n}* |^{y+1} \] .
Наконец, \[ \mathcal{N}_5 \] по входу \[ |^{x_1}*\ldots*|^{x_n}* |^y\# w \] выдает |y, стирая ненужные блоки символов.
Ясно, что каждая из перечисленных м.Т. \[ \mathcal{N}_1 \] , \[ \mathcal{N}_2 \] , \[ \mathcal{N}_3 \] , \[ \mathcal{N}_4 \] , \[ \mathcal{N}_5 \] и \[ \Phi \] легко реализуема. Построим теперь с их помощью следующую м.Т. \[ \mathcal{M}_f \] :
\[ \mathcal{M}_f: \\ \mathcal{N}_1; \mathcal{N}_2; \mathcal{N}_3; \\ {\bf while\ } \Phi\ {\bf do\ } \mathcal{N}_4;\ \mathcal{N}_2;\ \mathcal{N}_3\ {\bf enddo};\\ \mathcal{N}_5. \]Из этого определения непосредственно следует, что \[ \mathcal{M}_f \] вычисляет функцию fn(x1,..., xn), заданную с помощью оператора минимизации.