Тверской государственный университет
Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1684 / 243 | Оценка: 5.00 / 5.00 | Длительность: 14:18:00
ISBN: 978-5-94774-714-0
Специальности: Программист, Математик
Лекция 9:

Алгоритмы: машины Тьюринга

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Ветвление (условный оператор)

Машину Тьюринга \Phi будем называть распознающей, если для некоторого алфавита \Sigma и каждого входа x \in  \Sigma ^{*}, на котором \Phi останавливается, ее результат \{ \Phi \} (x) \in  \{ 0, 1\}, т.е. \Phi вычисляет некоторую двузначную функцию (возможно частичную) на словах из \Sigma.

Лемма 9.5. Пусть \Phi - распознающая м.Т., м.Т. {\cal M}_1 вычисляет функцию f(x), а м.Т. {\cal M}_2 - функцию g(x). Тогда существует м.Т. \cal M,\ вычисляющая функцию

h(x) =\left\{ \begin{array}{lcl}
     f(x) & \mbox { при } & \Phi(x)=0 \\
     g(x) & \mbox { при } & \Phi(x)=1
\end{array} \right.

Доказательство. Требуемая м.Т. \cal M\ вначале копирует вход x и получает на ленте слово x*x, затем вычисляет параллельную композицию функций \Phi (x) и тождественной функции e(x)=x и переходит в конфигурацию p\{ \Phi \} (x)*x. Выбор между f и g происходит по следующим командам:

\ p 0 \rightarrow p_0 \wedge \textit{ П };
\ \ p1 \rightarrow p_1 \wedge \textit{ П};
\ \ p_0* \rightarrow q_0^1 \wedge \textit{ П};
\ \ p_1* \rightarrow q_0^2 \wedge \textit{ П}

Кроме того, обеспечим переход в новое заключительное состояние:

\ q_f^1 a \rightarrow q_f a \textit{ Н };
\ \ \ q_f^2 a \rightarrow q_f a \textit{ Н}\ \ (a \in \Sigma ).

Таким образом, мы реализовали в терминах машин Тьюринга обычный в языках программирования оператор ветвления:

\mbox {\bf if }\ \Phi(x)=0\ \mbox {\bf then }\ f(x)
\ \mbox {\bf else }\ g(x)\ \mbox {\bf endif }.

Повторение (цикл)

Используя конструкцию для ветвления легко реализовать в терминах машин Тьюринга и оператор цикла.

Лемма 9.6. Пусть \Phi - распознающая м.Т., а м.Т. {\cal M}_1 вычисляет функцию f(x). Тогда существует м.Т. \cal N,\ которая вычисляет функцию, задаваемую выражением:

g(x) =\  '\mbox {\bf while}\ \Phi(x)= 0\ \mbox {\bf do }\ \ x := f(x)\ \mbox {\bf enddo}'

Доказательство. Действительно, пусть м.Т. {\cal M}_2 - вычисляет тождественную функцию g(x)=x. Построим по м.Т. \Phi, {\cal M}_1 \mbox { и }\ {\cal M}_2\ м.Т. \cal M,\ реализующую ветвление как в лемме 9.5. Тогда искомая м.Т. \cal N\ получается из \cal M\ заменой команд q_{f}^{1} a \to  q_{f} a H  (a \in  \Sigma ) на соответствующие команды q_{f}^{1} a \to  q_{0} a H  (a \in  \Sigma ), обеспечивающие зацикливание.

Реализованные выше операции над машинами Тьюринга и вычислимыми функциями позволяют получать программы новых м.Т., используя обычные конструкции языка программирования "высокого" уровня: последовательную и параллельную композицию, ветвление и цикл. Пусть M, M_{1}, M_{2},\dots  , M_{m}, \Phi - машины Тьюринга. Последовательную композицию M1 и M2 будем обозначать M1;M2, параллельную композицию M1, M2,... , Mm обозначаем как \mathbf {par}_b(M_1,M_2,\ldots , M_m)\ (здесь b - это символ, разделяющий аргументы и результаты этих машин), ветвление -

{\bf if}\ \Phi\ {\bf then}\ M_1\ {\bf else}\ M_2\ {\bf endif}

цикл -

{\bf while}\ \Phi\  {\bf do }\ M\ {\bf enddo}.

Пример 9.4. Рассмотрим в качестве примера задачу перевода чисел из унарной системы счисления в двоичную. Пусть fub(|n) = n(2) для всех n \in  N, где n(2) - двоичная запись числа n.

Пусть M1 - м.Т., которая начальную конфигурацию q0 ,|n переводит в конфигурацию q1 ,0*|n; M2 - м.Т., которая прибавляет 1 к двоичному числу-аргументу (см. пример ref{ex8-suc}); M3 - м.Т., которая вычитает 1 из унарного числа; \Phi - м.Т., которая на аргументе вида x*|y выдает 0, если число y > 0, и выдает 1 при y=0 (т.е. на аргументе x*\wedge); M4 - м.Т., которая стирает * в аргументе вида x* и останавливается. Реализация каждой из указанных м.Т. очевидна. Теперь требуемая м.Т. Mub, вычисляющая fub, получается как

M_1; {\bf while}\ \Phi\  \mathbf{ do\ \  par}_*(M_2,M_3)\ {\bf enddo}; M_4.

Действительно, после работы M1 получаем конфигурацию q10*|n. Предположим теперь по индукции, что после i (i <n) итераций цикла while получается конфигурация q1 i(2)*|n-i. Тогда на (i+1) -ой итерации цикла после параллельного применения M2 к i(2) и M3 к |n-i получаем конфигурацию q1(i+1)(2)*|n-i-1. Поэтому после n итераций получится конфигурация q_{1} n_{(2)}*\wedge. На ней \Phi выдаст 1, и цикл завершится с записью n_{(2)}*\wedge на ленте, из которой M4 сотрет * и оставит требуемый результат n(2).

Отметим, что из приведенного примера и из задачи \oldref{prb3-6}(a) следует, что класс вычислимых на м.Т. арифметических функций не зависит от выбора унарного или двоичного кодирования аргументов и результатов. Это же справедливо и для троичной, десятичной и других позиционных систем счисления ( почему ?).

Задачи

Задача 9.1. Постройте м.Т. для функции копирования, не увеличивая исходный алфавит \Sigma.

Задача 9.2. Постройте программу м.Т., которая выполняла бы перенос непустого слова в заданное место ленты, т.е. для любого слова w \in  (\Sigma  \setminus  \{ \wedge \} )^{*} и n > 0 выполняла преобразование конфигураций: q_1w \wedge^n \#\ \vdash^*\ \wedge^n q_2\#w\.

Задача 9.3. Достройте программу м.Т. {\cal M}^\prime\ из леммы 9.1 на этапах 3 и 4.

Задача 9.4. Докажите, что односторонняя м.Т. {\cal M}^\prime,\ построенная в лемме 9.2, корректно моделирует исходную м.Т. {\cal M}.

Задача 9.5. Другой, по сравнению с конструкцией леммы 9.2, подход к моделированию двухсторонней ленты на односторонней заключается в том, чтобы содержимое правой полуленты \cal M\ хранить в четных ячейках \cal M^\prime,\ а содержимое левой полуленты - в нечетных, поместив в 1-ю ячейку специальный маркер. Постройте программу, реализующую этот подход (ее достоинство - увеличение алфавита ленты всего на 1 символ).

Задача 9.6. Достройте программу м.Т. \cal M из леммы 9.4 на этапах 1, 3 и 5.

Задача 9.7. Построить программы машин Тьюринга, вычисляющих следующие функции.

  • Перевод из двоичной системы в унарную: fbu(n(2))= |n.
  • Сложение и вычитание в двоичной системе: sum(n*m)=n+m и sub(n*m)= n \dot - m,\ ( \dot - совпадает с - при n >= m и n \dot - m =0 при m > n ).
  • Умножение в двоичной системе: mul(n*m)= n x m. ( Реализуйте алгоритм умножения "в столбик".)
  • Возведение в степень: exp(n*m)= nm.
  • Извлечение квадратного корня: sqr(n) =\lfloor\sqrt{n}\rfloor.
  • Логарифмирование: log(n)=\lfloor  log_{2n} \rfloor.
  • Деление: div(n*m) =\lfloor \frac{n}{ m} \rfloor\ (m \neq 0).
  • Остаток от деления: rest(n*m) = n mod m.
  • Функция выбора аргумента: I_m^n(|^{x_1}*|^{x_2}*\ldots *|^{x_n})= |^{x_m}\ \ (1\leq m \leq n).

Задача 9.8. Используя машины Тьюринга из предыдущей задачи, построить программы машин Тьюринга, вычисляющих следующие функции.

  1. \begin{array}{lll}
f_1(x, y)& =& \left \{\begin{array}{ll}
             x^2y^3, & \mbox{ если }\ x < y  \\
             \lfloor (x+y)/2 \rfloor , & \mbox{ в противном случае}
      \end{array}   \right. \\
\end{array}
  2. \begin{array}{lll}
f_2(x, y)& = &\left \{\begin{array}{ll}
              \lfloor  \sqrt{x}\ \rfloor  , & \mbox{ если }   x+1 \geq  y \\
             2(x +y), & \mbox{ в противном случае}
      \end{array}   \right. \\
\end{array}
  3. \begin{array}{lll}
f_3(x, y)& = &\left \{\begin{array}{ll}
            \lfloor \log_2 (1+ \lfloor \frac{x}{ y} \rfloor)\ \rfloor, & \mbox{ если } x > 2 y\\
             xy, & \mbox{ в противном случае}
      \end{array}   \right. \\
\end{array}
  4. \begin{array}{lll}
f(x, y)& = &\left \{\begin{array}{ll}
              \lfloor  \sqrt{x}\ \rfloor  , & \mbox{ если }   2x \geq  y \\
             (x\ mod\  y), & \mbox{ в противном случае}
      \end{array}   \right. \\
\end{array}

Задача 9.9. Докажите, что всякую арифметическую функцию f(x), вычислимую на некоторой м. Т. M = <Q, \Sigma , P,q_{0}, q_{f}>, можно также вычислить на м. Т. M',, алфавит ленты которой содержит лишь два символа \wedge и |. (Указание: используйте для моделирования одного символа из \Sigma блок из нескольких подряд идущих ячеек, содержащих его код в алфавите \{ \wedge , , | \} ) и замените каждую команду M группой команд, обрабатывающих соответствующий блок ячеек).

Задача 9.10. Построить машину Тьюринга, определяющую по слову x в алфавите {1, 2} симметрично ли оно, т. е. вычисляющую функцию:

f(x) = \left \{\begin{array}{ll}
             1, & \mbox{ если слово x  симметрично}\\
             2, & \mbox{ в противном случае}
      \end{array}   \right.

Задача 9.11. Построить машину Тьюринга, сравнивающую два слова x=x1x2... xn и y=y1y2... ym в алфавите {1, 2, 3} лексикографически: x \prec y \Leftrightarrow\ \exists i \leq n [(x_1=y_1)\ \&\ ( x_2=y_2)\ \& \ldots\ (x_{i-1}=y_{i-1})
\ \&\ ( x_i < y_i )] или для некоторого непустого слова x' выполнено y = x x'. Эта машина Тьюринга должна вычислять функцию:

f(x, y) = \left \{\begin{array}{ll}
             1 , & \text{ если  $x \prec y$ }\\
            2 , & \text{ если  $x = y$ }\\
           3 , & \text{ если  $y \prec x$ }
      \end{array}   \right.
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >