Рекурсивные функции
Примитивно рекурсивные множества
Будем называть множество примитивно рекурсивным, если его характеристическая функция примитивно рекурсивна. (Вариант: если оно является множеством нулей примитивно рекурсивной функции; это то же самое, так как можно сделать подстановку в функцию .)
Пересечение и объединение примитивно рекурсивных множеств примитивно рекурсивны (сложим или перемножим функции, множествами нулей которых они являются). Дополнение примитивно рекурсивного множества примитивно рекурсивно. Отождествляя множества со свойствами, можно сказать, что конъюнкции, дизъюнкции и отрицания примитивно рекурсивных свойств будут примитивно рекурсивны.
Свойства x=y и примитивно рекурсивны ( x=y тогда и только тогда, когда ).
Функция f(x), заданная соотношением
f(x) = [ if R(x) then g(x) else h(x) fi ],
будет примитивно рекурсивной, если таковы функции g и h и свойство R. В самом деле, f(x) можно записать как , где r характеристическая функция свойства R.
Теперь можно записать формулу для прибавления единицы по модулю n (для чисел, меньших n ):
x+1 mod n = [ if x+1 = n then 0 else x+1 fi ]
После этого функцию x mod n (остаток от деления на n ) можно определить рекурсивно:
0 mod n = 0; (x+1) mod n = (x mod n) + 1 mod n.
Покажем, что ограниченные кванторы, примененные к примитивно рекурсивным свойствам (множествам), дают снова примитивно рекурсивные свойства. Это означает, например, что если свойство R(x,y) примитивно рекурсивно, то свойства
и
также примитивно рекурсивны. Чтобы убедиться в этом, заметим, что для функций ограниченный квантор соответствует перемножению или суммированию: если свойство R(x,y) равносильно r(x,y)=0, то
А произведение легко определить рекурсивно:
с суммированием можно поступить аналогичным образом.
После этого легко заметить, что свойство " быть простым" примитивно рекурсивно (число больше единицы, и любое меньшее число или меньше 2, или не является делителем).
Покажем теперь, что если график некоторой функции f примитивно рекурсивен и ее значения ограничены сверху некоторой примитивно рекурсивной функцией g, то сама функция f примитивно рекурсивна. В самом деле, если r характеристическая функция графика, то есть r(x,y)=1 при y=f(x) и r(x,y)=0 при (для простоты мы рассматриваем случай функций одного аргумента), то
а суммирование можно ограничить сверху выражением g(x) и воспользоваться примитивной рекурсивностью ограниченной суммы.
Отсюда легко вывести следующее утверждение: если функция g и свойство R(x,y) примитивно рекурсивны, то функция x f(x) = наименьшее y <= g(x), для которого R(x,y) (если для некоторого x такого y нет, то полагаем значение функции равным, скажем, g(x)+1 ) будет примитивно рекурсивной. В самом деле, график функции f легко описать с помощью ограниченных кванторов.
Такой способ определения функции называют ограниченным оператором минимизации в отличие от неограниченного, где нет заранее известной границы g(x). Как мы увидим, в неограниченном случае получающаяся функция не обязана быть примитивно рекурсивной.
Ограниченный оператор минимизации можно использовать, чтобы убедиться, что функция x (минимальное простое число, большее x ) примитивно рекурсивна (рассуждение Евклида о бесконечности множества простых чисел устанавливает, что это число не превосходит x!+1, а факториал примитивно рекурсивен). После этого функция n ( n -е простое число) легко определяется с помощью рекурсии.
Другие виды рекурсии
Слова " рекурсивное определение функции" можно понимать и в более широком смысле, нежели мы это делали (см. выше определение рекурсии, или примитивной рекурсии) как любой способ задания функции, который связывает значение функции в данной точке с другими ее значениями. Как мы увидим ниже при обсуждении функции Аккермана, есть такие схемы рекурсивных определений, которые выводят из класса примитивно рекурсивных функций. Но есть и такие, которые можно свести к рассмотренной нами схеме.
Мы приведем два примера последнего типа: совместное определение нескольких функций и использование произвольных меньших значений аргумента.
Совместная рекурсия. Пусть две одноместные функции f и g заданы соотношениями:
f(0) = a, g(0) = b, f(n+1) = F(n,f(n),g(n)), g(n+1) = G(n,f(n),g(n)),
где a и b некоторые числа, а функции F и G примитивно рекурсивные функции трех аргументов. Покажем, что тогда функции f и g примитивно рекурсивны.
Чтобы доказать это, нам потребуется примитивно рекурсивная нумерация пар такая функция (номер пары мы обозначаем квадратными скобками), которая была бы примитивно рекурсивна вместе с двумя обратными функциями (дающими по номеру пары ее первый и второй члены). Тогда мы сможем написать рекурсивное определение для функции h(n)=[f(n),g(n)]:
h(0) = [a,b], h(n+1) = [F(n,p1(h(n)),p2(h(n))),G(n,p1(h(n)),p2(h(n)))],
где функции p1 и p2 дают по номеру пары первый и второй ее члены. Если функция h примитивно рекурсивна, то и функции f и g (композиции h с функциями p1 и p2 ) также примитивно рекурсивны.
Осталось объяснить, как найти примитивно рекурсивную нумерацию пар. Можно заметить, что есть многочлен второго порядка с двумя переменными, задающий взаимно однозначное соответствие N x N -> N. Это соответствие видно из таблицы:
6 3 7 1 4 8 0 2 5 9
Примитивную рекурсивность обратных отображений p1 и p2 можно установить, воспользовавшись ограниченной минимизацией, так как p1(n) есть минимальное x <= n, для которого найдется y <= n, при котором [x,y]=n.
Менее симметричная нумерация пар может быть задана формулой [a,b]=(2a+1)2b-1. Можно также заметить, что нам не нужно, чтобы все числа были номерами каких-то пар, и воспользоваться нумерацией [a,b]=2a3b.
Заметим в заключение, что аналогичная конструкция применима для большего числа одновременно определяемых функций и для функций от большего числа аргументов.
Возвратная рекурсия. Следующее утверждение показывает, что при рекурсивном определении можно использовать не только значение в предыдущей точке, но и любое предшествующее значение.
Теорема 74. Пусть функция g одного аргумента примитивно рекурсивна, причем g(x)<x при x>0 ; пусть F примитивно рекурсивная функция двух аргументов; пусть c произвольная константа. Тогда функция h, определенная соотношениями
h(0) = c, h(x) = F(x,h(g(x))) при x>0
примитивно рекурсивна.
Чтобы доказать эту теорему, используем следующую нумерацию конечных последовательностей натуральных чисел: номером пустой последовательности считаем число 1, номером одноэлементной последовательности считаем число 2a+1, последовательность имеет номер 2a+13b+1, последовательность имеет номер 2a+13b+15c+1 и так далее (основания степеней простые числа). Будем обозначать номер последовательности через [a,b,...,z]. Эта нумерация в некотором смысле примитивно рекурсивна. Конечно, буквально это понимать нельзя, так как нумерация представляет собой " функцию с переменным числом аргументов". Но разные связанные с ней функции примитивно рекурсивны. В частности, таковы функции
- Length(x) = длина последовательности с номером x ;
- Select(i,x)=i -ый член последовательности с номером x ;
- Append(x,y)= номер последовательности, которая получается приписыванием числа y к последовательности с номером x.
Все эти функции (и другие аналогичные) сводятся к различным операциям с простыми числами и множителями, которые мы в сущности уже разбирали.
Теперь мы докажем, что функция
примитивно рекурсивна. В самом деле, H(0)=[c], а
H(k+1)= Append(H(k),F(k+1,Select(g(k+1),H(k)))).