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

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

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Аннотация: Определение машин Тьюринга и класса вычислимых ими функций. Примеры работы машин Тьюринга. Тьюрингово программирование: последовательная и параллельная композиция, ветвление (условный оператор), повторение (оператор цикла)

Основные определения

Рассматриваемая в этом разделе модель алгоритмов была предложена английским математиком Тьюрингом в 1937 г. еще до создания современных компьютеров1Аналогичная модель вычислений была примерно в то же время определена Е. Постом. Поэтому иногда такие машины называют машинами Тьюринга-Поста Он исходил из общей идеи моделирования работы вычислителя, оперирующего в соответствии с некоторым строгим предписанием. В машине Тьюринга расчленение процесса вычисления на элементарные шаги доведено в известном смысле до предела. Элементарным действием является замена одного символа в ячейке на другой и перемещение к соседней ячейке. При таком подходе процесс вычисления значительно удлиняется, но зато логическая структура процесса сильно упрощается и приобретает удобный для теоретического исследования вид.

Машина Тьюринга (м.Т.) состоит из неограниченной в обе стороны ленты, разбитой на ячейки, по которой передвигается головка машины. Такая "бесконечность" ленты является математической абстракцией, отражающей потенциальную неограниченность памяти вычислителя. Разумеется, в каждом завершающемся вычислении используется только конечная часть этой памяти - конечное число ячеек. В каждой ячейке ленты записан один символ из конечного внешнего алфавита машины \Sigma  = \{ a_{0}, a_{1}, \dots  ,a_{m} \}. Головка машины представляет конечный автомат, который в каждый момент времени находится в одном из внутренних состояний Q ={q0,q1,... , qn }. На каждом шаге головка в зависимости от своего внутреннего состояния и символа в ячейке, которую она наблюдает, изменяет свое внутреннее состояние и содержимое наблюдаемой ячейки и может сдвинуться на одну ячейку вправо или влево либо остаться на месте.

Дадим более формальное определение.

Определение 9.1. Машина Тьюринга - это система вида

{\cal M} = < Q, \Sigma, P,q_0, q_f >,

включающая следующие компоненты:

  • Q ={q0,q1,... ,qn } - внутренний алфавит (алфавит состояний);
  • \Sigma  = \{ a_{0}, a_{1}, \dots  , a_{m-1} \} - внешний алфавит (алфавит ленты );
  • P - программа машины, в которой для каждой пары q_{i} \in  Q \setminus  \{  q_{f} \} ,  a_{j} \in  \Sigma имеется (одна!) команда вида

    q_i a_j \rightarrow q_k a_l C,\ q_k \in Q, a_l \in \Sigma,

    C \in   \{ Л, П, Н\} задает сдвиг головки вправо, влево или на месте;

  • q_{0} \in  Q - начальное состояние;
  • q_{f} \in  Q - заключительное состояние.

Выделим в алфавите \Sigma специальный пустой символ a_{0} =\wedge и будем считать, что во всех ячейках ленты, кроме конечного их числа, в начальный и во все последующие моменты находится пустой символ.

Будем говорить, что некоторый символ стирается, если он заменяется на пустой. Два слова из \Sigma ^{*} будем считать равными, если они совпадают после отбрасывания всех пустых символов слева и справа. Например, \wedge  \wedge  ab\wedge  c\wedge  =\wedge  ab\wedge  c = ab\wedge  c, но ab \wedge  c \ne  abc.

Как и для конечных автоматов, программу P можно задавать с помощью таблицы размера n x m, строки которой соответствуют состояниям из Q, а столбцы - символам из входного алфавита \Sigma, в которой на пересечении строки qi и столбца aj стоит тройка qk al C - правая часть команды qi aj -> qk al C.

Определение 9.2. Назовем конфигурацией м.Т. {\cal M }\ в некоторый момент времени слово K= wл qi aj wп, где w_{л} \in  \Sigma ^{*} - слово на ленте левее текушего положения головки, qi - внутреннее состояние в данный момент, aj - символ, обозреваемый головкой, w_{п} \in  \Sigma ^{*} - слово на ленте правее текушего положения головки.

Будем считать, что слово wл aj wп содержит все значащие символы на ленте. Поэтому, с точностью до описанного выше равенства слов, конфигурация определена однозначно. В частности, если w_{л}=\varepsilon, т.е. пусто, то левее положения головки все ячейки пусты, а если w_{п}=\varepsilon, то правее положения головки все ячейки пусты.

