
- •Содержание курса “Теория алгоритмов и вычислительных процессов”
- •I. Теория алгоритмов
- •Основные понятия теории алгоритмов
- •1.1. Предварительные сведения
- •1.2. Основные требования к алгоритмам
- •1.3. Необходимость математического понятия алгоритма
- •2. Типы алгоритмов
- •3. Способы представления (описания) алгоритмов
- •3.1. Исполнитель алгоритма
- •3.2. Строчная словесная запись алгоритма
- •3.3. Графическая форма записи
- •3.4. Управляющие структуры
- •4. Описание задачи и выбор алгоритма
- •5. Универсальные алгоритмические модели
- •Понятие конструктивного объекта
- •Понятие об алфавитных алгоритмах
- •5.3. Формализация понятия “алгоритм”
- •5.4. Схема построения алгоритмической системы
- •6. Рекурсивные функции
- •6.1. Примитивно-рекурсивные функции
- •6.1.1. Оператор суперпозиции (подстановки)
- •6.1.2. Оператор примитивной рекурсии
- •6.2. Частично-рекурсивные функции
- •Пример 6.2.2. Рассмотрим функцию
- •6.3. Тезис Черча
- •7. Машины Тьюринга (Поста)
- •7.1. Основные понятия машин Тьюринга
- •7.2. Способы представления машины Тьюринга
- •7.2.1. Представление машины Тьюринга совокупностью команд
- •7.2.2. Представление машины Тьюринга графом
- •7.2.3. Представление машины Тьюринга таблицей соответствия
- •7.3. Примеры построения машин Тьюринга
- •Вычислимость по Тьюрингу
- •7.5. Некоторые операции над машиной Тьюринга
- •7.5.1. Композиция машин Тьюринга
- •7.5.2. Итерация машины Тьюринга
- •7.5.3. Разветвление машин Тьюринга
- •7.4. Универсальная машина Тьюринга
- •7.5. Тезис Тьюринга
- •7.6. Машина Поста
- •9. Алгоритмическая разрешимость. Алгоритмические проблемы
- •10. Сложность алгоритмов и вычислений
- •Анализ скорости выполнения алгоритмов
- •Память или время
- •Временнáя сложность алгоритма
- •Оценка с точностью до порядка
- •Определение сложности
- •Сложность рекурсивных алгоритмов
- •Средний и наихудший случай
- •Общие функции оценки сложности
- •Скорость работы алгоритма в реальных условиях
- •19.5. Труднорешаемые задачи
7.3. Примеры построения машин Тьюринга
Пример 7.1.
Пусть (X = {0,1}, Q = {q0,q1,q2}, q0, #, P), где Р имеет такие команды:
1 q0 1 q0 R
0 q0 0 q0 R # q0 # q1 L
1 q1 0 q1 L
0 q1 1 q2 L
# q1 1 q2 L ,
где в начальный момент головка осматривает первый символ слова р F(x) в положении q0. Эта машина Тьюринга реализует алгоритм, который правильно вычисляет функцию f(x)=x+1 по правилам двоичного сложения добавления единицы до числа р, представленного в двоичной системе счисления. Рассмотрим некоторые примеры. Пусть р = 100111, тогда имеем такую последовательность команд:
1 q0 1 q0 R 0 q0 0 q0 R 0 q0 0 q0 R 1 q0 1 q0 R 1 q0 1 q0 R 1 q0 1 q0 R
# q0 # q1 L 1 q1 0 q1 L 1 q1 0 q1 L 0 q1 1 q2 L
В результате слово р = 100111 “переписалось” машиной в слово р` = 101000 = 100111 + 1 в двоичной системе счисления.
Пусть (X = {0,1}, Q = {q0}, q0, #, P), где Р имеет такие команды:
0 q0 0 q0 L
1 q0 1 q0 L
# q0 1 q0 E
Действие этой машины заключается в том, что, начавши работу с какого-либо непустого слова р, до этого слова приписывается слева символ 1. Машина при этом не останавливается. То есть, результат работы машины не определенный.
Пусть (X = {0,1}, Q = {q0,q1}, q0, #, P), где Р имеет такие команды:
# q0 # q0 R
0 q0 0 q0 R
1 q0 1 q1 E
Действие этой машины Тьюринга заключается в том, что в слове р машина ищет символ 1 (если он есть) и, найдя его, останавливается. Если слово р является числом в двоичной системе счисления, то машина останавливается, если это число не равняется нулю. В противном случае работа машины продолжается бесконечно.
Пусть задано два слова а0а1 и а2а3а4а5 (рис. 7.2). Задание состоит в том,
чтобы, начиная с левого конца ленты, заменить символы а3 и а5 на а2 и а4 соответственно. После чего возвратиться к левому концу ленты. Команды имеют такой вид:
а0 q0 а0 q0 R а3 q2 а2 q2 R а4 q3 а4 q3 L
a1 q0 а1 q0 R а4 q2 а4 q2 R а2 q3 а2 q3 L
# q0 # q1 R а5 q2 а4 q3 R # q3 # q3 L
а2 q1 а2 q2 R # q3 # q3 L а1 q3 а1 qz L , где qz – состояние останова.
-
…
…
#
а0
а1
#
a2
а3
а4
а5
#
…
…
Рис. 7.2
Функциональную схему МТ для этого примера зададим в в виде таблицы 7.1.
Таб. 7.1.
-
X/Q
q0
q1
q2
q3
a0
R
a1
R
Lqz
a2
Rq2
L
a3
а2 R
a4
R
L
a5
а4 Rq3
#
Rq1
L
Составим функциональную схему МТ, которая соответствует алгоритму
сложения двух чисел, представленных унарной записью. То есть, числа подаются совокупностью единиц, общая сумма которых равняется заданному числу. Числа отделяются знаком + (рис. 7.3.). Пусть это будут числа 4 и 6. Начальное слово на ленте имеет вид 1111 + 111111.
Функциональную схему МТ для этого примера приведено в таб. 7.2.
-
#
1
1
1
1
+
1
1
1
1
1
1
#
Рис. 7.3.
Таб. 7.2.
-
X/Q
Q0
q1
q2
1
# Rq2
1Lq1
1Rq2
#
Rq2
# Rq0
1Lq1
+
# Rqz
+Lq1
+Rq2
На этой схеме сложения начальные условия определяются ячейкой с крайней левой единицей и состоянием q0. На первом такте единица стирается, выдается команда движения вправо и переходу в состояние q2(#Rq2). Последующие такты сводятся до движения вправо через все единицы (1Rq2) и знак “+” (+Rq2) пока не будет достигнута пустая ячейка. Тогда в нее вписывается единица, а машина переходит в состояние q1(1Lq1). После этого происходит движение в обратном направлении через все символы 1 и “+” до первой пустой ячейке слева. Далее происходит движение вправо, и машина переходит в состояние q0(#Rq0). Благодаря такому циклу единица левого слагаемого переносится в правое слагаемое, что соответствует слову 111+1111111. Очевидно, что через четыре таких цикла начальное слово превратится в 1111111111. До начала пятого цикла в состоянии q0 рассматривается символ “+”, который стирается, происходит движение вправо и останов (#Rqz, вместо состояния qz можно использовать любое состояние, отсутствующее при написании команд). В результате получаем слово 1111111111, что соответствует числу 10.
6. Построить машину Тьюринга сложения двух натуральных чисел в алфавите Х{1}, как в предыдущем примере, начиная и заканчивая свою работу с левой непустой ячейки, но по другой программе.
Двигаясь вправо, найти символ "+" и заменить его на символ "1", затем дойти до правой крайней ячейки с символом "1", заменить его на # - пустой символ, повернуться в начальное положение и закончить роботу. Тогда программа будет иметь такой вид:
1 q0 1 q0 R
+ q0 1 q0
# q0 # q1 L
1 q1 # q2 L
1 q2 1 q2 L
# q2 # qz R
7. Построить машину Тьюринга, которая в алфавите Х{0,1,2,3,4,5,6,7,8,9} выполняет операцию сложения 1 к натуральному числу n, записанному в десятичной системе счисления: 1) находясь в начальном положении справа в крайней ячейке (т.е. в разряде единиц); 2) находясь в стандартном положении. Программа для поставленной задачи будет иметь вид:
1) 0 q1 1 qz 2) 0 q0 0 q0 R 0 q1 1 qz
1 q1 2 qz 1 q0 1 q0 R 1 q1 2 qz
2 q1 3 qz 2 q0 2 q0 R 2 q1 3 qz
3 q1 4 qz 3 q0 3 q0 R 3 q1 4 qz
4 q1 5 qz 4 q0 4 q0 R 4 q1 5 qz
5 q1 6 qz 5 q0 5 q0 R 5 q1 6 qz
6 q1 7 qz 6 q0 6 q0 R 6 q1 7 qz
7 q1 8 qz 7 q0 7 q0 R 7 q1 8 qz
8 q1 9 qz 8 q0 8 q0 R 8 q1 9 qz
9 q1 0 q1 L 9 q0 9 q0 R 9 q1 0 q1 L
# q1 1 qz # q0 # q1 L # q1 1 qz
8. Построить машину Тьюринга, выполняющую операцию (x div 2) – целочисленное деление, и имеющую входной алфавит А = {0, 1, #}. Таблица соответствия данной машины Тьюринга будет иметь следующий вид:
-
X/Q
q0
q1
q2
0
R
#q2L
0q2L
1
R
#q2L
1q2L
#
#q1L
0qz
Операция (x div 2) реализована сдвигом цепочки вправо на 1 разряд.