Персональные инструменты
 

Машина Тьюринга — различия между версиями

Материал из CustisWiki

Перейти к: навигация, поиск
м (реплицировано из внутренней CustisWiki)
 
м (реплицировано из внутренней CustisWiki)
(не показана 1 промежуточная версия 1 участника)
Строка 62: Строка 62:
  
 
<code-python>
 
<code-python>
def execute_MT(MT,input):
+
def execute_MT(MT,Tape):
 +
    k=MT["k"]
 
     T=MT["program"]
 
     T=MT["program"]
     tape=["*"]+input
+
     Tape=["*"]+Tape[:]
    state=MT["start"]
+
     configuration={"state":MT["start"], "position":1, "tape": Tape}
     position=1
+
    history=[configuration]
    history=[{"state":state, "position":position, "tape": []+tape}]
+
 
     step=0
 
     step=0
 
     while 1:
 
     while 1:
 
       step=step+1
 
       step=step+1
       if position>=len(tape):
+
       #if we reach the end of the tape --- enlarge it
           tape.append("*")
+
      if configuration["position"]>=len(configuration["tape"]):
       symbol_under_head=tape[position]
+
           configuration["tape"].append("*")
       action=T[(state,(symbol_under_head))]
+
 
       state=action[0]
+
       #the symbol we are looking at
       symbol_to_write=action[1][0]
+
      symbol=configuration["tape"][configuration["position"]]
       tape[position]=symbol_to_write
+
 
 +
      #perform transition
 +
      key=(configuration["state"],(symbol))
 +
       action=T[key]
 +
 
 +
      # Just cloning entire configuration: (state,head position,tape)
 +
      new_tape=configuration["tape"][:]
 +
      new_configuration=dict(configuration)    
 +
      new_configuration["tape"]=new_tape
 +
       configuration=new_configuration
 +
 
 +
      #changing state      
 +
      configuration["state"]=action[0]
 +
        
 +
      #write new symbol
 +
      symbol=action[1][0]
 +
       configuration["tape"][configuration["position"]]=symbol
 +
 
 +
      #move head
 
       move=action[1][1]
 
       move=action[1][1]
       if move=="L": position=position-1
+
       if move=="L": configuration["position"]=configuration["position"]-1
       if move=="R": position=position+1
+
       if move=="R": configuration["position"]=configuration["position"]+1
       history.append({"state":state, "position":position, "tape": []+tape})
+
     
       if state==MT["stop"] or step>1000:
+
      #tracking configuration
 +
       history.append(configuration)
 +
        
 +
      #if stop state - finishing
 +
      if configuration["state"]==MT["stop"] or step>1000:
 
           break
 
           break
 +
     
 
     return history
 
     return history
 
</code-python>
 
</code-python>
Строка 89: Строка 112:
  
 
Он принимает на вход описание машины Тьюринга в виде хэш-таблицы — рассмотрим пример машины тьюринга для задачи удвоения входной строки (алфавит состоит только из «1»).
 
Он принимает на вход описание машины Тьюринга в виде хэш-таблицы — рассмотрим пример машины тьюринга для задачи удвоения входной строки (алфавит состоит только из «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]]-структуры для вышеприведенного симулятора:
+
 
<code-python>
 
<code-python>
 
