Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
02.04.2015
Размер:
256.51 Кб
Скачать

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

Модель алгоритма, называемая машиной Тьюринга [16], состоит из бесконечной ленты (БЛ), разделенной на ячейки, и управляющей головки (УГ), которая перемещается по ленте и способна считывать символ в ячейке, против которой она находится, а также замещать обозреваемый символ новым (рис.4.1).

В каждой ячейке может быть записан один символов из ленточного алфавита A. Головка может находиться в одном из внутренних состояний, принадлежащих конечному множеству (алфавиту состояний) Q. Работа машины происходит в дискретном времени в соответствии с программой, задаваемой набором команд вида

qaa+Dq+.

В зависимости от состояния головки qQ и символа aA, против которого она стоит, головка записывает на ленте новый символ a+ (или оставляет старый), переходит в новое состояние q+ (или остается в старом) и передвигается: вправо (П), влево (Л) или остается в прежнем положении (Н).

Назовем конфигурацией машины Тьюринга Kt в момент t содержимое ее ленты, состояние головки qQ и обозреваемый ею символ a. Пусть на ленте записана цепочка символов …a1a3a1a2a3a1…, слева и справа от которой свободные ячейки (содержат символ ), причем головка, находясь в состоянии qi, обозревает символ a2. Соответствующую конфигурацию будем записывать, помещая обозначение состояния головки перед обозреваемым символом: a1a3a1qi a2a3a1.

Конфигурация машины Тьюринга называется заключительной, если головка машины Тьюринга находится в состоянии останова q0.

Работу машины Тьюринга можно описать как последовательную смену ее конфигураций, причем машина переходит от конфигурации Kt к конфигурации Kt+1 в соответствии со своей программой. Любая начальная конфигурация K0, которой соответствует состояние q1, порождает последовательность конфигураций K0, K1, K2, …, Kt,… .

Эта последовательность обрывается, если машина оказывается в заключительной конфигурации. В этом случае будем говорить, что машина Тьюринга применима к конфигурации K0.

Если последовательность конфигураций K0, K1, K2, …, Kt,… никогда не обрывается, т.е. машина работает вечно (“зацикливается”), будем говорить, что машина Тьюринга неприменима к конфигурации K0.

Для решения задачи исходные данные должны быть закодированы некоторым “естественным” образом символами некоторого алфавита A и записаны в виде слова X на ленте машины, причем головка в начальном состоянии q1Q обозревает самый левый символ слова X, т.е. начальная конфигурация имеет вид q1X. Результирующая конфигурация имеет вид q0 f(X).

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

Примеры машин Тьюринга

Рассмотрим несколько примеров специализированных машин Тьюринга с ленточным алфавитом A={,+,1}, алфавитом состояний {q0,q1,q2, …, qn} и алфавитом перемещений D{П,Л,Н}. Символ  играет роль разделителя. Символы q1, q0 – соответственно начальное и заключительное состояние машины (останов).

Рассматриваемые машины выполняют арифметичекие операции над неотрицательными целыми числами, для представления которых используется унитарнй код. Число x представляется (x+1)-й единицей, причем отдельно записанная единица представляет нулевое значение x.

П

Таблица 4.1

a

q

q1

q2

-

q0

1

q2

-

ример 4.1. Прибавление единицы. В таблице 4.1 приведен пример программы машины с алфавитом состояний {q1,q2,q0}. Машина увеличивает значение числа на единицу.

Например, увеличение числа три на единицу машина осуществляет за два шага:

…q11111…  …q21111…  … q011111… .

Для исходной конфигурации …q111… поведение машины не определено. Это означает, что рассматриваемая машина реализует частичную словарную функцию.

П

Таблица 4.2

a

q

q1

q2

Нq0

q0

1

Пq2

q0

ример 4.2. Усеченное вычитание единицы. В таблице 4.2 приведен пример программы машины, выполняющей усеченное вычитание единицы. Вычитание единицы для неотрицательных целых чисел – частичная функция, поскольку значение 0-1 не определено. Введем усеченное вычитание , доопределив обычное вычитание: xy = x-y для xy и xy =0 для xy.

Например, усеченное вычитание единицы из четырех машина осуществляет за два шага:

…q111111…  …q21111…  …q01111… .

Усеченное вычитание из нуля:

…q11…  …q2…  …q01… .

Пример 4.3. Сложение. В таблице 4.3 приведен пример программы машины с алфавитом состояний {q1,q2,q3,q0}.

Таблица 4.3

a

q

q1

q2

q3

q4

Пq1

Пq1

q2

Нq0

1

Пq3

q2

q3

Пq0

+

Пq4

q2

q3

Нq0

Например, сложение чисел 11+111 (один плюс два) осуществляется за два цикла. Начальное состояние головки q1. Состояние q3 поддерживает перемещение головки вправо с одновременным "перетаскиванием" единицы:

…q111+111… …q31+111… …1q3+111… …1+q3111… …1+1q311… …1+11q31…

…1+111q3… …1+11q211… .

Состояние q2 соответствует перемещению головки влево:

1+11q211… …1+1q2111… …1+q21111… …1q2+1111… …q21+1111… …q21+1111…

… q11+1111… .

Первый цикл закончен. Второй цикл:

… q11+1111… …q3+1111… …+q31111…

