Казахстан, Алматы |
Рекурсивные функции
Оценки скорости роста. Функция Аккермана
Обратимся теперь к вопросу, который можно было бы задать уже давно: существуют ли общерекурсивные, но не примитивно рекурсивные функции? Мы приведем два доказательства существования таковых. Первое исходит из общих соображений:
Теорема 81. Существует всюду определенная вычислимая функция двух аргументов, универсальная для класса всех примитивно рекурсивных функций одного аргумента.
Очевидно, что если U такая функция, то функция d, для которой d(n)=U(n,n)+1, будет всюду определенной, вычислимой и будет отличаться от любой примитивно рекурсивной функции (от n -ой в точке n ).
Всякая примитивно рекурсивная функция получается из базисных с
помощью некоторой последовательности операций подстановки и
рекурсии. Ясно, что такую последовательность можно описать
словом в конечном алфавите так сказать, программой (в
которой последовательно определяются различные примитивно
рекурсивные функции и для каждой написано, из каких других она
получается и с помощью каких операций). Из всех программ отберем
программы для одноместных функций (разумеется, в качестве
промежуточных функций можно использовать функции с любым числом
аргументов). Множество таких программ разрешимо, их можно
пронумеровать вычислимым образом. Функция (результат применения функции, заданной
программой номер n, к числу x ) будет вычислима и по
построению будет универсальной для класса примитивно рекурсивных
функций.
Однако интересно указать и более конкретную причину, мешающую некоторым вычислимым функциям быть примитивно рекурсивными. Вот одна из возможностей: примитивно рекурсивные функции не могут быстро расти. Эта идея восходит к Аккерману, который построил функцию, растущую быстрее всех примитивно рекурсивных функцию Аккермана. Сейчас мы изложим эту конструкцию (хотя детали построения будут иными).
Определим последовательность функций .
от одного аргумента. (Все эти функции будут всюду определенными.)
Положим
. Определяя
,
мы будем
использовать такое обозначение: f[n](x) означает f(f(...f(x)...)),
где функция f использована n раз. Так вот,
![\alpha_{i} (x) = \alpha_{i-1}^{[x+2]}(x)](/sites/default/files/tex_cache/774950bbc0542e339cd619a59b07ead3.png)
(почему удобно применять функцию ровно x+2 раза, мы увидим чуть позже).
Очевидные свойства (формально их можно доказать по индукции):
-
при всех i и x ;
-
возрастает с возрастанием x ;
-
возрастает с возрастанием i (для каждого фиксированного x );
-
.
Теперь можно оценить скорость роста любой примитивно рекурсивной функции.
Теорема 82. Пусть f примитивно рекурсивная функция n аргументов. Тогда найдется такое k, что

при всех x1,...,xn.
Идея проста можно оценить скорость роста композиции функций, зная оценки для каждой из них; аналогично для рекурсии. Формально говоря, доказательство использует " индукцию по построению" примитивно рекурсивных функций.
Для базисных функций утверждение очевидно. Посмотрим на подстановку. Пусть
f(x)=g(h1(x),...,hk(x))
(для краткости мы пишем одну букву x, имея в виду вектор переменных). Пусть оценивает все функции h1,...,hk и функцию g сверху, то есть
при всех i и x, а также
(здесь max(u) означает максимальный элемент в наборе u ). Тогда f(x) не превосходит

(мы пользуемся указанными выше свойствами функций ).
Похоже (но немного сложнее) дело обстоит с рекурсией. Пусть функция f определяется рекурсивно:
f(x,0)=g(x); f(x,n+1)=h(x,n,f(x,n)).
(Здесь x также обозначает набор нескольких переменных.) Пусть
функции g и h оцениваются сверху
функцией . Тогда

(в последнем переходе мы пользуемся тем, что ). Аналогично
и вообще
![f(x,i)\le \alpha_N^{[i+1]}(\max(x))\le \alpha_{N+1}(\max(i,\max(x))),](/sites/default/files/tex_cache/162d23f2568bb48511938f9843ddfff4.png)
что и требовалось доказать.
Заметим, что каждый оператор подстановки или рекурсии
увеличивает номер верхней оценки на 1, так что функция, в
определении которой не более 100 операторов, растет не
быстрее .
Очевидным следствием полученной оценки является такое утверждение:
Теорема 83. Функция растет быстрее любой примитивно
рекурсивной функции.
Отметим, что определение функции Аккермана (точнее,
функции
) вполне
можно назвать рекурсивным одно значение этой функции
определяется через другие, с меньшим первым аргументом. Оно
является примером рекурсивного определения, не сводящегося к
примитивной рекурсии.
90. Покажите, что прямой пересчет (в возрастающем порядке) бесконечного примитивно рекурсивного множества может не быть примитивно рекурсивной функцией.
91. Покажите, что функция, обратная к примитивно рекурсивной биекции i : N -> N, может не быть примитивно рекурсивной.
92. Покажите, что для любой одноместной примитивно рекурсивной функции h и для любой трехместной примитивно рекурсивной функции g рекурсивное определение
f(x,0)= h(x); f(x,i+1)= g(x,i, f(2x,i))
задает примитивно рекурсивную функцию.