Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по МЛиТА.docx
Скачиваний:
43
Добавлен:
25.04.2019
Размер:
1.58 Mб
Скачать

Ветвление (условный оператор)

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

Лемма 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) следует, что класс вычислимых на м.Т. арифметических функций не зависит от выбора унарного или двоичного кодирования аргументов и результатов. Это же справедливо и для троичной, десятичной и других позиционных систем счисления ( почему ?).