Машина Тьюринга (англ. Turing machine) — модель абстрактного вычислителя, предложенная британским математиком Аланом Тьюрингом в 1936 году. Эта модель позволила Тьюрингу доказать два утверждения. Первое — проблема останова неразрешима, т.е. не существует такой машины Тьюринга, которая способна определить, что другая произвольная машина Тьюринга на её ленте зациклится или прекратит работу. Второе — не существует такой машины Тьюринга, которая способна определить, что другая произвольная машина Тьюринга на её ленте когда-нибудь напечатает заданный символ. В этом же году был высказан тезис Чёрча-Тьюринга, который терминах теории рекурсии формулируется как точное описание интуитивного понятия вычислимости классом общерекурсивных функций. В этой формулировке часто упоминается как просто тезис Чёрча. В терминах вычислимости по Тьюрингу тезис гласит, что для любой алгоритмически вычислимой функции существует вычисляющая её значения машина Тьюринга. В виду того, что классы частично вычислимых по Тьюрингу и частично рекурсивных функций совпадают, утверждение объединяют в единый тезис Чёрча — Тьюринга.
Неформально машина Тьюринга определяется как устройство, состоящее из двух частей:
При запуске машины Тьюринга на ленте написано входное слово, причём на первом символе этого слова находится головка, а слева и справа от него записаны пустые символы. Каждый шаг головка может перезаписать символ под лентой и сместиться на одну ячейку, если автомат приходит в допускающее или отвергающее состояние, то работа машины Тьюринга завершается.
Определение [ править ]
Определение машины [ править ]
Отметим, что существуют различные вариации данного выше определения (например, без отвергающего состояния или с множеством допускающих состояний), которые не влияют на вычислительные способности машины Тьюринга.
Определение процесса работы [ править ]
Особо следует рассмотреть случай переходов по пробельному символу:
Для машины Тьюринга, которая пишет символ [math]B[/math] на ленту также можно дать аналогичное формальное определение. Оно будет отличаться тем, что символы в строчках конфигурации могут содержать пробелы, и для того, чтобы эти строчки имекли конечную длину, нужно аккуратно учесть наличие пробелов при записи правил перехода.
Результат работы [ править ]
Примеры машин-распознавателей и машин-преобразователей будут даны ниже.
Примеры машин Тьюринга [ править ]
Прибавление единицы [ править ]
Для начала приведём пример машины-преобразователя, которая прибавляет единицу к числу, записанному на ленте в двоичной записи от младшего бита к старшему. Алгоритм следующий:
[math]0[/math]
[math]1[/math]
[math]B[/math]
[math]S[/math]
[math]\langle R, 1, \downarrow \rangle[/math]
[math]\langle S, 0, \rightarrow \rangle[/math]
[math]\langle R, B, \leftarrow \rangle[/math]
[math]R[/math]
[math]\langle R, 0, \leftarrow \rangle[/math]
[math]\langle R, 1, \leftarrow \rangle[/math]
[math]\langle Y, B, \rightarrow \rangle[/math]
Проверка того, является ли слово палиндромом [ править ]
[math]0[/math]
[math]1[/math]
[math]B[/math]
[math]S[/math]
[math]\langle F_0, B, \rightarrow \rangle[/math]
[math]\langle F_1, B, \rightarrow \rangle[/math]
[math]\langle Y, B, \downarrow \rangle[/math]
[math]F_0[/math]
[math]\langle F_0, 0, \rightarrow \rangle[/math]
[math]\langle F_0, 1, \rightarrow \rangle[/math]
[math]\langle B_0, B, \leftarrow \rangle[/math]
[math]F_1[/math]
[math]\langle F_1, 0, \rightarrow \rangle[/math]
[math]\langle F_1, 1, \rightarrow \rangle[/math]
[math]\langle B_1, B, \leftarrow \rangle[/math]
[math]B_0[/math]
[math]\langle R, B, \leftarrow \rangle[/math]
[math]\langle N, 1, \downarrow \rangle[/math]
[math]\langle Y, B, \downarrow \rangle[/math]
[math]B_1[/math]
[math]\langle N, 0, \downarrow \rangle[/math]
[math]\langle R, B, \leftarrow \rangle[/math]
[math]\langle Y, B, \downarrow \rangle[/math]
[math]R[/math]
[math]\langle R, 0, \leftarrow \rangle[/math]
[math]\langle R, 1, \leftarrow \rangle[/math]
[math]\langle S, B, \rightarrow \rangle[/math]
Варианты машины Тьюринга [ править ]
В этом разделе приведены различные варианты машин Тьюринга, которые не отличаются от обычных машин Тьюринга по вычислительной мощности.
Многодорожечная машина Тьюринга [ править ]
Машина Тьюринга с полубесконечной лентой [ править ]
Заменив у машины Тьюринга бесконечную в обе стороны ленту на бесконечную в одну сторону, мы не теряем в вычислительной мощности. По произвольной машине Тьюринга строится двухдорожечная машина с полубесконечной лентой.
Существует алгоритм, по которому для любой машины Тьюринга может быть построена эквивалентная машина Тьюринга с объявленным свойством. Сначала занумеруем ячейки рабочей ленты машины Тьюринга с бесконечной лентой следующим образом:
Затем перенумеруем ячейки, и запишем символ [math]c \in \Pi \setminus \Sigma, B[/math] в начало ленты, который будет означать границу рабочей зоны:
Начальное состояние новой машины Тьюринга устанавливается в одной или другой зоне в зависимости от того, в какой части исходной ленты располагалась головка считывания-записи в исходной конфигурации.
[math]\triangleleft[/math]
Многоленточная машина Тьюринга [ править ]
Многоленточная машина с [math]n[/math] дорожками эмулируется многодорожечной машиной с [math]2n[/math] дорожками следующим образом: каждая нечётная дорожка соответствует ленте исходной машины, а на каждой чётной дорожке отмечены специальным символом [math]*[/math] позиция головки на ленте выше (считаем, что ленты нумеруются сверху вниз).
Каждый шаг исходной машины эмулируется конечной последовательностью шагов построенной машины следующим образом: исходно головка находится в позиции самой левой отметки и идёт вправо до самой правой отметки, запоминая прочитанные около символов [math]*[/math] символы в состоянии. Пройдя до самой правой отметки, головка возвращается влево, совершая необходимые действия (переписывая символы около отметок и передвигая сами отметки). После такого прохода головка переходит в следующее состояние, завершая эмуляцию шага.
Аланом Тьюрингом было сформулировано следующее утверждение:
Утверждение (Тезис Чёрча-Тьюринга):
Иными словами, тезис говорит о том, что любой алгоритм можно запрограммировать на машине Тьюринга.
Универсальная машина Тьюринга [ править ]
Существует машина Тьюринга, которая принимает на вход закодированное описание произвольной машины и входную строку и эмулирует работу закодированной машины на заданном входном слове. Иными словами, универсальный язык перечислим с помощью машины Тьюринга. Ссылки на явные конструкции универсальных машин Тьюринга приведены ниже.
Программирование нуждается в новых универсальных алгоритмических моделях, а аппаратные средства реализуют алгоритмы не только в другой форме, но и на базе другой алгоритмической модели — автоматной. Заимствование технологии из сферы разработки аппаратных средств ключевая идея автоматного программирования. Однако синтез цифровых устройств отличается от программирования. Но, заимствуя модель, с одной стороны, ее не желательно существенно изменять, а, с другой стороны, нельзя не учитывать уже существующую теорию и практику программирования.
Далее мы рассмотрим SWITCH-технологию проектирования автоматных программ, в которой с подобными процессами сталкиваешься сплошь и рядом. С одной стороны, она так изменила модель конечного автомата, что фактически вывела ее за рамки теории автоматов. А, с другой стороны, вводит в программирование понятия, которые с трудом воспринимаются программистами, а, порой, просто являются лишними, т.к. существуют более привычные аналоги из теории программ и практики программирования.
За основу обсуждения проблем автоматного программирования возьмем недавнюю лекцию Шалыто А.А. [1] и его «программные» статьи к определению парадигмы автоматного программирования [2, 3].
1. Автоматизированные объекты, схемы программ
В лекции достижением автоматного программирования объявлено введение в него понятия автоматизированных объектов управления, заимствованное из теории автоматического управления (ТАУ). Но, напомним, что в ТАУ рассматривают не столько объекты, а системы, среди которых выделяют следующие [4]:
Исходя из этого, правильнее было бы говорить о системах автоматического управления (САУ). Теперь посмотрим на типовую функциональную схему САУ, показанную рис. 1. Если ленту машины Тьюринга считать объектом управления, то исполнительными устройствами (ИсУ) будут элементы МТ, реализующие изменение содержимого ленты и передвигающие головку, а измерительными устройствами (ИзУ) — элементы, читающие информацию с ленты.
Рис.1. Функциональная схема САУ
Но зачем обращаться к ТАУ, если есть более близкая к программированию практика проектирования вычислительных систем, в которой операционные устройства (ОУ), к которым, безусловно, относится и МТ, рассматриваются в виде комбинации операционного (ОА) и управляющего (УА) автоматов. И это ближе к тому, к чему мы в конечном итоге стремимся — обоснованию мощности автоматного программирования. На рис. 2 представлен скрин текста из монографии Майорова С.А., Новикова Г.И. Структура электронных вычислительных машин [5], в которой вопросы проектирования ОУ рассмотрены весьма детально.
Рис.2. Концепция управляющего и операционного автоматов
Но, если сравнивать теорию проектирования ЭВМ и теорию программ, то между ними прослеживается явная структурная аналогия. В теории программирования модель любой программы на структурном уровне можно представить, как схему программы S = (M, A, C), где M – множество элементов памяти, A – множество операторов, C – управление [10]. Следуя этому подходу, любую программу машины Тьюринга также можно определить как схему программы, в которой множество M представлено ячейками ленты, множество операторов – действиями МТ, связанными 1) с анализом ячеек, 2) изменением символов в ячейках ленты и 3) перемещением головки.
Таким образом понятие схемы программы полностью аналогично рассмотренной концепции операционного и управляющего автоматов, где моделью УА является модель рассматриваемого далее структурного конечного автомата (СКА), а ОА «является структурой для выполнения действий над информацией». При этом ОА включает элементы хранения данных (выше – это память) и блоки для обработки информации, реализующих вычисление логических условий и реализацию тех или иных действий (выше – множество операторов).
Из сказанного можно понять, что лента лишь условно может считаться объектом управления для МТ. Хотя бы потому, что устройство управления машины Тьюринга не имеет к ней прямого доступа, т.к. все операции с ячейками реализуют опосредован-но блоки ОА. Кроме того, как представляется, не очень привычно или, если не сказать, странно считать целью управления программы, как системы управления, объект, представляющий собой память (ленту). Таким образом, для формального определения машины Тьюринга, а в ее контексте места для модели конечного автомата, достаточно понятий теории программ. Теперь, в отличие от весьма расплывчатого определения автоматных программ, данного в рамках SWITCH-технологии, можно сказать, что автоматной программой считается программа, имеющая управление в форме модели конечного автомата.
Какая при этом будет сама программа – с простым или сложным поведением, какова ее «разновидность» – с логическим управлением, «с явным выделением состояний» и т.д. и т.п. не имеет абсолютно значения. Главное – вид управления. Остальные же элементы программы могут определяться в широких пределах – от простейших, как, например, у машины Тьюринга, до самых сложных – любых форм операторов, функций и структур данных языков программирования – ассемблера, языка высокого уровня и т.п.
Можно также вспомнить, что машину Тьюринга уже давно принято считать авто-матом [6] или уж, в крайнем случае, его простым расширением [7]. Но необходимо понимать, что это за автомат, что это за расширение, и эквивалентны ли они моделям классических конечных автоматов. Попробуем это как раз и уточнить.
2. Тьюрингово программирование в среде автоматного программирования
На рис. 3 показан автомат для МТ функции инкремента из монографии [8]. По форме это явно не программа для МТ, но уже и не классический конечный автомат. На рис. 4 приведен граф классического структурного конечного автомата (СКА) и его реализация в среде ВКПа (среда визуально-компонентного автоматного программирования на языке С++ в рамках библиотеки Qt и среды Qt Creator), реализующего тот же самый алгоритм блока управления (БУ) МТ.
Рис.3. Увеличение числа на единицу с помощью машины Тьюринга
Рис.4 Модель программы инкремента для МТ в форме СКА
Можно видеть, что структурный автомат имеет четыре входных и пять выходных каналов. Каждый из этих каналов связан с одноименной ему программной функцией – предикатом или действием. Здесь предикаты – функции без параметров, возвращающие булевское значение в зависимости от значения обозреваемой ими ячейки ленты, а действия – функции без параметров, выполняющие то или иной действие по изменению ячейки ленты и передвижению головки машины Тьюринга.
Данный СКА имеет то же множество состояний, что и автомат на рис.3. При этом кроме собственно автоматного отображения, представленного СКА, он реализует еще два отображения – отображение множества предикатов (x1, …, xM) на множество одноименных входных каналов автомата, и множество выходных каналов автомата на множество одноименных действий – y1, …, yN. Например, предикат x3 вернет значение true (значение 1 для одноименного входного сигнала), если в текущей ячейке будет символ 1, а действие y4, которое будет запущено, когда одноименный выходной сигнал автомата примет значение 1, будет соответствовать перемещение головки влево (L) и т.д. и т.п.
Обратим внимание, что СКА не управляет напрямую лентой, а реализует [дополнительные] отображения, связывая сигналы автомата с функциями, определяющими множество операций машины Тьюринга. Это еще раз убеждает, что нет необходимости вводить понятие автоматизированного объекта управления в ситуации, когда достаточно «старомодного», но математически строго понятия отображение.
Сравнивая автоматы на рис. 3 и рис. 4, можно видеть, что СКА не использует команду «*» (см. рис. 1). В подобной ситуации ему достаточно не выдавать сигнал, связанный с данной командой. Кроме того, два и более сигналов (как входных, так и выходных) на одном переходе параллельны. Поэтому, когда возникает конфликт доступа к общим объектам (например, необходимо изменить ячейку и переместить головку) используется соглашение: действия на одном переходе исполняются последовательно в порядке следования их номеров, т.е. действие с большим номером выполняется после действия с меньшим номером. Это соглашение не распространяется на предикаты, т.к. они не изменяют ленту. Так мы делаем автомат более компактным и наглядным (не на-до вводить промежуточные состояния).
В процессе тестирования программы инкремента были выявлены ситуации, когда в процессе работы МТ могут возникнуть проблемы. Во-первых, реальная лента не бесконечна и выход за ее пределы может вызвать «крах» программы. Во-вторых, нужно обязательно указывать начальное положение головки. Без этого, если, например, число находится в произвольном месте ленты, а начальное состояние головки слева от числа и напротив пробела, то головка сразу начнет движение влево. Далее она может выйти за границы ленты, вызвав «крах» программы, или, переместившись, на шаг влево запишет в ячейку 1 и, зависнув, завершит «успешно» работу. Или, если число содержит во всех разрядах 1 и записано с начала ленты, то заключительная попытка переноса 1 в старший разряд вызовет тот же самый «крах».
2.1. Объектная реализация МТ на языке С++
Рассмотрим объектную программную реализацию машины Тьюринга на языке C++ в среде ВКПа, реализующую любую программу для МТ, в том числе и программу вычисления инкремента.
С этой целью создан базовый класс, представляющий любую машину Тьюринга, который и наследуют программные объекты, реализующие ту или иную программу МТ. Данный базовый представлен на листинге 1, а программа, реализующая задачу инкремента, на листинге 2.
Листинг 1. Программная реализация базового класса МТ
Листинг 2. Программа инкремента для машины Тьюринга
2.2. Примеры программ для МТ с реализацией на С++
Рассмотрим пример программы для МТ, которая «выступает как акцептор языка, т.е. она может распознавать язык» из [9]. Ее функция переходов представлена на рис. 5, а эквивалентный ей автомат в форме СКА на рис. 6.
Рис. 5. Функция переходов машины Тьюринга, распознающая язык
Рис. 6. Граф СКА машины Тьюринга, распознающей язык
Блок управления МТ в форме СКА имеет 6 входных и 7 выходных каналов. Про-грамма акцептора включает также соответствующее им число предикатов и действий, которые представлены на рисунке справа от графа автомата. Реализация программы на С++ в среде ВКПа представлена на листинге 3.
Листинг 3. Программа для машины Тьюринга, распознающей язык
На листинге 3 действие y18 представляет вариант программы для МТ в соответствии с подходом SWITCH-технологии. В рамках реализации автоматного программирования среды ВКПа в этом случае вместо автомата на рис. 6 необходимо будет реализовать автомат с одним состоянием, который выдает в цикле сигнал y18. Ему соответствует закомментированная строка таблицы переходов на листинге 3. Для работы автомата по типу SWICH необходимо снять комментарий с данной строки, а остальные строки закомментировать.
Рассмотрим еще один пример программы для машины Тьюринга из [7], где МТ определяется, как «весьма простое расширение модели конечного автомата». В этом случае программа для машины Тьюринга представляет собой конечный список пятерок частично-определенной функции переходов и выходов δ: S×XS×X×Г.
Программа для МТ, находящая наибольший общий делитель (НОД) двух чисел, показана на рис. 7. Эквивалентный ей граф СКА представлен на рис. 8. Заметим, что и здесь не используются команда перезаписи символов. Реализация на С++ представлен листингом 4.
Рис. 7. Граф переходов машины Тьюринга, вычисляющей НОД двух чисел, и несколько ее конфигураций при обработке пары чисел
Рис. 8. Граф СКА, эквивалентный графу на рис. 7
Листинг 4. Программа для машины Тьюринга нахождения НОД двух чисел
В заключение еще одна программа для МТ от разработчиков SWITH-технологии, рассмотренная в статье [11], где приведена задача распознавание скобок в двух варианта. Один в форме автомата Мили, второй – смешанный автомат (соответственно на рис. 9 и рис. 11). Соответствующие им структурные автоматы приведены на рис. 10 и рис. 12. Реализацию программы на С++ демонстрирует листинг 5.
Рис. 9. Распознавание скобок произвольной глубины. Граф переходов Мили
Рис. 10. Распознавание скобок произвольной глубины. Граф СКА Мили
Рис. 11. Распознавание скобок произвольной глубины. Граф переходов смешанного автомата
Листинг 5. Программа для машины Тьюринга распознавания вложенности скобок
Поскольку автомат на рис. 12 отказался работать, то было решено перейти к автомату на рис. 9. Эквивалентный ему автомат в форме СКА, показан на рис. 10. Правда, формально это тоже смешанный автомат, у которого от первой реализации (рис. 12) был оставлен сигнал при состоянии «0» и сигнал y15 при состоянии «1». Первый необходим при начальной установке, а сигнал y15 реализует смещение головки вправо в целях чтения очередного символа ленты. В остальном СКА соответствует автомату Мили на рис. 9.
После того, как автомат на рис. 10 был успешно протестирован, вернулись к автомату на рис. 11. И стало понятно, что у него лишним является сигнал z1_1 при состоянии «1»(у автомата на рис. 12 это сигнал y2). Проблема в том, что он, обнаружив «левую скобку», наращивает счетчик на две единица, а при обнаружении «левой скобки» не изменяет его совсем. Так, при обнаружении «левой скобки» он вызывается дважды – один раз на петле,, помеченной x2/y2, а второй раз при входе в состояние. А при обнаружении «правой скобки» счетчик сначала на петле уменьшается, а затем при входе в состояние увеличивается.
Причина такой работы управления МТ, в неверной трактовке авторами функционирования автомата типа Мура. Видимо, они полагают, что сигнал при состоянии у автомата Мура исполняется только при входе в это состояние (см. переход из состояния «0» в «1»), а на самом деле он выдается всякий раз при входе в это состояние. В том числе и при переходе по петле. Таким образом, мы имеет дело не с ошибкой (кто не ошибался?), а с более серьезной проблемой — неверной трактовкой в рамках SWITH-технологии функционирования автоматов типа Мура. Тестирование эквивалентной модели это и показало.
Подводя итог, можно сказать, что нет формальных отличий тьюрингового программирования от автоматного, т.к. машина Тьюринга – это абстрактная модель автоматных программ. Просто в последнем случае используется более широкий набор операторов и структур данных (памяти). Теперь можно уверенно ответить и на вопрос, чем отличается машина Поста, как модель обычных программ, от машины Тьюринга — модели автоматных программ. Моделью управления и лишь только ею, т.к. остальное – память и операторы могут быть одними и теми же. Следовательно, обычное программирование отличается от программирования автоматного только одним – моделью управления. Таким образом, пока для реализации автоматов используются обычные операторы управления типа switch и им подобные нельзя, строго говоря, такое программирование считать автоматным. Это может быть имитация автоматов с утратой их определенных свойств и не более того.
Итак, давая определение понятий автоматной программы и автоматного программирования, говорить надо не об «автоматизированных объектах управления», а о программах и только программах, имеющих управление в форме классического конечного автомата. И еще интересный факт, на который хотелось бы обратить внимание. В начале 2000-х годов, авторы озвучили свое понимание автоматного программирования на широкую аудиторию. Их статьи по поводу абстрактных машин были напечатаны в журнале «Мир ПК» №2 за 2002 г. [11, 12, 13]. Можно утверждать, что годы на убеждения сторон не повлияли. Хотя, возможно, это отражает только степень их уверенности в выбранных решениях.
Например, в «новую лекцию по автоматному программированию» Шалыто А.А. по сравнению с предыдущей «лекцией со слайдами» (десятилетней давности) добавлено лишь видео примера на базе «автоматного пакета» Stateflow. Казалось бы, это подтверждает правоту идей Шалыто А.А., т.к. то, что не удалось реализовать в рамках UniMod (проект, похоже, «заморожен»), воплотили разработчики Stateflow. И, наверное, не так уж важно кто это сделал…
Однако, на момент публикации упомянутых статей авторам SWITCH-технологии уже была известна критика в ее адрес. Это не было тайной, т.к. с ней можно было ознакомиться на сайте SoftCraft [14]. На нем же были созданы разделы, посвященные автоматному программированию вообще и SWITH-технологии и КА-технологии в частности. Позиции авторов обсуждались на форуме сайта (он был на тот момент открыт). Но все так и остались при своем мнении.
Итоги на текущий момент таковы. Критика, высказанная в отношении SWITH-технологии когда-то давно, актуальна и на текущий момент. Она же относится и к пакету Stateflow. В SWITH-технологии как не было, так и нет четкого определения автоматного программирования, не изменился подход к реализации автоматов, сама модель не является классической, нет модели параллельных вычислений и т.д. и т.п. Без устранения этих проблем подобное автоматное программирование в лучшем случае претендует на достаточно ограниченную роль.
Причины отмеченных выше проблем довольно ясны: игнорируется теория программ, забыта теория автоматов, хотя о самих автоматах и об их замечательных свойствах сказано много хороших и правильных слов. Но по факту это другие автоматы. Автор убежден в сомнительности непродуманных попыток создавать оригинальные модели. Речь о синхронных, реактивных и других моделях. Они могут быть удобны при решении узкого класса задач и не более того. Но серьезнее то, что они выпадают из теории автоматов, не имея при этом собственной теории. А модель вне теории беспомощна, а потому фактически бессмысленна.