Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы вокруг нас.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
13.11 Mб
Скачать

§ 2. Машины Тьюринга

Английский математик А. Тьюринг в 1937 г. опубли­ковал работу, в которой он уточнял понятие алгоритма, прибегая к воображаемой вычислительной машине, извест­ной теперь под названием машины Тьюринга. Идея А. Тью­ринга возникла еще до появления электронных вычисли­тельных машин и потому, по-видимому, совершенно не зависит от них.

А. Тьюринг решил, что особого внимания заслуживает поведение исполнителя алгоритма, поэтому его нужно осо­бенно точно и ясно описать. Из первой главы мы помним, что исполнитель должен действовать совершенно механи­чески, не вкладывая в свою работу никакой инициативы.

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

Итак, машина должна перерабатывать какие-то объек­ты в искомые результаты. Наиболее простыми объектами являются строки, составленные из символов. Символы, из которых образуют строки, называют в теории алгорит­мов буквами. Значение этого слова отличается от общепри­нятого. Мы знаем, что только некоторые символы называют буквами. Именно символы, служащие для записи слов естественного языка (читатель знает русские буквы, латин­ские буквы, греческие буквы). Кроме таких символов, из­вестны еще символы, применяемые для записи чисел; их называют цифрами. Наконец, читателю известны многие знаки, которые в обиходе не называют ни буквами, ни циф­рами. Таковы знаки препинания, знаки математических действий и т. п. В теории алгоритмов любые неделимые и не изменяющие своего вида знаки называют буквами.

Строки букв в теории алгоритмов называют словами. Этот термин по своему смыслу тоже отличен от общепри­нятого. Например, строку букв «аАлбмв» не считают сло­вом. В теории алгоритмов это — слово. Точно так же сло­вом является строка букв (знаков) .6;+ М— !?

В жизни принято считать словами строчки букв, явля­ющиеся словами языка, в частности, наделенные смыслом. В теории алгоритмов понятие слова не связывают с нали­чием в нем смысла. Это не значит, что слова должны быть бессмысленными. Они могут иметь смысл и даже обычно имеют какой-то смысл. Но термин «слово» означает лишь структуру объекта, построенного из символов-букв: это строка букв. Чем же обусловлен выбор слов в качестве объектов для применения к ним машин? Для их записи можно ограничиться наиболее простым техническим уст­ройством — бумажной (или магнитной, или какой-нибудь другой) лентой. Ленту будем считать бесконечной в обе стороны и разбитой на клетки равной величины. В каждой клетке может быть записана в точности одна буква. Для удобства можно считать, что пустота клетки означает на­личие в ней «пустой буквы». Обозначим пустую букву значком йо. Кроме этой буквы для данной машины долж­ны быть допустимы еще какие-то (уже не пустые) буквы. Допустим, что таких разных между собой букв еще п. Обозначим их а1, а2, ..., ап.

Итак, мы имеем алфавит а0, а1, а2, ..., ап букв, которые могут быть записаны на ленте. Этот алфавит называют внешним алфавитом машины Тьюринга.

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

Для того чтобы читать написанное на ленту или писать что-либо на ней, машина Тьюринга имеет головку чтения-записи. При этом считают, что головка может за один прием прочитать только одну букву, написанную в той клетке ленты, которая расположена под головкой. Чтение буквы не изменяет того, что написано в клетке. Головка записывать может за один прием тоже только одну букву в той клетке ленты, которая стоит под головкой. При этом она сперва стирает прежнюю букву, а затем на ее месте записывает новую (может быть, в частности, одина­ковую с прежней).

Наконец, основной частью машины является логиче­ский блок. На этом блоке имеется кнопка, при нажиме которой он принимает исходное (для работы) состояние и начинает работать. Кнопка при этом остается утопленной до тех пор, пока машина не остановится сама. Тогда она «выскакивает», и машину можно использовать для новой работы. Одновременно с «выскакиванием» кнопки машина подает достаточно громкий и не очень продолжительный сигнал.

Работает логический блок следующим образом.

1) Он заставляет головку прочитать букву, которая стоит на ленте под нею.

2) В зависимости от прочитанной буквы и того состоя­ния, в котором находится он сам, а) заставляет головку записать на ленте в той клетке, которая находится под го­ловкой, некоторую букву; б) заставляет лентопротяжный механизм передвинуть ленту вправо, влево или остаться на месте, опять-таки в зависимости от прочитанной буквы и своего состояния; в) изменяет свое собственное состояние.

3) Если в результате действий, указанных в п. 2, буква, расположенная под головкой, положение ленты и состоя­ние логического блока машины окажутся теми же, которые были непосредственно перед выполнением этих действий, машина останавливается. В остальных случаях логиче­ский блок возвращается к выполнению п. 1.

Логический блок способен находиться в каждый момент в- .одном из определенных состояний. Обозначим его воз­можные состояния символами р1, р2, ..., рт. Последова­тельность этих символов называют внутренним алфавитом (состояний) машины.

