Универсальная машина Тьюринга
Я еще не затрагивал понятия универсальной машины Тьюринга. Лежащий в ее основе принцип понять нетрудно, хотя детали могут быть сложны. Основная идея состоит в том, чтобы закодировать команды для произвольной машины Тьюринга Т в виде последовательности нулей и единиц, которую можно записать на ленте. Эта запись используется как начальная часть входных данных для некоторой особой машины Тьюринга U, называемой универсальной, которая затем обрабатывает остальную часть ленты в точности так, как это сделала бы машина Т. Универсальная машина Тьюринга — это универсальный имитатор. Начальная часть ленты дает универсальной машине U всю информацию, необходимую для точной имитации любой машины Т!
Чтобы показать, как это может быть реализовано, нам потребуется какая-нибудь система нумерации машин Тьюринга. Рассмотрим список инструкций, определяющих произвольную машину Тьюринга, например, одну из описанных выше. Мы должны в соответствии с некоторыми четкими правилами представить эти инструкции в виде последовательностей нулей и единиц. Это можно сделать, например, с помощью процедуры «сокращения», которую мы использовали ранее. Тогда, если мы закодируем символы R, L, STOP, «стрелка» (->) и «запятая», скажем, числами 2, 3, 4, 5 и 6 соответственно, то мы сможем записать их в виде «сокращений» 110, 1110, 11110, 111110 и 1111110.Цифры 0 и 1, кодируемые, соответственно, как 0 и 10, могут быть использованы для записи строк этих символов, входящих в таблицу действий машины Тьюринга. Нам не нужны различные обозначения для «жирных» цифр 0 и 1 и для остальных цифр в таблице, поскольку расположение «жирных» цифр в конце двоичного кода является достаточным отличительным признаком. При этом 1101, например, будет читаться как двоичное число 1101, представляемое на ленте последовательностью 1010010. Вчастности, 00 будет читаться как 00, что без всякой двусмысленности можно закодировать как 0 или вовсе опустить. Можно существенно сэкономить, если не кодировать «стрелки» и непосредственно предшествующие им символы, а воспользоваться цифровым упорядочением команд, позволяющим определить, какими должны быть эти символы. Правда, для этого надо убедиться в отсутствии «дырок» в получившемся порядке и добавить, где требуется, «немые» команды. (Например, машина Тьюринга XN + 1 не имеет команды, соответствующей коду 1100, поскольку такая комбинация в ходе ее работы никогда не встречается. Следовательно, мы должны ввести в список команд немую команду, скажем 1100 -> OOR, которая не вызовет каких бы то ни было изменений в работе машины. Сходным образом мы должны добавить немую команду 101 —> OOR в список команд машины XN x 2.) Без таких «немых» команд кодирование последующих команд было бы нарушено. Как можно видеть, на самом деле мы не нуждаемся и в запятой в конце каждой команды, поскольку символов L и R вполне достаточно для отделения команд друг от друга. Поэтому мы просто будем использовать такую систему кодирования:
В качестве примера выпишем команды для машины Тьюринга XN + 1 (с дополнительной немой командой 1100 -+ OOR). Опуская стрелки, цифры, непосредственно предшествующие им, и запятые, получим
Мы можем улучшить полученный результат, если опустим все 00 и заменим каждые 01 просто единицей в соответствии с тем, что говорилось ранее. Тогда мы получим строку символов
которая на ленте записывается как последовательность
Есть еще два способа немного сэкономить. Во-первых, всегда можно удалить код 110 в начале записи (вместе с бесконечным участком пустой ленты, предшествующим этому коду). Он обозначает последовательность OOR, соответствующую начальной команде 00 —> OOR, которую я до сих пор неявно считал общей для всех машин Тьюринга, поскольку она необходима для того, чтобы устройство, начав работу в произвольной точке слева от начала записи на ленте, могло перемещаться вправо до тех пор, пока не встретит первую непустую клетку. Во-вторых, точно так же всегда можно удалить код 110 (и неявную бесконечную последовательность нулей, которая, по предположению, следует за ним) в конце записи, поскольку этой кодовой последовательностью должно заканчиваться описание любой машины Тьюринга (во всех случаях список команд заканчивается командой R, L или STOP). Получающееся двоичное число — это номер машины Тьюринга, который для XN + 1 будет выглядеть так:
В обычной десятичной записи этот номер равен:
Иногда машину с номером п мы, не вполне точно, будем называть n-й машиной Тьюринга и обозначать ее Тп В этом случае XN + 1 становится
машиной Тьюринга!
Кажется поразительным факт, что нам надо пробежать так долго вдоль «списка» машин Тьюринга, чтобы найти машину, выполняющую такую тривиальную операцию, как прибавление единицы к натуральному числу (в расширенном двоичном представлении). (Я не думаю, что моя система кодирования была в целом настолько неэффективна, хотя в ней и есть еще возможности для незначительных улучшений.) В действительности, есть машины Тьюринга и с меньшими номерами, которые представляют интерес, например UN + 1 с двоичным номером
который в десятичной записи превращается всего лишь в 177 642. Значит, особенно тривиальная машина UN + 1, которая просто дописывает 1 единицу в конце последовательности единиц, является 177 642-й машиной Тьюринга. Интересно, что «умножение на два» в списке машин Тьюринга попадает где-то между этими двумя машинами, причем и в унарном, и в расширенном двоичном представлении: номер XN x 2 равен 10 389 728 107, а номер UN x 2 -1492 923 420 919 872 026 917 547 669.
Наверное, принимая во внимание величины этих номеров, уже не вызовет удивления тот факт, что абсолютное большинство натуральных чисел не соответствует ни одной рабочей машине Тьюринга. Приведем перечень первых тринадцати машин Тьюринга в соответствии с принятой нумерацией:
Из этих машин T0 просто перемещается вправо, стирая все, что ей попадается на пути, никогда не останавливаясь и не меняя направления движения. Машина Т1 выполняет в сущности ту же операцию, но более громоздким путем, отступая на шаг назад каждый раз, когда она стирает очередную единицу на ленте. Так же как и T0, машина T2двигается вправо, никогда не останавливаясь, но относится к ленте более «почтительно», попросту оставляя всю информацию нетронутой. Эти машины не могут использоваться в качестве машин Тьюринга, поскольку никогда не останавливаются. Т3, -- первая в этом списке «правильная» машина: она скромно прекращает действие после того, как изменяет первую (самую левую) единицу на нуль. t4 сталкивается с серьезной проблемой. Найдя первую единицу на ленте, она переходит во внутреннее состояние, которое нигде не описано, и, следовательно, машина не имеет никаких команд для следующего шага. С той же проблемой сталкиваются T8, Т9 и Т10. С T7 возникают трудности еще более фундаментального характера. Строка нулей и единиц, которой она представляется, включает последовательность из пяти единиц: 110111110.Интерпретации этой последовательности не существует, поэтому Т7 намертво застревает сразу же, как только доходит до первой единицы. (Я буду называть Т7, равно как и любую другую машину Тn, двоичное расширенное представлений которой содержит более четырех единиц, некорректно определенной.) Машины Т5, T6, и Т12 испытывают те же трудности, что и Т0, Т1, t2 они просто никогда не останавливаются. Все эти машины — T0, T1 Т2, Т5, Т6, Т7, Т8, Т9, Т10 и Т12 -совершенно бесполезные устройства! Только Т3 и Т11 являются функциональными машинами Тьюринга, да и то не слишком интересными. Причем Т11 даже скромнее, чем Т3: натолкнувшись на первую же единицу, она останавливается и вообще ничего не меняет!
Надо заметить, что наш перечень содержит избыточную информацию. Машина Т12 идентична T6, а по действиям обе они аналогичны Т0, поскольку ни T6, ни T12 никогда не переходят во внутреннее состояние 1. Но нам нет нужды волноваться из-за этой избыточности, равно как из-за изобилия неработоспособных (фиктивных) машин Тьюринга в нашем списке. На самом деле, мы могли бы изменить систему кодирования таким образом, чтобы избавиться рт большого числа бесполезных устройств и значительно уменьшить избыточность списка машин. Но все это можно сделать только ценой усложнения нашей примитивной универсальной машины Тьюринга, которая должна расшифровывать вводимую в нее запись и имитировать машину Тп, чей номер она считала. Это было бы оправдано, если бы было можно избавиться от всех бесполезных (и повторяющихся) машин. Но это, как мы увидим чуть позднее, невозможно! Поэтому мы оставим нашу систему кодирования без изменений.
Будет удобно интерпретировать ленту с последовательностью меток на ней, например
как двоичное представление некоторого числа. Вспомним, что нули простираются бесконечно в обе стороны, а вот количество единиц конечно. Кроме того, я буду полагать, что их число отлично от нуля (т. е. что в этой последовательности существует хотя бы одна единица). Мы можем тогда считывать конечную строку символов между первой и последней единицами (включительно) , которая в предыдущем случае имеет вид
как двоичное представление натурального числа (в десятичной форме это 441). Однако такая процедура даст нам только нечетные числа (их двоичное представление оканчивается на 1), тогда как нам нужна возможность представления всех натуральных чисел. Поэтому мы воспользуемся следующим несложным приемом — будем удалять последнюю единицу (которая принимается просто за маркер, обозначающий конец выражения) и считывать оставшуюся часть как двоичное число. Тогда в последнем примере получим двоичное число
которое соответствует десятичному числу 220. Эта процедура имеет то преимущество, что нуль также представляется непустой лентой, а именно:
Рассмотрим, как действует машина Тьюринга Тп на некоторую (конечную) строку нулей и единиц на ленте, которая подается в устройство справа. Удобно рассматривать эту строку как двоичное представление некоторого числа, например т, в соответствии с приведенной выше схемой. Предположим, что после определенного числа шагов машина Тп в конце концов останавливается (т. е. доходит до команды STOP). Строка двоичных цифр, которые машина выписала к этому моменту на левой части ленты, и будет искомым результатом вычислений. Считывая эту последовательность в соответствии с той же схемой так же как двоичное представление некоторого числа, получим новое число, скажем, р. Тогда мы можем записать соотношение, выражающее тот факт, что результатом действия n-й машины Тьюринга Тп на число m является число р, следующим образом:
Взглянем на это соотношение с несколько иной точки зрения. Мы будем считать, что это выражение описывает некоторую специфическую операцию, которая применяется к паре чисел пит для того, чтобы получить р. (Это означает: для заданных двух чисел тип мы можем найти значение р, если введем m в n-ю машину Тьюринга.) Эта специфическая операция является полностью алгоритмической. Поэтому она может быть выполнена одной конкретной машиной Тьюринга U; иными словами, U, совершая действие над парой (п, т), дает в результате р. Поскольку машина U должна производить операцию над обоими числами пит, чтобы получить ответ, выражаемый одним числом р, то нам нужно придумать способ для записи пары (n, m) на одной ленте. С этой целью предположим, что п записывается в стандартной двоичной форме и заканчивается последовательностью 111110.(Вспомним, что двоичный номер всякой корректно определенной машины Тьюринга, — это последовательность символов, состоящая только из сочетаний вида 0, 10, 110, 1110 и 11110,поэтому он нигде не содержит более четырех единиц подряд. Таким образом, если Т„ -- корректно определенная машина, то появление последовательности 111110действительно будет означать конец записи номера те.) Все, что следует за ней, должно быть просто записью числа то на ленте в соответствии с приведенными выше правилами (т. е. двоичное число m и строка 1000... непосредственно за ним). Таким образом, с этой второй частью ленты машина Тn и должна производить предполагаемые действия.
Если в качестве примера мы возьмем n = 11 и m = 6, то на ленте, вводимой в машину U, мы будем иметь последовательность
Она образована из следующих составляющих:
То, что машина Тьюринга U должна была бы делать на каждом очередном шагу процедуры, выполняемой Тn над m —
это исследовать структуру последовательности цифр в выражении п с тем, чтобы можно было произвести соответствующие изменения цифр числа m (т. е. «ленты» машины Тn). В принципе, реализация такой I машины не вызывает существенных затруд- I нений (хотя и довольно громоздка на практике). Список ее собственных команд должен был бы просто содержать правила для чтения подходящей команды из «списка», закодированного в числе п, на каждом этапе выполнения действий над цифрами, счи-1 тайными с «ленты», как они фигурируют в числе т. Можно предположить, что при этом совершалось бы значительное количество прыжков взад-вперед по ленте между цифрами, составляющими те и т, и выполнение процедуры было бы чрезвычайно медленным. Тем не менее, список команд подобной машины, несомненно, можно составить, и такая машина называется нами универсальной машиной Тьюринга. Обозначая ее действие на пару чисел (n, т) через U(n, т), мы получаем:
при любых (п, т), для которых Tn — корректно определенная машина Тьюринга. Машина U, в которую первым вводится число те, в точности имитирует n-ю машину Тьюринга!
Поскольку U — машина Тьюринга, то она сама будет иметь номер. То есть, для некоторого числа и имеем
Сколь велико n? В сущности, мы можем положить, что и в точности равно следующему числу:
и=24485533533931757719839503961571123 7952360672556559631108144796606505059404 2410903104836136323593656444434583822268 8327876762655614469281411771501784255170 7554085657689753346356942478488597046934 7257399885822838277952946834605210611698 3594593879188554632644092552550582055598 9451890716537414896033096753020431553625 0349845298323206515830476641421307088193 2971723415105698026273468642992183817215 7333482823073453713421475059740345184372 3595930906400243210773421788514927607975 763441512307958639635449226915947965461
4711345700145048167337562172573464522731 0544829807849651269887889645697609066342 0447798902191443793283001949357096392170 3904833270882596201301773727202718625919 9144282754374223513556751340842222998893 7441053430547104436869587640517812801943 7530813870639942772823156425289237514565 4438990527807932411448261423572861931183 3261065612275553181020751108533763380603 1082361675045635852164214869542347187426 4375444287900624858270912404220765387542 6445413345174856629157429990950262300973 3738137724162172747723610206786854002893 5660856968226201419824862169890260913094 0298570600174300670086896759034473417412 7874255812015493663938996905817738591654 0553567040928213322216314109787108145997 8669599704509681841906299443656015145490 4880922084480034822492077304030431884298 9939313526688234966210194716191070146196 8523192847482034495897709553561107027581 7487333272966789987984732840981907648512 7263100174016678736347760585724503696443 4897992034489997455662402937487668839751 4044516657077500605138839916688140725455 4466522205072426239237921152531816251253 6305093172863142200406457130527580230766 5183351995689139748137504926429605010013 651980186945639498
(или какому-нибудь другому подходящему, не менее внушительному по величине числу). Это число, без сомнения, выглядит устрашающе большим! Оно, действительно, чрезвычайно велико, но я не вижу способа, как его можно было бы сделать меньше. Процедуры кодирования и определения, использованные мною для машин Тьюринга, вполне разумны и достаточно просты, и все же с неизбежностью приводят к подобным несуразно большим числам для реальной универсальной машины Тьюринга.
Я уже говорил, что все современные общеупотребительные компьютеры, по сути, являются универсальными машинами Тьюринга. Я ни в коем случае не подразумеваю под этим, что их логическая структура должна в точности походить на предложенную мной выше структуру универсальной машины Тьюринга. Однако сутб дела состоит в том, что если сперва ввести в произвольную универсальную машину Тьюринга соответствующую программу (начало подаваемой на вход ленты), то потом она сможет копировать поведение любой машины Тьюринга! В предыдущем примере программа просто принимает форму одного числа (числа п), но этим разнообразие возможных процедур и вариантов исходной схемы Тьюринга отнюдь не исчерпывается. В действительности я сам, описывая машину, несколько отклонился от того, что исходно было предложено Тьюрингом. Но ни одно из этих отклонений не имеет сейчас для нас существенного значения.
Дата добавления: 2022-02-05; просмотров: 87;