Опубликован: 21.08.2007 | Уровень: специалист | Доступ: свободно | ВУЗ: Тверской государственный университет
Лекция 10:

Вычислимые функции, тезис Тьюринга-Черча и неразрешимые проблемы

< Лекция 9 || Лекция 10: 12345
Аннотация: Частично рекурсивные функции вычислимы на м.Т. М.Т. моделируют структурированные программы. Классы частично рекурсивных функций, функций, вычислимых структурированными программами, и функций, вычислимых машинами Тьюринга, совпадают. Тезис Тьюринга-Черча. Алгоритмически разрешимые и неразрешимые проблемы. Неразрешимость проблем самоприменимости, останова, тотальности, эквивалентности и оптимизации текста программ
Ключевые слова: класс частично рекурсивных функций, класс функций, вычислимых структурированными программами, класс функций, вычислимых машинами Тьюринга, класс, структурированная программа, доказательство, ПО, операторы, примитивная рекурсия, стандартная заключительная конфигурация, функция, параллельная композиция, копирование, аргумент, пустой символ, вычислительная модель, арифметическая функция, конфигурация, последовательная композиция, цикла, программа, кодирование, слово, код символа, значение, компонент, LR, остаток, определение, класс функций, вычислимых структурированными программами, алгоритм, очередь, связь, алфавит, натуральное число, входной, всюду определенные функции, переменная, эквивалентность, вывод, разрешимые множества, отношение, множества, входные данные, место, равенство, алгоритмическая сводимость проблем

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

Напомним, что в теореме 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 раз копирует вход |^{x_1}*\ldots *|^{x_n}, отделяя одну копию от другой символом # ;
  2. на полученном слове вида |^{x_1}*\ldots *|^{x_n}\# \ldots \# |^{x_1}*\ldots *|^{x_n}
  3. запускает параллельную композицию машин \mathcal { M}_{f_1}, \ldots, \mathcal {M}_{f_n} и получает конфигурацию вида |^{ y_1}\# \ldots \# |^{y_n}, где y_{i}=f_{i}(x_{1},\dots ,x_{n}) (i \in  [1,m]).
  4. заменяет все символы 0023 на * ;
  5. затем запускает программу м.Т. \mathcal {M}_F на получившемся после этапа 3) входе вида |^{ y_1}* \ldots * |^{y_n}, и вычисляет требуемое значение G(x_1,\ldots,x_n)=F(y_1, \ldots, y_m).

Если обозначить м.Т., выполняющую копирование на этапе (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}_1, используя \mathcal{ M}_g, строит по входу вида |^{x_1}*\ldots *|^{x_n}*|^y конфигурацию на ленте |^y*|^{x_1}*\ldots*|^{x_n}*\wedge*|^{g(x_1,\ldots,x_n)};
  • \mathcal{ M}_2, используя \mathcal{M}_f, строит по входу вида |^y*|^{x_1}*\ldots*|^{x_n}*|^u*|^z конфигурацию |^y*|^{x_1}*\ldots*|^{x_n}*|^{u+1}*|^{f(x_1,\ldots,x_n,u,z)};
  • \mathcal{M}_3 на входе вида |^y*|^{x_1}*\ldots*|^{x_n}*|^u*|^z выдает в качестве результата |^z;
  • \Phi на входе вида |^y*|^{x_1}*\ldots*|^{x_n}*|^u*|^z проверяет условие y \ne  u.

Построение каждой из указанных м.Т. достаточно очевидно. Из них можно получить, используя определенные в предыдущем разделе конструкции "языка программирования" для машин Тьюринга, требуемую м.Т. \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), заданную с помощью оператора минимизации.

< Лекция 9 || Лекция 10: 12345
Алексей Семенов
Алексей Семенов
Россия, Москва, МГУПИ