. . .

…+ 1111q3… …+ 111q211… …+ 11q2111…

. . .

…q2+ 11111… …q1+ 11111… .

Второй цикл закончен. Машина удаляет лишнюю единицу

…q1+ 11111… …q411111 … …q01111…

и, достигнув состояния q0, останавливается. Конфигурация …q011111… дает решение задачи.

Пример 4.4. Усеченное вычитание. В таблице 4.4 приведен пример программы вычисления усеченной разности.

Таблица 4.4

a

q

q1

q2

q3

q4

q5

q6

Лq2

Пq4

Пq0

q0

1

q1

Лq3

q3

Пq1

q5

Пq6

Пq1

q5

Лq3

Пq6

Например, вычитание 1111111 (три минус два) начинается тремя циклами, в результате каждого из которых стираются крайние единицы содержимого ленты. Начальное состояние q1 поддерживает перемещение головки вправо до разделителя :

…q11111111… . . . …1111111q1… .

Затем в состоянии q2 стирается самая правая единица и в состоянии q3 происходит перемещение головки влево до разделителя :

…1111111q1… …111111q2… …11111q31…

…1111q311… . . . …q3111111… .

Затем в состоянии q4 стирается самая левая единица и начинается второй цикл: в состоянии q1 повторяется перемещение головки вправо до разделителя  и т.д.:

q3111111……q4111111… …q111111… … .

Четвертый и последний цикл отличается тем, что, обозревая символ “” в состоянии q2, головка заменяет его на “1” и переходит в состояние q5, обеспечивающее корректное завершение программы:

…q11… …1q1… …1q1… …1q2…

… q511… …q511……q011… .

Состояние q6 предусмотрено для случая, когда вычитаемое больше уменьшаемого. В этом состоянии головка очищает ленту: перемещается вправо и стирает все единицы. Встретив разделитель  в состоянии q6, головка заменяет его единицей, остается на месте и переходит в заключительное состояние q0.

Приемы программирования машины Тьюринга

Цель настоящего раздела – продемонстрировать универсальные вычислительные возможности машин Тьюринга. Для этого покажем, как можно реализовать на этих машинах основные программные структуры:

  • cуперпозицию программ;

  • композицию программ;

  • ветвление и циклические структуры.

Суперпозиция программ. Предположим, что машины M1 и M2 вычисляют соответственно функции f1(X) и f2(X) в одном и том же алфавите A. Построим машину M=M1M2 для вычисления суперпозиции f2(f1(X)) (рис.4.2). Обозначения состояний машин M1 и M2 должны различаться за исключением того, что заключительное состояние M1 имеет то же обозначение, что и начальное состояние M2. В таком случае программа машины M получается простым объединением программ M1 и M2. Работу машины M=M1M2 можно представить схемой

.

Композиция программ. Пусть машины M1 и M2 вычисляют функции f1(X) и f2(X) соответственно. Построим машину M= M1*M2 для вычисления композиции f1(X)*f2(X), где * - символ, не встречающийся в алфавитах M1 и M2. Машина M использует “двухэтажную” ленту, на которую записываются пары символов вида . СловоX записывается нижними элементами пары вида , где - пустой символ. После запуска M оно переписывается в верхний этаж и оказывается записанным символами вида . ДалееM работает на нижнем этаже как M1 и вычисляет f1(X), затем M работает на верхнем этаже как M2 и вычисляет f2(X). В завершение M приписывает *f2(X) в конце записи f1(X) на нижнем этаже и стирает f2(X) на верхнем этаже.

Ветвление программ. Пусть машины M1 и M2 вычисляют словарные функции f1(X) и f2(X) соответственно в одном и том же алфавите A. Введем символы и (истина) и л (ложь), причем иA и лA. Построим машину M= M1M2, которая преобразует слово *X, где {и,л}, в слово f1(X), если =и, и в слово f2(X), если =л (рис.4.3). Для этого, полагая что алфавиты состояний M1 и M2 различны, в основу M положим объединение их программы. Введем для M начальное состояние q1 и, полагая, что q1,1 и q2,1 – начальные состояния M1 и M2 соответственно, дополним объединение программ M1 и M2 командами

иq1  Пq1,1,

лq1  Пq2,1,

*q1,1  Пq1,1,

*q2,1  Пq2,1.

Заключительные состояния q1,0 и q2,0 машин M1 и M2 обозначим как заключительное состояние q0 машины M= M1M2.

Машину M= M1M2 можно представить схемой на рис.4.4.

Циклическая программа. Рассмотрим циклическую программу на рис.4.5. Если значение предиката P(X) истина (и), то программа выдает значение f1(X). Если же значение предиката P(X) (л), то программа вычисляет значение X(1) =f2(X) и, если P(X(1))=и, то программа выдает значение f1(X(1)), в противном случае вычисляет значение X(2) =f2(X(1)) и т.д.

Приведем схему машины Тьюринга, реализующей циклическую программу (рис.4.6). На этой схеме машинаMP вычисляет значение  предиката P(X), машина M0 передает X без изменения, поэтому композиция MP*M0 формирует *X. Машины M1 и M2 вычисляют f1(X) и f2(X) соответственно. Машина M1M2 обеспечивает ветвление.

Соседние файлы в папке учебное пособие 2003