Начальная конфигурация - это конфигурация вида q0w, т.е. в начальный момент времени головка в состоянии q0 обозревает первый символ входного слова w. { it Заключительная } конфигурация - это конфигурация вида w1 qf w2, в которой машина находится в заключительном состоянии qf.

Определение 9.3. Скажем, что конфигурация K= w1 qi aj w2 м.Т. {\cal M } за один шаг (такт) переходит в конфигурацию K^\prime= w_1^\prime q_k a_{j^\prime} w_2^\prime\ (K \vdash_{\cal M } K^\prime), если в программе имеется команда qi aj -> qk al C и при этом,

  • если С=Н, то w1'=w1, w2'=w2 и a{j'}=al;
  • если С=Л, то w1=w1' a, a{j'}=a, w2'=al w2 (если w_{1}=\varepsilon , / то w_{1}^{'} = \varepsilon и a_{j^'} =\wedge);
  • если С=П, то w2=aw2', a{j'}=a, w1'=w1 al (если w_{2}=\varepsilon , / то w_{2}^{'} = \varepsilon и a_{j^'} =\wedge).

Как обычно, через \vdash^*_{\cal M } обозначим рефлексивное и транзитивное замыкание отношения \vdash_{\cal M },\ а K \vdash^n_{\cal M } K^\prime будет означать, что конфигурация K за n шагов переходит в K'. (Если из контекста ясно, о какой машине идет речь, то индекс {\cal M } будем опускать).

Пример 9.1.

Выполнение команды q3 0 -> q5 1 П

Рис. 9.1. Выполнение команды q3 0 -> q5 1 П

Например, ситуации, представленной на рис.9.1 слева соответствует конфигурация K= 1q_{3}01\wedge  0. Предположим, что программа P содержит команду q30 -> q51 П. Тогда после выполнения этой команды K перейдет за один шаг в конфигурацию K^{'}= 11q_{5}1\wedge 0, показанную на этом рисунке справа. Следовательно, K \vdash K^\prime.

Определение 9.4. Вычисление м.Т. {\cal M}\ на входе w - это конечная или бесконечная последовательность конфигураций K_0 \vdash K_1 \vdash\ldots \vdash K_t\vdash K_{t+1}\ldots такая, что K0=q0w - начальная конфигурация. Эта последовательность конечна, когда ее последняя конфигурация Kn= v1 qf v2 - заключительная. В этом случае вычисление назовем результативным, а слово v = v1 v2 - его результатом на входе w (всегда будем предполагать, что v не содержит пустых символов слева и справа).

Определение 9.5. Скажем, что м.Т. {\cal M}\ вычисляет частичную словарную функцию f:\ \Sigma^* \rightarrow \Sigma^*,\ если для каждого слова w из области определения f существует результативное вычисление {\cal M}\ с результатом f(w), а если f(w) не определена (f(w)=\infty), то вычисление {\cal M}\ на входе w бесконечно.

Скажем, что две м.Т. {\cal M}_1 и {\cal M}_2\ эквивалентны, если они вычисляют одинаковые функции.

Далее мы будем также рассматривать вычисления арифметических функций, т.е. функций с натуральными аргументами, принимающих натуральные значения. Для представления натуральных чисел используем унарное кодирование: число n будет представляться как слово из n палочек |n, а последовательные аргументы будем отделять *.

Определение 9.6. Скажем, что м.Т. {\cal M}\ вычисляет частичную арифметическую функцию f: Nk -> N, если для любого набора чисел (x1,x2, ... ,xk), на котором f определена, существует результативное вычисление {\cal M}\ на входе |^{x_1}* |^{x_2}*\ldots * |^{x_k} с результатом |^{f(x_1,x_2,\ldots ,x_k)}, а если f(x_{1},x_{2},\dots  ,x_{k})=\infty, то вычисление {\cal M}\ на соответствующем входе бесконечно.

Аналогичное определение можно дать и для других спосбов кодирования чисел (двоичного, десятичного и др.). Ниже мы покажем, что класс вычислимых функций не зависит от выбора одного из таких кодирований.

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Василий Петров
Василий Петров
Россия
Юрий Фролов
Юрий Фролов
Украина