MT={
 
MT={

Версия 07:41, 8 декабря 2005

Неформально, Машина Тьюринга (далее МТ) представляет собой автомат с конечным числом состояний и неограниченной памятью, представленной набором одной или более лент, бесконечных в обоих направлениях. Ленты поделены на соответственно бесконечное число ячеек, и на каждой ленте выделена стартовая (нулевая) ячейка. В каждой ячейке может быть записан только один символ из некоторого конечного алфавита , где предусмотрен символ «*» для обозначения пустой ячейки.

На каждой ленте имеется головка чтения-записи, и все они подсоединены к «управляющему модулю» МТ — автомату с конечным множеством состояний .

Имеется выделенное стартовое состояние (например, «START») и состояние (или набор состояний) завершения (например «STOP»).

Перед запуском МТ находится в состоянии «START», а все головки позиционированы на нулевые ячейки соответствующих лент. На каждом шаге все головки считывают информацию из своих текущих ячеек и посылают ее управляющему модулю МТ. В зависимости от этих символов и собственного состояния управляющий модуль производит следующие операции:

  1. Посылает каждой головке символ для записи в текущую ячейку каждой ленты;
  2. Посылает каждой головке одну из команд «LEFT»,"RIGHT","STAY";
  3. Выполняет переход в новое состояние (которое, впрочем, может совпадать с предыдущим).

Теперь то же самое более формально.

Машина Тьюринга это набор , где

k
натуральное число,
конечные множества входного алфавита и состояний соответственно,
символ-пробел,
выделенные состояния,
произвольные отображения:
  • (задает новое состояние);
  • (задает символы для записи на ленты);
  • (определяет, как двигать головки).

Удобно считать, что алфавит содержит кроме «пробела» («*») два выделенных символа, «0» и «1» (Обычно вовсе ограничиваются ).

Под входом для МТ подразумевается набор из k слов (k-кортеж слов из ), записанных на k лентах начиная с нулевых позиций. Обычно, на входные данные записывают только на первую ленту, и под входом x подразумевают k-кортеж .

{\it Результатом} работы МТ на некоем входе является также k-кортеж слов из , оставшихся на лентах. Для простоты также удобно считать, что результатом является только слово на последней ленте, а все остальное — просто мусор.

Также считается, что входное слово не содержит пробелов — действительно, иначе было бы невозможно определить, где кончается входное слово (Можно конечно разрешить пробелы, но тогда придется зарезервировать еще один символ — «конец ввода»).

Существуют следующие обобщения машины Тьюринга:


Примеры

Если что-то осталось непонятным, можно рассмотреть симулятор работы МТ на языке Python, который мы будем использовать, чтобы проиллюстрировать процесс работы машин Тьюринга.

def execute_MT(MT,Tape):
    k=MT["k"]
    T=MT["program"]
    Tape=["*"]+Tape[:]
    configuration={"state":MT["start"], "position":1, "tape": Tape}
    history=[configuration]
    step=0
    while 1:
       step=step+1
       #if we reach the end of the tape --- enlarge it
       if configuration["position"]>=len(configuration["tape"]):
           configuration["tape"].append("*")
 
       #the symbol we are looking at
       symbol=configuration["tape"][configuration["position"]]
 
       #perform transition 
       key=(configuration["state"],(symbol)) 
       action=T[key]
 
       # Just cloning entire configuration: (state,head position,tape)
       new_tape=configuration["tape"][:]
       new_configuration=dict(configuration)     
       new_configuration["tape"]=new_tape
       configuration=new_configuration
 
       #changing state       
       configuration["state"]=action[0]
 
       #write new symbol
       symbol=action[1][0]
       configuration["tape"][configuration["position"]]=symbol
 
       #move head
       move=action[1][1]
       if move=="L": configuration["position"]=configuration["position"]-1
       if move=="R": configuration["position"]=configuration["position"]+1
 
       #tracking configuration
       history.append(configuration)
 
       #if stop state - finishing
       if configuration["state"]==MT["stop"] or step>1000:
           break
 
    return history


Он принимает на вход описание машины Тьюринга в виде хэш-таблицы — рассмотрим пример машины тьюринга для задачи удвоения входной строки (алфавит состоит только из «1»). Описание соответствующей МТ:

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», «_» ):

[svg]

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

Например, вот три запуска симулируемой «удваивающей» МТ на строках «1», «11», «111»:


Можно рассмотреть другие примеры МТ:


Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».

Репликация: База Знаний «Заказных Информ Систем» → «Машина Тьюринга»