Россия, Москва, МГУПИ |
Алгоритмы: машины Тьюринга
Ветвление (условный оператор)
Машину Тьюринга будем называть распознающей,
если для некоторого алфавита
и каждого входа
, на котором
останавливается,
ее результат
, т.е.
вычисляет
некоторую двузначную функцию (возможно частичную) на словах
из
Лемма 9.5. Пусть - распознающая м.Т., м.Т.
вычисляет функцию f(x),
а м.Т.
- функцию g(x). Тогда существует м.Т.
вычисляющая функцию

Доказательство. Требуемая м.Т.
вначале копирует вход x и получает на ленте слово x*x, затем вычисляет параллельную композицию функций
и тождественной функции e(x)=x и переходит в конфигурацию
. Выбор между f и g происходит
по следующим командам:

Кроме того, обеспечим переход в новое заключительное состояние:

Таким образом, мы реализовали в терминах машин Тьюринга обычный в языках программирования оператор ветвления:

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

Доказательство. Действительно, пусть м.Т. - вычисляет тождественную функцию g(x)=x. Построим по м.Т.
м.Т.
реализующую ветвление как в лемме 9.5. Тогда
искомая м.Т.
получается из
заменой команд
на
соответствующие команды
,
обеспечивающие зацикливание.
Реализованные выше операции над машинами Тьюринга
и вычислимыми функциями позволяют получать программы новых м.Т., используя обычные конструкции языка программирования
"высокого" уровня: последовательную и параллельную композицию, ветвление и цикл. Пусть - машины Тьюринга. Последовательную композицию M1 и M2 будем обозначать M1;M2, параллельную композицию M1, M2,... , Mm
обозначаем как
(здесь b -
это символ, разделяющий аргументы и результаты этих машин), ветвление -


Пример 9.4. Рассмотрим в качестве примера задачу
перевода чисел из унарной системы счисления в двоичную.
Пусть fub(|n) = n(2) для всех , где n(2) - двоичная запись числа n.
Пусть M1 - м.Т., которая начальную конфигурацию q0 ,|n переводит в конфигурацию q1 ,0*|n; M2 - м.Т., которая прибавляет 1 к двоичному
числу-аргументу (см. пример ref{ex8-suc}); M3 - м.Т., которая вычитает 1 из унарного
числа; - м.Т., которая на аргументе вида x*|y выдает
0, если число y > 0, и выдает 1 при y=0 (т.е. на аргументе
); M4 - м.Т., которая стирает * в аргументе вида x* и
останавливается. Реализация каждой из указанных м.Т. очевидна.
Теперь требуемая м.Т. Mub, вычисляющая fub, получается как

Действительно, после работы M1 получаем конфигурацию q10*|n. Предположим теперь по индукции, что после i (i <n) итераций цикла
while получается конфигурация q1 i(2)*|n-i.
Тогда на (i+1) -ой итерации цикла после параллельного
применения M2 к i(2) и M3 к |n-i
получаем конфигурацию q1(i+1)(2)*|n-i-1.
Поэтому после n итераций получится конфигурация . На ней
выдаст 1, и цикл завершится с записью
на ленте,
из которой M4 сотрет * и оставит требуемый результат n(2).
Отметим, что из приведенного примера и из задачи \oldref{prb3-6}(a) следует, что класс вычислимых на м.Т. арифметических функций не зависит от выбора унарного или двоичного кодирования аргументов и результатов. Это же справедливо и для троичной, десятичной и других позиционных систем счисления ( почему ?).
Задачи
Задача 9.1. Постройте м.Т. для функции копирования, не
увеличивая исходный алфавит
Задача 9.2. Постройте программу м.Т., которая выполняла бы
перенос непустого слова в заданное место ленты, т.е. для любого
слова и n > 0 выполняла
преобразование конфигураций:
.
Задача 9.3. Достройте программу м.Т. из леммы 9.1 на этапах 3 и 4.
Задача 9.4. Докажите, что односторонняя м.Т. построенная в лемме 9.2, корректно моделирует исходную м.Т.
.
Задача 9.5. Другой, по сравнению с конструкцией леммы 9.2,
подход к моделированию двухсторонней ленты на
односторонней заключается в том, чтобы содержимое правой полуленты хранить в четных ячейках
а содержимое
левой полуленты - в нечетных, поместив в 1-ю ячейку специальный маркер.
Постройте программу, реализующую этот подход (ее достоинство -
увеличение алфавита ленты всего на 1 символ).
Задача 9.6. Достройте программу м.Т. из
леммы 9.4 на этапах 1, 3 и 5.
Задача 9.7. Построить программы машин Тьюринга, вычисляющих следующие функции.
- Перевод из двоичной системы в унарную: fbu(n(2))= |n.
- Сложение и вычитание в двоичной системе: sum(n*m)=n+m и
совпадает с - при n >= m и
при m > n ).
- Умножение в двоичной системе: mul(n*m)= n x m. ( Реализуйте алгоритм умножения "в столбик".)
- Возведение в степень: exp(n*m)= nm.
- Извлечение квадратного корня:
.
- Логарифмирование:
.
- Деление:
.
- Остаток от деления: rest(n*m) = n mod m.
- Функция выбора аргумента:
.
Задача 9.8. Используя машины Тьюринга из предыдущей задачи, построить программы машин Тьюринга, вычисляющих следующие функции.
Задача 9.9. Докажите, что всякую арифметическую функцию f(x),
вычислимую на некоторой м. Т. , можно также вычислить на м. Т. M',, алфавит ленты которой содержит лишь два символа
и |. (Указание: используйте для моделирования
одного символа из
блок из нескольких подряд идущих ячеек,
содержащих его код в алфавите
) и замените
каждую команду M группой команд, обрабатывающих соответствующий
блок ячеек).
Задача 9.10. Построить машину Тьюринга, определяющую по слову x в алфавите {1, 2} симметрично ли оно, т. е. вычисляющую функцию:

Задача 9.11.
Построить машину Тьюринга, сравнивающую два слова x=x1x2... xn и y=y1y2... ym в алфавите {1, 2, 3} лексикографически: или для некоторого непустого слова x' выполнено y = x x'.
Эта машина Тьюринга должна вычислять функцию:
