1. Уважаемые друзья!

    С 8 февраля 2018 года наш форум переходит в режим Элитарного Клуба.
    Теперь незарегистрированным посетителям запрещено подглядывать и подслушивать наши тайные переговоры, а чтобы зарегистрироваться, нужно... впрочем, если вы действительно достойны стать членом Клуба, то вы наверняка разберётесь, как это сделать.

    Возрадуйтесь, обладатели зарегистрированных аккаунтов! Обещаем вам чистки, репрессии и все остальные бонусы тоталитарного сообщества.

    Всегда ваша,
    Администрация Корума

ДМ. Машина Тьюринга

Тема в разделе "Вопросы высшей математики", создана пользователем Silver MC's, 14 июл 2013.

Модераторы: onyx
  1. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

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

    Предполагается, что читатель знаком с понятием алгоритма.

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

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

    Пример того, как это могло бы выглядеть представлен на следующих рисунках:

    [​IMG] [​IMG]

    Лента. Каждая ячейка ленты может находиться в одном из множества состояний, которые, для удобства, помечаются символами [​IMG]. Назовем эти символы - символами внешнего алфавита машины, при этом сама лента часто называется внешней памятью. Если ячейка пустая, то такую ячейку будем обозначать символом [​IMG]. Без ограничения общности ленту можно считать бесконечной лишь с одной стороны. В этом случае, для удобства, введем специальный символ [​IMG], обозначающий начало ленты. Этот символ имеет строго определенное место, его нельзя ни стирать, ни сдвигать. Тогда ленту можно считать однонаправленной (бесконечной вправо) и ее ячейки удобно просматривать слева направо.

    Внутренняя память.
    Предполагается, что число возможных состояний внутренней памяти конечное и для каждой машины фиксированное. Состояние внутренней памяти мы будем обозначать символами [​IMG] или любыми другими символами, не входящими во внешний алфавит машины. Совокупность символов, обозначающих состояния внутренней памяти, называется внутренним алфавитом машины или внутренними состояниями машины. Одно из этих состояний называется начальным, с него начинает работу любая машина, пусть это будет состояние [​IMG]. В процессе работы машина может какое-то количество шагов оставаться в состоянии [​IMG] или возвращаться в него позднее. Еще одно специальное состояние - заключительное. Символ, обозначающий заключительное состояние, будет называться стоп - символом. Роль стоп - символа далее будет играть символ [​IMG]. Если в какой-то момент времени внутренняя память машины приходит в заключительное состояние [​IMG], то дальнейших изменений в машине не происходит и машина называется остановившейся. Может случиться, что в машине никогда не будет происходить никаких изменений и при каком-то другом внутреннем состоянии [​IMG]. Однако в этом случае мы будем говорить, что машина продолжает работать «вечно». В большинстве случаев не останавливающиеся машины не имеют никакой ценности, так как невозможно запротоколировать факт окончания выполнения алгоритма и, соответственно, считать полученный ответ. Обычно говорят, что, если машина [​IMG] не останавливается на входном слове [​IMG], то она к этому слову неприменима.

    Механическое устройство
    Предполагается, что машина снабжена особым механизмом, который в зависимости от символа в воспринимаемой ячейке и состояния внутренней памяти может выполнить следующие действия:
    •изменить состояние внутренней памяти,
    •одновременно изменить содержимое воспринимаемой ячейки,
    •сдвинуть (вправо, влево) управляющую головку в соседнюю ячейку.

    Работа машины состоит в том, что она из данного «состояния» по истечении одного такта работы механического устройства переходит в следующее «состояние», затем из этого состояния по истечении такта работы переходит в новое состояние и так далее. Т.о. если машина, имея внутреннее состояние [​IMG] и воспринимая ячейку ленты с символом [​IMG], изменяет свое внутреннее состояние на [​IMG] и одновременно содержимое воспринимаемой ячейки заменяет символом [​IMG], а управляющая головка сдвинется на одну ячейку вправо ®, то говорят, что машина выполняет команду соответственно [​IMG]. Если управляющая головка сдвинется влево (L) или останется неподвижной (Н), то команды записываются соответственно:
    [​IMG]
    [​IMG]

    Программа машины Тьюринга - это совокупность команд установленного формата.

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

    Важный тезис, который нам может пригодиться в этой и других статьях:
  2. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    Примеры.
    Пример 1. Алфавит [​IMG]. Заменить во входном слове все символы [​IMG] на [​IMG].
    Решение (с пояснениями).
    [​IMG] - символ начала ленты, сдвигаемся вправо без изменения состояния.
    [​IMG] - если символ "1", то ничего не меняем и двигаемся дальше.
    [​IMG] - если символ "0", то меняем его на "1" и двигаемся дальше.
    [​IMG] - если наткнулись на пустую ячейку, то останавливаемся и завершаем работу.

    Пример 2. Алфавит [​IMG]. Перезаписать входную ленту зеркальным отражением входной строки (например [​IMG].
    Решение. Можно было попробовать решить задачу в лоб, но намного проще будет добавить вспомогательные символы, которые впоследствии можно убрать. В нашем случае, добавим [​IMG] и [​IMG]

    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    _________________________
    [​IMG]
    [​IMG]
    [​IMG]
    ________________________
    [​IMG]
    [​IMG]
    [​IMG]
    ________________________
    [​IMG]
    [​IMG]
    [​IMG]
    ________________________
    [​IMG]
    [​IMG]
    [​IMG]

    Посмотрели, ужаснулись, а теперь давайте разбираться. Суть решения заключается в том, чтобы гонять нашу машину с одного конца в другой, при этом "запоминая" символ с одного конца и записывая его в другой конец, постепенно "сужая" расстояния между символами. Так в начале "границами" обрабатываемой строки были [​IMG] и [​IMG], а затем помеченные * символы. Построчно программу разбирать не будем - ограничимся объяснениями каждого состояния машины:
    [​IMG] - инициализирующее состояние и заодно в этом состоянии машина доходит до пустой ячейки ленты
    [​IMG] - в этом состоянии машина, можно сказать "копирует" символ ячейки. Как это происходит - поймем из анализа следующих состояний.
    [​IMG] и [​IMG] - в этих состояниях машина идет до начала ленты или до первого помеченного символа. Причем в состоянии [​IMG] машина "держит в памяти" символ [​IMG], а [​IMG] - [​IMG]
    [​IMG] и [​IMG] - в этих состояниях машина записывает в ячейку "скопированное значение", а также "копирует" символ из этой ячейки
    [​IMG] и [​IMG] - аналогичны состояниям [​IMG] и [​IMG], только при этом машина двигается в другую сторону.
    [​IMG] и [​IMG] - аналогичны состояниям [​IMG] и [​IMG], с тем отличием, что включают состояние [​IMG], чтобы начать новый цикл обработки строки.
    Состояния [​IMG], [​IMG], [​IMG], [​IMG] и [​IMG] имеют "выход" в состояние [​IMG] из образовавшегося цикла в случае, если машина пометила все символы.
    [​IMG] - вспомогательное состояние, возвращающее головку машины на начало ленты.
    [​IMG] - в этом состоянии машина снимает ранее поставленные метки.
    Как видите, все довольно просто. Предлагаю читателям самостоятельно на листочке или на компьютере в блокноте проверить работоспособность программы. Если программа оказалась неработоспособна, то, пожалуйста, напишите в этой теме контрпример - вероятно я опечатался, когда перепечатывал со своего листочка решение или (всякое бывает) при написании программы.
    В качестве самостоятельного задания, предлагаю читателям придумать альтернативный алгоритм для решения этой задачи, а лучше более оптимальный. Оптимальным будем считать тот, в котором вам удастся довольно сильно сократить количество команд в программе или сократить количество используемых состояний машины (хотя бы на 3).

    Еще одно самостоятельное задание (решение которого я выложу через две недели). Алфавит унарный (т.е. состоит из одного символа, например "|"). Преобразуйте с помощью машины Тьюринга входное унарное число в двоичное. Пример: [​IMG].

    Все решения и замечания можно выложить в этой теме или мне в личные сообщения :agree:
  3. BA3a

    BA3a for love and rock-n-roll VIP

    Задачи об остановке разных машин на разных лентах даёшь!
  4. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    BA3a, ок, будет :D
  5. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    Добавил новый пример и задание для самостоятельного решения
  6. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    Поправил пример перевода унарных чисел в двоичные. Обратите внимание, что [​IMG]!
  7. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    Как-то пассивненько. Может еще один-два примера разобрать?
  8. BA3a

    BA3a for love and rock-n-roll VIP

    Silver MC's, ну могу я поразгадывать, но это же нечестно будет. А в целом — если б не курс Вольфенгагена, этот курс был бы моим любимым за всё время обучения.
  9. Silver MC's

    Silver MC's ┬┴┬┴┤(・_├┬┴┬┴

    BA3a, ну ты решение сначала мне в личку скинь) я то знаю, что ты могешь, но все равно интересно твое решение) если никто не подтянется - опубликуем твое и одно из моих (я уже два придумал). Ну и потом дам что-нибудь полегче :D

    Кстати, может никто не выкладывает, потому что даже идей как решать нету? Задавайте тогда вопросы, высказывайте свои мысли по поводу решения - это тоже ведь очень важно и интересно :) будем смотреть, рассуждать, спорить B)
Модераторы: onyx

Поделиться этой страницей