Самоприменимость машины Тьюринга

 

Можно, не изменяя принципам,

 найти сотни достойных решений

Агни Йога (т.1 стр.196)

 

Какая странность – машина Тьюринга это всегда вычислимость, а нас к бухте «машина Тьюринга» прописали только потому, что у нас на борту есть некая невычислимость. Если ответить коротко, то невычислимость обнаруживается тогда, когда какая-то задача не имеет решения. Теперь подробнее об одном из способов  достижения невычислимости.

Рассмотрим пример, но не тот, что раньше (там задача была элементарна, а таблица машины оказалась достаточно громоздкой), а проще. Нас будет интересовать в качестве примера машина Тьюринга, инвертирующая двоичный код. Скажем, на ленте дана входная запись 011001, после работы машина должна записать на ленте код 100110, т.е. нули должны замениться единичками, а единички – нулями. Таблица такой машины – весьма проста.

 

q0

q1

0

1Rq0

0Lq1

1

0Rq0

1Lq1

l

lLq1

lRS

 Рис.4

 

Рекомендую убедиться самостоятельно, что машина выполняет предложенную ей задачу. При этом обращаю внимание читателя, что длина двоичной записи из последовательности нулей и единиц может быть произвольной, какой угодно длины. Машина легко «справляется» с подобной задачей и демонстрирует на примере этой задачи вычислимость.

Как из данной в примере машины Тьюринга «извлечь» невычислимость? Первое, что приходит в голову – подать на ленту в качестве входного слова, что-нибудь этакое, что она не сможет воспринять, например, вместо нулей и единичек в качестве входного слова на ленте записать последовательность букв, скажем – abbbaa… (не «ломать» же ради невычислимости машину!). Все! Комбинацию «aq0» в самом начале работы она уже не «понимает», нет такой комбинации. А не понимая, не может выполнить никакой команды: ни записать-стереть символ, ни сдвинуть головку вправо-влево, ни изменить состояние. Машина «парализована», задача для такой машины оказалась невычислимой. Правда, смущает одно обстоятельство. Мы машину ни коим образом не изменяли, а подали на ее входную ленту нечто для нее «непотребное». Это все равно, что залить в бак вместо бензина молоко и желать, чтобы автомобиль поехал. Нет, нужно подать на ленту нечто машине «знакомое», так сказать – взятое из ее существа.

Попробуем провести над машиной странную операцию: развернем нашу двумерную таблицу (например, слева направо и сверху вниз) в одномерную запись. Правильно – у нас получится:

01Rq0q000Lq1q110Rq0q011q1Lq1q1llLq1q0llRSq1

Напоминаю, что символ l обозначает пустую ячейку. А теперь предъявим машине для чтения на ленте эту одномерную запись. Все символы ее взяты не из воздуха, а из «существа» машины.

01Rq0q000Lq1q110Rq0q011q1Lq1q1llq1 q0LllRSq1

Ý

Получается, что запустив машину, мы заставляем ее «читать саму себя». С первым нулем машина справится, заменит его единичкой, и головка сделает шаг вправо. Там в ячейке записана единичка, она заменит ее нулем, и головка сдвинется еще на один шаг вправо. На ленте возникнет следующая ситуация:

10Rq0q000Lq1q110Rq0q011q1Lq1q1llLq1q0llRSq1

    Ý

В этой ситуации машину ожидает большая неприятность: головка читает с ленты символ R. А в левом столбце таблицы рис.4 (столбце входных символов) такого символа нет. Машина этот символ «не понимает». И поэтому, она не «знает», что делать дальше. Куда двигать головку, какой символ стирать-записывать на ленте, в какое состояние переходить: команды «на этот случай жизни» у машины нет. Мы столкнулись с  ранее рассмотренной ситуацией, когда машине Тьюринга предложили для чтения незнакомые символы. Но тут, казалось бы, случай другой: машина «столкнулась» с символом, взятым из ее  же «тела», из ее собственной записи. Если воспользоваться предыдущей аналогией «бензин-молоко», то она до некоторой степени похожа на ситуацию «бензин - тосол» (тосол – это уже нечто автомобильное). Да, символ R принадлежит «телу» машины, но чтобы она могла его «понять», необходимо его вхождение не только в команду-тройку, но и в строку входных символов ее таблицы. Чуть ниже мы попытаемся это сделать, а сейчас назовем ситуацию, когда машине предъявляется для чтения собственная запись режимом самоприменимости.

