Машина Тьюринга
Материал из свободной русской энциклопедии «Традиция»
Неформально, Машина Тьюринга (далее МТ) представляет собой автомат с конечным числом состояний и неограниченной памятью, представленной набором одной или более лент, бесконечных в обоих направлениях. Ленты поделены на соответственно бесконечное число ячеек, и на каждой ленте выделена стартовая (нулевая) ячейка. В каждой ячейке может быть записан только один символ из некоторого конечного алфавита Σ, где предусмотрен символ «*» для обозначения пустой ячейки.
На каждой ленте имеется головка чтения-записи, и все они подсоединены к «управляющему модулю» МТ — автомату с конечным множеством состояний Γ.
Имеется выделенное стартовое состояние (например, «START») и состояние (или набор состояний) завершения (например «STOP»).
Перед запуском МТ находится в состоянии «START», а все головки позиционированы на нулевые ячейки соответствующих лент. На каждом шаге все головки считывают информацию из своих текущих ячеек и посылают ее управляющему модулю МТ. В зависимости от этих символов и собственного состояния управляющий модуль производит следующие операции:
- Посылает каждой головке символ для записи в текущую ячейку каждой ленты;
- Посылает каждой головке одну из команд «LEFT»,"RIGHT","STAY";
- Выполняет переход в новое состояние (которое, впрочем, может совпадать с предыдущим).
Теперь то же самое более формально.
Машина Тьюринга это набор
, где
- k
- натуральное число,
- Σ,Γ
- конечные множества входного алфавита и состояний соответственно,

- символ-пробел,

- выделенные состояния,
- α,β,γ
- произвольные отображения:
(задает новое состояние);
(задает символы для записи на ленты);
(определяет, как двигать головки).
Удобно считать, что алфавит Σ содержит кроме «пробела» («*») два выделенных символа, «0» и «1» (Обычно вовсе ограничиваются
).
Под входом для МТ подразумевается набор из k слов (k-кортеж слов из Σ * ), записанных на k лентах начиная с нулевых позиций. Обычно, на входные данные записывают только на первую ленту, и под входом x подразумевают k-кортеж
.
{\it Результатом} работы МТ на некоем входе является также k-кортеж слов из Σ * , оставшихся на лентах. Для простоты также удобно считать, что результатом является только слово на последней ленте, а все остальное — просто мусор.
Также считается, что входное слово не содержит пробелов — действительно, иначе было бы невозможно определить, где кончается входное слово (Можно конечно разрешить пробелы, но тогда придется зарезервировать еще один символ — «конец ввода»).
Существуют следующие обобщения машины Тьюринга:
[править] Примеры
Если что-то осталось непонятным, можно рассмотреть симулятор работы МТ на языке Python, который мы будем использовать, чтобы проиллюстрировать процесс работы машин Тьюринга.
def execute_MT(MT,input): T=MT["program"] tape=["*"]+input state=MT["start"] position=1 history=[{"state":state, "position":position, "tape": []+tape}] step=0 while 1: step=step+1 if position>=len(tape): tape.append("*") symbol_under_head=tape[position] action=T[(state,(symbol_under_head))] state=action[0] symbol_to_write=action[1][0] tape[position]=symbol_to_write move=action[1][1] if move=="L": position=position-1 if move=="R": position=position+1 history.append({"state":state, "position":position, "tape": []+tape}) if state==MT["stop"] or step>1000: break return history
Он принимает на вход описание машины Тьюринга в виде хэш-таблицы — рассмотрим пример машины тьюринга для задачи удвоения входной строки (алфавит состоит только из «1»). Табличное описание МТ:
<latex> \begin{tabular}{|cc|c|ccc|} \hline
<\textcolor{blue}{s1}> & * & $\Rightarrow$ & [\textcolor{red}{q}] & * & \\ \hline
<\textcolor{blue}{s1}> & 1 & $\Rightarrow$ & s2 & * & R \\ \hline
s2 & * & $\Rightarrow$ & s3 & * & R \\ \hline
s2 & 1 & $\Rightarrow$ & s2 & 1 & R \\ \hline
s3 & * & $\Rightarrow$ & s4 & 1 & L \\ \hline
s3 & 1 & $\Rightarrow$ & s3 & 1 & R \\ \hline
s4 & * & $\Rightarrow$ & s5 & * & L \\ \hline
s4 & 1 & $\Rightarrow$ & s4 & 1 & L \\ \hline
s5 & * & $\Rightarrow$ & <\textcolor{blue}{s1}> & 1 & R \\ \hline
s5 & 1 & $\Rightarrow$ & s5 & 1 & L \\ \hline
\end{tabular} </latex>
Таблица МТ в виде Python-структуры для вышеприведенного симулятора:
MT={ 'k': 1, 'start': 's1', 'stop': 'q', 'program': { #(Состояние, символы на лентах) -> (новое состояние, (действия по каждой ленте)) ('s1', ('1')): ('s2', (('*','R'))), ('s2', ('1')): ('s2', (('1','R'))), ('s2', ('*')): ('s3', (('*','R'))), ('s3', ('*')): ('s4', (('1','L'))), ('s3', ('1')): ('s3', (('1','R'))), ('s4', ('1')): ('s4', (('1','L'))), ('s4', ('*')): ('s5', (('*','L'))), ('s5', ('1')): ('s5', (('1','L'))), ('s5', ('*')): ('s1', (('1','R'))), ('s1', ('*')): ('q', (('*',''))) } }
Обратите также внимание на альтернативное представление машины Тьюринга в виде ориентированных графа, где вершинами являются состояниями, возможные переходы между ними — ребрами, причем начало ребра помечено символом, который должен быть на ленте для активации перехода, а конец ребра помечен символом, который пишется на ленту, и командой перемещения головки («L», «R», «_» ):

Симулятор возвращает историю выполнения — последовательность конфигураций (состояние, лента, положение головки) — МТ на данном входе.
Например, вот три запуска симулируемой «удваивающей» МТ на строках «1», «11», «111»:



Можно рассмотреть другие примеры МТ:
- Машина Тьюринга:Распознавание строки, с одинаковым количеством 0 и 1
- Машина Тьюринга:Унарное сложение
- Машина Тьюринга:Распознавание четности
