Как построить машину Тьюринга: пошаговое решение
Дано: на ленте записано двоичное число (это в десятичной записи), головка стоит над старшим разрядом, остальные клетки пустые. Найти: машину Тьюринга, которая прибавит к этому числу единицу, то есть её алфавит, состояния, таблицу переходов и трассировку до остановки.
Схема решения всегда одна: сначала проход вправо до конца числа, потом возврат влево с обработкой переноса. Ответ: достаточно двух рабочих состояний и шести команд; машина останавливается через 8 тактов, на ленте остаётся , то есть . Калькулятор сверху прогоняет эту же программу такт за тактом: подвинь ползунок числа, и трассировка перестроится, а по длине хвоста из единиц сразу видно, докуда дойдёт перенос.
Решение по шагам
Дано. Слово на ленте, слева и справа пустые клетки, головка над старшим символом.
Найти. Внешний алфавит, состояния, таблицу переходов, трассировку и заключительную конфигурацию.
Шаг 1. Внешний алфавит. На ленте встречаются только цифры двоичной записи и пустая клетка, поэтому
где - пустой символ. Он полноправный: по нему машина узнаёт, что число кончилось, и без него остановиться было бы не на чем.
Шаг 2. Состояния и их смысл. Прибавление единицы распадается ровно на две работы, значит, и рабочих состояний нужно два. Состояние - проход вправо: машина не трогает разряды, а просто ищет конец числа. Состояние - перенос: машина идёт справа налево и разбирается с разрядами. Плюс заключительное состояние , в котором команд нет и работа кончается:
Договоримся о нумерации клеток: старший символ слова лежит в клетке 1, значит, клетки числа это 1, 2, 3, 4, справа от него пустая клетка 5, слева пустая клетка 0. Ровно такую разметку показывает шапка трассировки в калькуляторе.
Шаг 3. Таблица переходов. Клетка таблицы на пересечении состояния и символа содержит три вещи: что записать, куда сдвинуть головку ( вправо, влево, на месте) и в какое состояние перейти.
| Состояние | 0 | 1 | |
|---|---|---|---|
| (идём вправо) | 0 R | 1 R | L |
| (перенос) | 1 N | 0 L | 1 N |
Читается она так. В и ноль, и единица переписываются сами в себя со сдвигом вправо: по дороге к концу числа разряды не меняются. Пустая клетка значит, что число кончилось: головка разворачивается влево и переходит в . В единица становится нулём и перенос идёт дальше, ноль становится единицей и машина останавливается, а пустая клетка слева означает переполнение разрядной сетки, и там дописывается новая старшая единица.
Шаг 4. Трассировка. Конфигурация машины это тройка: слово на ленте, положение головки и текущее состояние. Такт это применение одной команды. Выписываем все такты для слова :
| Такт | Состояние | Лента | Клетка головки | Команда |
|---|---|---|---|---|
| 0 | 1011 | 1 | 1 R | |
| 1 | 1011 | 2 | 0 R | |
| 2 | 1011 | 3 | 1 R | |
| 3 | 1011 | 4 | 1 R | |
| 4 | 1011 | 5 | L | |
| 5 | 1011 | 4 | 0 L | |
| 6 | 1010 | 3 | 0 L | |
| 7 | 1000 | 2 | 1 N | |
| 8 | 1100 | 2 | стоп |
Первые четыре такта машина едет вправо, на пятом упирается в пустую клетку и разворачивается. Дальше идёт арифметика: два младших разряда были единицами и гасятся в нули (такты 5 и 6), а третий справа разряд с нулём принимает перенос и машина уходит в .
Ответ. Машина задана алфавитом , состояниями и шестью командами таблицы; на слове она делает 8 тактов и оставляет на ленте , что в десятичной записи даёт .
Как записывается команда и что значит детерминированность
Команду принято писать одной строкой в формате
то есть «находясь в состоянии и видя символ , запиши в клетку , сдвинь головку по направлению и перейди в ». Наша программа в таком виде занимает шесть строк, и калькулятор сверху печатает их под трассировкой целиком.
Требование детерминированности звучит просто: на каждую пару «состояние и символ» приходится не больше одной команды. В таблице это значит, что в клетке либо ровно одна тройка, либо прочерк. Если бы в на символ стояли две разные команды, машина перестала бы быть детерминированной и превратилась бы в недетерминированную модель, где вычисление ветвится в дерево.
Пустая клетка таблицы означает остановку: команды нет, машина стоит, и поэтому для строку вообще не заводят. Результат это просто то, что осталось на ленте в заключительной конфигурации.
Почему машина действительно прибавляет единицу
Возьми обычное сложение столбиком и прибавь единицу к младшему разряду. Пока в разряде стоит единица, сумма даёт : в разряде остаётся ноль, а единица уходит в перенос влево. Как только встретился ноль, он превращается в единицу и перенос гасится. Цепочка обрывается, старшие разряды остаются нетронутыми.
Состояние повторяет этот школьный алгоритм буквально: команда «, влево» значит «разряд обнулился, перенос жив», а «, стоп» значит «перенос погашен». Третий случай, пустая клетка в , отвечает числу из одних единиц: для перенос проходит все разряды насквозь, машина пишет единицу на свободном месте слева и получает .
Может показаться, что состояние лишнее и можно начать прямо с младшего разряда. Но головка стоит над старшим символом, а перенос идёт справа налево, и перепрыгнуть в конец слова машина не умеет: единственный способ узнать, где кончается число, это дойти до пустой клетки.
Сколько тактов работает машина
Число тактов легко посчитать заранее. Пусть в числе разрядов, а младших разрядов, подряд равных единице, ровно . Тогда машина делает тактов на проход вправо, один такт на разворот у пустой клетки, тактов на гашение единиц и ещё один на запись итоговой единицы:
Для нашего слова получается , и - сходится с трассировкой. Для выйдет тактов, для получится . Худший случай это число из одних единиц, где и , то есть время растёт линейно по длине записи. Такая оценка и есть сложность алгоритма на модели Тьюринга, а как её записывают через -нотацию, разобрано в задаче про оценку сложности алгоритма.
Другие машины на той же ленте
Смена задачи меняет программу, но не схему рассуждения: сначала алфавит, потом роли состояний, потом таблица. Оба варианта ниже прогоняются в калькуляторе сверху чипами выбора.
Унарная запись. Число это палочек подряд, прибавить единицу значит дописать палочку в конец, переноса нет вовсе. Хватает одного состояния и двух команд: «, вправо, » и «, стоп, »; для числа 5 выходит 6 тактов. Плата за простоту программы это длина ленты, растущая как само число.
Инверсия разрядов. Задача «заменить каждый ноль на единицу и наоборот» решается одним проходом: «, вправо», «, вправо», «, стоп». Возврата нет, потому что разряды независимы, и на слове машина остановится через 5 тактов со словом .
Из таких кирпичиков собираются сколь угодно сложные программы, а саму программу можно закодировать словом и подать на вход другой машине, получив универсальную машину Тьюринга; на этом же пути возникает проблема остановки. Есть и равносильные модели с другой записью, например нормальные алгорифмы Маркова.
Частые ошибки
- Забывают команду для пустого символа. Без строки в машина уедет вправо по пустой ленте и не остановится: пустой символ обязан быть и в алфавите, и в таблице.
- Начинают перенос со старшего разряда. Головка стоит слева, и соблазн прибавлять прямо там велик, но перенос в позиционной записи идёт справа налево. Без прохода получится не то число.
- Теряют случай числа из одних единиц. Для перенос выходит за левый край слова, и без команды на в машина сломается ровно на этом входе.
- Пишут сдвиг после смены состояния. В команде все три действия происходят за один такт: запись, сдвиг, смена состояния. Трассировка, где символ записали в одном такте, а сдвинулись в следующем, неверна.
- Дублируют команды. Две разные команды на одну пару «состояние и символ» ломают детерминированность. В таблице переходов каждая клетка заполняется ровно один раз.
- Путают заключительное состояние с рабочим. Из переходов нет: лента больше не меняется, и строку «: ничего не делать» дописывать не нужно.
FAQ
Сколько состояний нужно машине для прибавления единицы? Два рабочих плюс заключительное. Меньше не получится: проход к концу числа и обработка переноса это разные режимы, и различать их машина может только состоянием, потому что символ под головкой в обоих случаях один и тот же.
Обязательно ли начинать с левого края слова? Нет, стартовая конфигурация задаётся условием задачи. Если в методичке головка изначально стоит над младшим разрядом, состояние вообще не нужно, программа сокращается до трёх команд. Важно только, чтобы трассировка соответствовала заявленному началу.
Чем таблица переходов отличается от графа состояний? Содержанием ничем, это две формы записи одной программы: в таблице строка это состояние, а столбец символ, в графе состояния это вершины, а команды подписанные дуги. Таблицей проще проверять детерминированность.
Что писать в ответе к такой задаче? Четыре вещи: алфавит, множество состояний с указанием начального и заключительного, таблицу переходов и трассировку на заданном входе. Словесного описания алгоритма без таблицы недостаточно.
Коротко
- Выписываем внешний алфавит: цифры записи плюс пустой символ, у нас .
- Делим алгоритм на режимы и даём каждому состояние: едет вправо до конца числа, обрабатывает перенос справа налево, заключительное.
- Заполняем таблицу переходов в формате ; каждая клетка заполняется не больше одного раза.
- Проверяем крайние случаи: число из одних единиц требует отдельной команды на пустой символ в .
- Трассируем вход такт за тактом: для слова машина делает 8 тактов и оставляет на ленте , то есть .
Похожие задачи
Как применить правила вывода: решение по шагам
Как применять правила вывода в логике высказываний: модус поненс, модус толленс, гипотетический и дизъюнктивный силлогизм. Разбор вывода из пяти посылок и проверка набором.
Матлогика/алгоритмыКак построить вывод формулы: пошаговое решение
Как построить вывод формулы в исчислении высказываний: схемы аксиом, правило modus ponens, разбор вывода A → A из пяти шагов, обратный ход от цели и теорема о дедукции.
Матлогика/алгоритмыКак проверить тавтологию: пошаговое решение
Как проверить формулу на тавтологию: метод от противного, полный перебор по таблице истинности и приведение к КНФ. Пошаговый разбор примера с импликациями и проверка ответа.
Орг./аналит. химияОкисление перманганатом калия: реакции в трёх средах
Как написать окисление перманганатом калия в кислой, нейтральной и щелочной средах: продукты восстановления марганца, метод электронного баланса, расстановка коэффициентов, расчёт титранта.
Химия (физич./структурная)Как найти активность иона: расчёт по Дебаю-Хюккелю
Как найти активность иона в растворе: ионная сила по всем ионам, коэффициент активности по предельному закону Дебая-Хюккеля, произведение f на c, разбор с числами и калькулятор.
ГенетикаКак найти частоту генотипов: закон Харди-Вайнберга
Разбор задачи по популяционной генетике: как найти частоту генотипов по закону Харди-Вайнберга, формула p2 плюс 2pq плюс q2, расчёт числа особей и калькулятор частот.