Что, тупик? В данном примере, да. Основное условие правильной работы машины Тьюринга нарушилось: алгоритм не реализуется, и машина Тьюринга… перестала быть машиной Тьюринга! Виновата в этом введенная нами самоприменимость. Мы пока еще не знаем хороша ли самоприменимость или плоха: об этом в свое время, дальше мы будем говорить достаточно подробно. Пока лишь зафиксируем наше «достижение»: и невычислимость возникла в виде особого режима работы машины Тьюринга, но и сохранилась сама машина с ее способностью моделировать лишь вычислимые процессы (в примере – инвертировать двоичный код), когда режим самоприменимости отключен.

Читатель, наверное, обратил внимание, если текст читал, а не  бегло просматривал, что когда мы развертывали двумерную таблицу машины в одномерную запись, то предложили развертку выполнить слева направо и сверху вниз. Почему, чем эти направления предпочтительней других, например, снизу вверх и справа налево, ведь тоже получится одномерная запись? Или развертывать в шахматном порядке? Вспомним, что одномерная запись таблицы – это тоже «таблица» её самоё. Однако, если двумерная таблица имеет один и тот же вид, то одномерные записи при разных направлениях развертки будут разными. И когда машина, будучи поставленной в режим самоприменимости, будет читать эти разные записи, не будет ли она «думать», что она «знакомится» с разными машинами. Какая из них – она сама?

Нам остается предположить, что дело не в направлении развертки, а в чем-то другом, ибо речь идет все-таки об одной и той же машине. Окинем более внимательным взором таблицу на рис.4. Не трудно представить, что символы левого столбца таблицы (у нас это символы – 0, 1, l), можно трактовать как входные символы ленты, когда машина работает как инвертирующая машина без всякой-там самоприменимости. А символы q0, q1, S, L, R – это символы, принадлежащие самой машине, иными словами – ее внутренние символы. Я чувствую, что наиболее дотошный читатель уже начал догадываться – куда (или откуда) дует ветер. В самом деле, когда машина начинает работать в режиме самоприменимости (кто включает этот режим, сейчас неважно), ей приходится обрабатывать две группы символов: внешние (из внешнего мира!) и внутренние (из своего внутреннего мира!). Здесь совершенно неважно – в каком направлении была осуществлена развертка; важно, что количественное соотношение между внешними и внутренними символами при любом способе развертки остается неизменным. Машина в режиме самоприменимости с легкостью «разбирается» с внешними символами (еще бы – для этого машина и создавалась, чтобы инвертировать единички и нолики!), а встретившись с внутренним символом – «затыкается».

Всякая ли машина Тьюринга несамоприменима? Далеко не всякая. Вот, например, та же инвертирующая машина, которую мы «превратили» в самоприменимую.

 

q0

q1

q2

0

1Rq0

0Lq1

0Hq2

1

0Rq0

1Lq1

1Hq2

l

0Lq1

lRq2

lHq2

H

HRq0

0Rq0

HHq2

q2

q2Rq0

1Rq0

q2Hq2

q0

q0Rq0

q0Lq1

q0Hq2

q1

q1Rq0

q1Lq1

q1Hq2

L

LRq0

LLq1

LHq2

R

RRq0

RLq1

RHq2

Рис. 5

