- •Глава 4 алгоритмы и машины тьюринга
- •4.1. О понятии алгоритма. Тезис Чёрча
- •4.2. Машина Тьюринга
- •Примеры решения задач
- •Задачи для самостоятельного решения
- •4.3. Рекурсивные функции
- •О s I
- •Примеры решения задач
- •Задачи для самостоятельного решения
- •Разрешимые и перечислимые множества
- •Универсальные функции
- •Задачи для самостоятельного решения
- •4.5. Алгоритмически неразрешимые задачи
- •4.6. О сложности алгоритмов
- •Содержание
Примеры решения задач
Построить машину Тьюринга, вычисляющую функцию:
а)
б)![]()
Решение. а) Фактически надо, имея следующую ситуацию на ленте
уничтожить все
единицы, кроме первой. Пусть
состояние, в котором машина ищет крайнюю
правую единицу, попутно стирая все
единицы, начиная со второй,
движение влево до оставшейся единицы.
Программа машины выглядит так:
![]()
б) Словесно алгоритм
вычисления функции
можно сформулировать так: будем заменять
в массивах единиц последние единицы
нулями до тех пор, пока в одном или обоих
массивах не останется ровно одна единица;
затем заменим все нули, стоящие между
массивами из единиц, единицами; наконец,
удалим две последние единицы.
![]()
![]()
Программа машины выглядит так:
|
|
находим последнюю единицу в первом массиве из единиц и стираем её, если она не единственная |
|
|
то же делаем со вторым массивом из единиц |
|
|
возвращаемся к крайней левой единице |
|
|
заменяем промежуточные нули единицами
|
|
|
стираем последние две единицы и останавливаемся у крайней левой единицы |
Определить, какую функцию
вычисляет машина Тьюринга, заданная
следующей программой:
|
|
|
|
Решение. Если
внимательно проследить за работой
машины, то можно заметить, что если
вначале на ленте была только одна
единица, то машина, перейдя в состояние
её сотрёт и затем будет работать
бесконечно долго, а если на ленте более
одной единицы, то она сотрёт последнюю
из них и остановится около первой.
Поэтому![]()
Задачи для самостоятельного решения
Построить машину Тьюринга, реализующую функцию:
а)
б)![]()
Ответы:
|
а) |
|
|
(ответ неоднозначен) |
|
|
|
|
б) |
|
|
(ответ неоднозначен) |
|
|
| ||
|
|
| ||
|
|
|
Определить, какие функции вычисляют следующие машины Тьюринга:
|
а) |
|
|
(функция двух переменных) |
|
|
| ||
|
б) |
|
|
(функция одной переменной)
|
|
|
| ||
|
|
|
Ответы:а)
б)![]()
4.3. Рекурсивные функции
Напомним, что в
этой главе множество
натуральных чисел содержит 0, т.е.
Будем рассматривать функции (возможно,
частичные)![]()
Таким образом, если
то либо
либо
не определено. Введём в рассмотрениепростейшие функции
О s I
Эти функции могут быть вычислены с помощью соответствующего механического устройства (например, на машине Тьюринга). Определим операторы, которые по одной или нескольким заданным функциям строят новые функции.
Оператор
суперпозиции. Пусть даны функция
от
переменных и
функций
от
переменных.. Суперпозицией функций
называется функция
![]()
Мы говорим, что
функция
получается применением оператора
суперпозиции
к функциям
и пишем
![]()
Например,
(s,o)
– это функция
s(o
т.е. функция, тождественно равная 1, а
(s,s) – это функция![]()
Оператор
примитивной рекурсии. Пусть даны
функции
и
Построим функцию
Пусть зафиксированы значения
Тогда положим:
![]()
Эти
равенства определяют функцию
однозначно. Функция
называется функцией, полученной с
помощью оператора
примитивной рекурсии. Используется
запись
![]()
Индуктивное
определение функции (продемонстрированное
в операторе примитивной рекурсии) в
математике не редкость. Например,
индуктивно определяются степень с
натуральным показателем:
![]()
факториал:![]()
и т.д.
Функции, которые
могут быть получены из простейших о
s
I
применением конечного числа раз
операторов суперпозиции и примитивной
рекурсии, называютсяпримитивно
рекурсивными.
Пример. Функция
примитивно рекурсивна. Проверим это.
Действительно, мы имеем:![]()
Это есть схема примитивной рекурсии,
так как
I
а
s![]()
(s,
Здесь
I
а
s![]()
(s,I![]()
Аналогично
доказывается, что функции
![]()
(считаем по определению![]()
и многие другие являются примитивно
рекурсивными.
Отметим, что
примитивно рекурсивные функции всюду
определены(т.е. определены для всех
значений их аргументов). Действительно,
простейшие функцииo,s,I
являются всюду определёнными, а
применение операторов суперпозиции и
примитивной рекурсии ко всюду определённым
функциям даёт также всюду определённые
функции. Значит, такая функция, как
![]()
примитивно
рекурсивной быть не может. Рассматривать
функцию
здесь мы не имеем права, так как значения
функций должны быть натуральными
числами. Однако можно рассмотреть
функцию
![]()
Проверим,
что она примитивно рекурсивна. Докажем
вначале, что функция
примитивно рекурсивна. Действительно,![]()
что служит схемой примитивной рекурсии
для функции
Наконец,![]()
схема примитивной рекурсии для![]()
Существенно более широким классом функций, чем примитивно рекурсивные функции, является класс рекурсивныхфункций (определение см. ниже). В литературе эти функции называют такжечастично рекурсивными. Для их определения введём ещё один оператор.
Оператор
минимизации. Пусть дана функция
Зафиксируем какие-либо значения
первых
переменных и будем вычислять![]()
и т.д. Если
наименьшее натуральное число, для
которого
(т.е. значения![]()
все существуют и не равны
то полагаем
Таким образом,
![]()
![]()
Если
такого
нет, то считаем, что
не определено. Итак, возможны три случая:

существуют и не
равны
а

существуют и не
равны
а
не существует;
существуют при
всех
и отличны от
Если
имеет место 1-й случай, то
а если 2-й или 3-й, то
не определено. Про функцию
полученную таким образом, говорят, что
она получена из
применением оператора минимизации
Мы пишем![]()
Оператор минимизации
– это очевидное обобщение оператора
взятия обратной функции. Обобщение
довольно глубокое, так как от функции
не требуется, чтобы она была взаимно
однозначной (по переменной![]()
Функции, которые
могут быть получены из простейших о
s
I
применением конечного числа раз
операторов суперпозиции, примитивной
рекурсии и минимизации, называютсярекурсивными.
Как уже говорилось ранее, класс рекурсивных функций шире класса примитивно рекурсивных функций. Это ясно из того, что он содержит не только всюду определённые функции. Докажем, например, что функция
![]()
является
рекурсивной. Действительно,
а ранее было установлено, что функция
примитивно рекурсивна.
Рекурсивные функции
отражают наше интуитивное представление
о функциях, вычислимых некоторым
механическим устройством. В частности,
они вычислимы на машинах Тьюринга (см.
предыдущий раздел). Наоборот, всякая
функция, вычислимая на машине Тьюринга,
рекурсивна. Мы не будем проверять этот
факт, так как это потребовало бы слишком
много времени и места. Полное доказательство
можно найти, например, в книге Мальцева
А.И. “Алгоритмы и рекурсивные функции”,
М., “Наука”, 1965. В предыдущем разделе,
впрочем, были построены машины Тьюринга,
реализующие функции o
s
I
С другой стороны, не всякая функция
натуральных аргументов и даже не всякая
функция одного аргумента является
рекурсивной,. В самом деле, рекурсивных
функций имеется лишь счётное число
(т.е. их можно занумеровать натуральными
числами), а все функции
образуют несчётное множество. Существование
нерекурсивных функций и является
“математической причиной” наличия
алгоритмически неразрешимых задач (о
них см. раздел 4.5).