Введем еще обозначения d-1, d0, d1 соответственно для обозначения движения ленты влево, стояния ленты на месте и движения ленты вправо. Теперь можно описать поведение машины при выполнении логическим блоком п. 2 так: если головка читает букву ai и блок находится в состоянии pj, то поведение машины определяет запись axdypz, означающую: «записать на ленте вместо ai букву аx, совершить перемещение ленты dy, логическому блоку перейти в состояние pz».

Очевидно, различные машины Тьюринга отличаются друг от друга тем, как они реагируют на сочетания аi, рj -для разных i и j. Наиболее компактно можно представить все случаи сочетаний аi, pj и все виды реакций машины на них, если составить так называемую функциональную таблицу с двумя входами, в клетках которой стоят тройки символов вида axdypz.

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

Таблица 1

Функциональная таблица

p1

p2

pj

pm

a0

a1

.

.

.

ai

axdypz

.

.

.

an

Если записать на ленте машины Тьюринга некоторое слово в алфавите А (внешнем), составленное из букв а1, а2, ..., ап, и установить начальную букву этого слова под читающей головкой, или оставить ленту пустой (т. е. установить пустое слово), а затем нажать пусковую кноп­ку, машина начнет действовать. При этом возможны два случая: 1) работа машины после конечного числа шагов прекратится с выдачей сигнала; 2) машина никогда не остановится; никакого результата она не даст. В первом случае говорят, что машина применима к исходному дан­ному, во втором случае — что она к исходному данному неприменима.

Если машина применима к исходному данному, то она приводит к результату: а) пустому слову, если под го­ловкой находится буква а0; б) слову из букв а1, а2, ..., ап, ограниченному с двух сторон пустыми буквами, если одна из букв (непустая) этого слова находится под го­ловкой.

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

Если для функции f(x) имеется машина, реализующая ее, то говорят, что f(x) вычислима по Тьюрингу. Функцию, для вычисления которой существует алгоритм, называют вычислимой. Тьюринг высказал предположение (мы будем его называть основным тезисом Тьюринга), что любая вы­числимая функция вычислима по Тьюрингу. Другими сло­вами: для любой вычислимой функции можно построить машину Тьюринга, реализующую ее.

Для примера опишем машину Тьюринга, которая вы­числяет функцию λ(х)=х+1, уже знакомую нам из пре­дыдущего параграфа (это одна из базисных рекурсивных функций). Эта функция имеет определенные значения только для целых неотрицательных значений х. Условимся значения х записывать на ленте машины в виде строки, состоящей из букв | (палочек). Кроме этих букв, нам нужна еще одна (пустая) буква. Обозначим ее знаком □ (на ленте она будет изображаться пустой клеткой). Число нуль будем изображать «пустой» строкой палочек.

Записав значение х (если оно не является нулем) в виде строки палочек на ленте машины и расположив ленту так, чтобы самая левая палочка была под головкой чтения-записи, пустим машину (нажимом кнопки).

Логический блок в начальный момент примет состоя­ние р1 Нужно чтобы он, если головка прочитает букву |, заставил ее снова записать эту же букву, ленту — продви­нуться влево, а сам перешел снова в первое состояние (т. е. сохранил его). Если же головка прочитает букву □, а логический блок при этом будет находиться в состоянии Pi, то он должен заста­вить головку написать |, ленту — остаться на месте, а сам перейти в состоя­ние р2.

Находясь в этом состоя­нии, он при чтении голов­кой буквы | должен застав­лять ее опять писать букву |, ленту — стоять на месте, а сам сохранять свое со­стояние р2. Мы видим, что при этом машина остановится и подаст сигнал. Какое бы число мы ни записали на ленте, машина Тьюрин­га, двигая ленту влево, просмотрит все палочки, потом про­двинет ленту еще на один шаг, припишет к числу еще одну палочку и остановится. Функциональная таблица машины Тьюринга, вычисляющей значения функции λ(х), представлена в табл. 2.

Таблица 2

Описание работы машины Тьюринга, реализующей функцию λ(х)

p1

p2

| d0p2

|

| d-1p1

| d0p2

В пустой клетке таблицы можно записать что угодно, потому что ее содержимое не влияет на работу машины. Из этой таблицы видно, что машина будет давать правиль­ный результат и при х=0. При этом под головкой машины нужно установить клетку с буквой □ (а на ленте не должно быть ни одной буквы |). После пуска машины она запи­шет вместо этой буквы букву | и остановится.

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

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

Основной тезис Тьюринга является аналогом уже зна­комого нам тезиса Черча. Может показаться, что машины Тьюринга приводят к более широкому понятию вычисли­мости, чем рекурсивные функции. Но это не так, потому что буквы любого алфавита можно закодировать с по­мощью двух символов 1 и 2 (метод такого кодирования описан в § 2 гл. 5) и тем самым установить соответствие между преобразованиями слов, осуществляемыми маши­нами Тьюринга, и некоторыми неотрицательными цело­численными функциями неотрицательных целочисленных аргументов.