Очевидно, из нашего примера с машиной на рис.4, машину нужно было научить понимать внутренние  символы L,R,H, q0, q1, q2 (здесь для однообразия символики прежнее состояние останова S мы обозначили символом q2). Естественно, при появлении новых входных символов, должны были появиться новые клетки таблицы. Их нужно было заполнить какими-то командами (тройками), чтобы машина «знала», что нужно делать, когда головка читает  новый входной символ. (Мы сочли нужным добавить в таблицу еще один, третий, столбец, соответствующий состоянию останова q2, хотя этого можно было и не делать). Так вот, по поводу слова «превратили». Как заполнять новые клетки, чтобы наша инвертирующая машина стала самоприменимой?

Здесь приходится сообщить «любителям самоприменимости» «принеприятнейшую новость»: доказано, что проблема самоприменимости машины Тьюринга алгоритмически неразрешима. Это означает, что нет алгоритма (способа), с помощью которого можно было однозначно сказать – находящаяся перед вами машина Тьюринга самоприменима или нет. Или иначе – как создать самоприменимую машину Тьюринга? Здесь даже не помогает то обстоятельство, что вы «научите» машину «понимать» ее внутренние символы. Остается единственный способ: «запустить» машину и посмотреть – самоприменима или нет. Самоприменима – значит, остановится. А если что-то долго не останавливается; вам уже надоело ждать? Вы смотрите на часы, вас ждут другие дела. Можно остановить машину принудительно, так и не дождавшись ответа о ее свойствах. Обидно, если вы не дождались всего каких-то пару минут, и пара часов ожидания потеряна напрасно. Нельзя ли сразу узнать, еще до запуска машины – остановится она или нет. Тут новая незадача – проблема останова машины Тьюринга тоже алгоритмически неразрешима: в общем случае по внешнему виду ее таблицы нельзя сразу сказать – остановится или нет.

Вот почему мы выше и написали – «превратили». Заполнили таблицу, руководствуясь какими-то интуитивными соображениями, «запустили», посмотрели. Сразу понятно, что сделать это «в ручную» даже для такой сравнительно небольшой таблицы, как на рис.5, было невозможно: легко видеть, что после развертки такой таблицы ее одномерная запись содержит 135 символов. Естественно, наша машина Тьюринга была промоделирована на обычном компьютере. И то, пока какой-то вариант машины остановился (по всем правилам) – значит, самоприменима – головка сделала свыше 5000 шагов туда-сюда вдоль записи, состоящей из этих 135-ти входных символов.

Ну, вот – какой-то вариант оказался самоприменимым (машина остановилась), значит невычислимости все-таки нет? Не будем спешить: сам вариант «появился» посредством невычислимости! Мне, скажем повезло, что «придумалось» за относительно короткое время. А если бы «не придумалось»? Нельзя исключать из рассмотрения и такой момент: для какой-то специализированной машины Тьюринга ее самоприменимый вариант «создать» нельзя по одной простой причине: такого варианта не существует в принципе. Узнать же, что его не существует, невозможно из-за алгоритмической неразрешимости самоприменимости машины Тьюринга.

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

Размышляя над «уловкой» капитана нашего корабля, я все время задаю себе вопрос. Почему он ввел какой-то непонятный режим работы машины, заставляя ее «читать саму себя»? Не проще ли было взять любую  известную алгоритмически неразрешимую проблему, и сказать: «пожалуйста, вот вам невычислимость»? Может быть, это был просто нетрадиционный ответ на нетрадиционную же и озорную идею подрезать мухе крылья? Все может быть. Но сдается мне, что тут была заложена более глубокая мысль. Машина Тьюринга была выбрана в качестве основополагающей модели, если угодно – путеводной звезды – на пути к постижению сознания. Значит, нужно «выжать» из этой модели все, что возможно и даже – невозможно. Мы, естественно, знали сетования М.Минского по поводу самоприменимости УМТ – мол, там непреодолимая и раздражающая трудность. Поэтому искать нужно там, где трудно: плохо спрятанное легко найдет любой. Сущность сознания спрятана очень хорошо. Капитан не стал затруднять себя вопросом – кто-то спрятал, или само спряталось? Нужно искать, а там жизнь подскажет – где холодно, где тепло, а где совсем горячо.

К содержанию

Вперед

Назад

Hosted by uCoz