- •ТЕОРИЯ АЛГОРИТМОВ
- •Введение
- •Таким образом, получили убывающую последовательность натуральных чисел
- •I.1. Примитивно рекурсивные функции. Базис элементарных функций. Операции подстановки и примитивной рекурсии. Основные свойства
- •I.2. Примитивно рекурсивные функции относительно совокупности функций. Основные свойства.
- •I.3. Производные операции над функциями
- •I.4. Операции конечного суммирования и конечного произведения
- •Действительно
- •Очевидно, что
- •I.5. Предикат, логическая функция. Логические операции с предикатами.
- •I.6. Операции навешивания кванторов. Операции навешивания кванторов относительно двуместных предикатов
- •I.7. Примитивно рекурсивный предикат
- •I.8. Операция навешивания ограниченного квантора над предикатами
- •I.9. Кусочное задание функции
- •I.10. Операция ограниченной минимизации
- •I.11. Частично рекурсивные функции
- •Тогда
- •Контрольные вопросы
- •Практические задания
- •II.Уточнение понятия алгоритма через абстрактную математическую машину Тьюринга
- •II.1 Определение машины Тьюринга
- •II.2 Применение машин Тьюринга к словам
- •II.3 Вычислимые по Тьюрингу функции
- •II.5 Композиция машин Тьюринга
- •II.6 Тезис Тьюринга (основная гипотеза теории алгоритмов)
- •II.7 Машины Тьюринга и современные электронно-вычислительные машины
- •II.8 Вычислимость по Тьюрингу примитивно рекурсивных функций
- •II.9 Вычислимость по Тьюрингу частично рекурсивных функций
- •Контрольные вопросы
- •Практические задания
- •III.1. Уточнение понятие алгоритма через машину с неограниченными регистрами
- •Практические задания
- •IV. Марковские подстановки
- •IV.1. Нормальные алгоритмы Маркова
- •IV.2. Нормально вычислимые функции и принцип нормализации Маркова
- •IV.3. Совпадение класса всех нормально вычислимых функций с классом всех функций, вычислимых по Тьюрингу
- •СПИСОК ЛИТЕРАТУРЫ
II.3 Вычислимые по Тьюрингу функции
Определение 1. Функция называется вычислимой по Тьюрингу, если существует машина Тьюринга, вычисляющая ее, т.е. такая машина Тьюринга, которая вычисляет ее значения для тех наборов значений аргументов, для которых функция определена, и работающая вечно, если функция для данного набора значений аргументов не определена.
Остается договориться о некоторых условностях для того, чтобы это определение стало до конца точным. Во-первых, напомним, что речь идет о функциях (или возможно о частичных функциях, т. е. не всюду определенных), заданных на множестве натуральных чисел и принимающих также натуральные значения. Во-вторых, нужно условиться, как записывать на ленте машины Тьюринга значения х1,, х2,
..., хп аргументов функции f(x1, x2, ..., хп), из какого положения начинать переработку исходного слова и, наконец, в каком положении получать значение функции. Это можно делать, например, следующим образом. Значения х1,, х2, ..., хп аргументов будем располагать на ленте в виде следующего слова:
01 ...101 ...10...01 ...10. |
||
{ { |
{ |
|
x1 |
x2 |
xn |
Здесь полезно ввести следующие обозначения. Для натурального х |
||
обозначаем: |
|
|
Iх = 1...1, 0х = 0 ... 0 . |
||
{ |
|
{ |
x |
|
x |
Дополнительно полагаем 0° = 1° = — пустое слово. Так что на слова 1° =
, I1 = 1, I2 = 11, I3 = 111, ... будем смотреть как на «изображения» натуральных чисел 0, 1, 2, 3, ... соответственно.
Таким образом, предыдущее слово можно представить следующим образом: 01x1 01x2 0...01xn 0 . Далее, начинать переработку данного слова будем из стандартного начального положения, т.е. из положения, при
49
котором в состоянии q1 обозревается крайняя правая единица записанного слова. Если функция f(x1, x2, ..., хп) определена на данном наборе значений аргументов, то в результате на ленте должно быть записано подряд f(x1, x2, ..., хп) единиц; в противном случае машина должна работать бесконечно. При выполнении всех перечисленных условий будем говорить, что машина Тьюринга вычисляет данную функцию.
Таким образом, сформулированное определение 1 становится абсолютно строгим.
Пример 1 Построим машину Тьюринга, вычисляющую функцию f(x) = х/2. Эта функция не всюду определена: областью ее определения является лишь множество всех четных чисел. Поэтому, учитывая определение 1, нужно сконструировать такую машину Тьюринга, которая при подаче на ее вход четного числа давала бы на выходе половину этого числа, а при подаче нечетного — работала бы неограниченно долго.
Сконструировать машину Тьюринга — значит написать (составить) ее программу. В этом процессе два этапа: сначала создается алгоритм вычисления значений функции, а затем он записывается на языке машины Тьюринга (программируется).
Вкачестве внешнего алфавита возьмем двухэлементное множество
А= {0, 1}. В этом алфавите натуральное число х изображается словом 11... 1, состоящим из х единиц, которое на ленте машины Тьюринга записывается в виде х единиц, стоящих в ячейках подряд. Работа машины начинается из стандартного начального положения: 01 … 1q110(число единиц равно х).
Сделаем начало вычислительного процесса таким: машина обозревает ячейки, двигаясь справа налево, и каждую вторую единицу превращает в 0. Такое начало обеспечивается следующими командами:
(1): q11→ q21Л;
50
(2): q21→ q10Л ; (3): q20→ q20Л.
Если число х единиц нечетно, то машина продолжит движение по ленте влево неограниченно, т. е. будет работать бесконечно. Если же число х единиц четно, то в результате выполнения команд создается конфигурация q10010101... 01010, в которой число единиц равно х/2. Остается сдвинуть единицы так, чтобы между ними не стояли нули. Для осуществления этой процедуры предлагается следующий алгоритм. Будем двигаться по ленте вправо, ничего на ней не меняя, до первой единицы и перейдем за единицу. Передвижение осуществляется с помощью следующих команд:
(4): q10→ q30П; (5): q30→ q30П; (6): q31→ q41П.
В результате их выполнения получим конфигурацию
001q4 010101 ... 010100. (*)
Заменим 0, перед которым остановились, на 1 и продвинемся вправо до ближайшего 0:
(7): q40→ q51П; (8): q51→ q21П.
Получим конфигурацию 00111q50101... 010100, в которой правее обозреваемой ячейки записаны «пары» 01, ..., 01. Кроме того, на ленте одна единица записана лишняя. Продвинемся по ленте вправо до последней «пары» 01. Это можно сделать с помощью своеобразного цикла:
(9): q50→ q60П; (10): q61→ q21П.
Получим конфигурацию 001110101 ...01010q600. Двигаться дальше вправо бессмысленно. Вернемся на две ячейки назад и заменим единицу из последней «пары» 01 на ноль:
51
(11): q60→ q70Л; (12): q70→ q70Л; (13): q71→ q80Л.
Получим конфигурацию 001110101 ...01q800. Число единиц на ленте снова равно x/2. Продвинемся влево на одну ячейку с помощью команды
(14): q80→ q90Л.
В результате чего получим конфигурацию 001110101 ...010q9100. Теперь уничтожим самую правую единицу и продвинемся по ленте влево до следующей единицы:
(15): q91→ q100Л; (16): q100→ q100Л.
Получим конфигурацию
001110101 ... 0q10100, (**)
в которой левее обозреваемой ячейки записана серия пар 10, 10,…,10 (если читать справа налево). Теперь на ленте недостает одной единицы, т. е. число единиц равно (х/2) - 1. Продвинемся по ленте влево до последней «пары» 10. Это можно сделать с помощью цикла
(17): q101→ q111Л; (18): q110→ q100Л,
выполнив который, придем к следующей конфигурации: 001q11110101. ..0100. Вернемся вправо к ближайшему нулю и превратим его в единицу
(19): q111→ q121П; (20): q121→ q121П; (21): q120→ q131П.
Получим конфигурацию 001111q13101 ... 0100, в которой число единиц снова равно х/2.
Если теперь перешагнем вправо по ленте через обозреваемую единицу и переведем машину в состояние q4 с помощью команды
52
(22): q131→ q41 П,
то придем к следующей конфигурации: 0011111q401 ... 0100, которая по существу аналогична конфигурации (*). В результате программа зацикливается (становится циклической): снова ближайший 0 превращается в 1, а самая правая 1 — в 0, затем машина возвращается к самому левому нулю, оказываясь в начале следующего цикла, и т.д.
Как же завершается работа программы? В некоторый момент конфигурация будет иметь вид 00111... 10q10100. Выполнив команды (17), (18), придем к конфигурации 00111... 1q11 110100. Далее выполняются команды (19), (20), (21), что приводит к конфигурации: 00111... 111111q1300. Остается остановить машину. Это делается с помощью команды
(23): q130→ q00Л.
Заключительная конфигурация имеет вид: 00111... 1111q0100. Запишем программу машины Тьюринга в табличной форме:
Q\A |
0 |
1 |
|
|
|
q1 |
q30П |
q21Л |
q2 |
q20Л |
q10Л |
q3 |
q30П |
q41П |
q4 |
q51П |
|
q5 |
q60П |
q51П |
q6 |
q70Л |
q51П |
q7 |
q70Л |
q80Л |
q8 |
q90Л |
q21Л |
q9 |
|
q100Л |
q10 |
q100Л |
q111Л |
q11 |
q100Л |
q121П |
q12 |
q131П |
q131П |
q13 |
q00Л |
q41П |
|
|
|
53
II.4 Правильная вычислимость функций на машине Тьюринга.
В предыдущем пункте мы рассмотрели вопрос о том, что значит и каким образом «данная машина Тьюринга вычисляет функцию f(x{, x2, ..., х„)». Для этого нужно, чтобы каждое из чисел ;x1, х2 ..., хn было записано на ленту машины непрерывным массивом из соответствующего числа единиц, а сами массивы были разделены символом 0. Если функция f(x1, x2,
..., хп) определена на данном наборе значений аргументов, то в результате на ленте должно быть записано подряд f(x1, x2, ..., хп), единиц. При этом мы не очень строго относились к тому, в каком начальном положении машина начинает работать (часто это было стандартное начальное положение), в каком завершает работу и как эта работа протекает.
В дальнейшем нам понадобится более сильное понятие вычислимости функции на машине Тьюринга — понятие правильной вычислимости.
Определение 1. Будем говорить, что машина Тьюринга правильно вычисляет функцию f(x1, x2, ..., хп),, если начальное слово
01x1 01x2 0...01xn 0 она переводит в слово q0 01f ( x1 ,x2 ,...xn ) 0...0 и при этом в процессе работы не пристраивает к начальному слову новых ячеек на ленте ни слева, ни справа. Если же функция f не определена на данном наборе значений аргументов, то, начав работать из указанного положения, она никогда в процессе работы не будет надстраивать ленту слева.
Пример 1. Приведем программы машин Тьюринга, правильно вычисляющих функции S(x) = х+ 1 и 0(х) = 0. Функция S(x) =х+ 1 осуществляет перевод: q101x0 => q001x+1. Ее программа:
q10→ q2 П; q21→ q21 П; q20→ q31; q31→ q31 Л; q30→ q00. Функция O(x) = 0 осуществляет перевод: q101x0 => q000x+1. Ее программа: q10→ q2 0П; q21→
q21 П; q20→ q30Л; q31→ q40; q40→ q30Л, q30→ q00. Соответствующую машину Тьюринга обозначили О.
В Задачнике (№ 12.24) разобрана работа машины А, называемой «перенос нуля», которая осуществляет перевод слова 001x0 в слово 01x00. Причем как в
54
