2.2.2. Построение класса общерекурсивных функций
Математиками были предприняты попытки построения вычислимых функций, не являющихся примитивно-рекурсивными, и такие функции были получены Это позволило сделать вывод, что класс примитивно-рекурсивных функций не охватывает всех вычислимых функций и нуждается в расширении. Однако нас ограничивает, прежде всего, принятая форма индукции (схема V), которая определяет функцию через уже известные функции и .
Пример 2.3. Пусть для примера 2.2 нас интересует значение (3, 5). Формально проанализируем, какие операции нам нужно совершить, чтобы пользуясь схемой (A) и (B), вычислить (3, 5).
1. Подставим в (B) вместо переменных числа n=2, x=5. Получим (3, 5)=(2, 5)+1.
2. Подставим в (B) n=1, x=5 и определим (2, 5): (2, 5)=(1, 5)+1.
3. Аналогично получим (1, 5)=(0, 5)+1.
4. Подставим в (A) x=5. Получим(0, 5)=5.
5. Заменим в выражении пункта 3 (0, 5) на 5, согласно пукту 4: (1, 5)=5+1=6.
6. Заменив (1, 5) в выражении пункта 2 её значением из пункта 5, получим (2, 5)=6+1=7.
7. Наконец, заменив (2, 5) в выражении пункта 1 её значением из пункта 6, получим (3, 5)=7+1=8.
В рассмотренном примере нам для организации вычислений понадобилось лишь две операции:
1) подстановка чисел на место переменных;
2) замена вхождений, то есть замена в одном из равенств входящей в него левой части другого равенства на его правую часть ( или наоборот).
Если некоторое равенство может быть выведено с помощью этих двух операций из заданной системы равенств Е, то говорят, что это равенство выводимо в системе Е.
Определение.
Функция (
)
называется общерекурсивной,
если существует такая конечная система
равенств Е, что для любого набора чисел
найдётся такое одно и только одно числоy*,
что равенство (
)=y*
может быть выведено из Е
с помощью конечного числа применений
операций подстановок числа на место
переменных и замены вхождений.
Говорят, что Е рекурсивно определяет функцию . Здесь не требуется, чтобы значения функции вычислялись с помощью её значений в предыдущих точках; не требуется, чтобы входящие в систему Е вспомогательные функции были всюду вычислимы; не фиксируется никакая схема индукции. Требуется только, чтобы система равенств Е так определяла данное значение с помощью других значений и некоторых значений вспомогательных функций, чтобы во всех точках можно было однозначно вычислять на основании системы Е.
Приведенное определение общерекурсивной функции не конструктивно, так как не раскрывает механизма вычислительной процедуры нахождения числа y*. Можно, конечно, попробовать выводить из Е все возможные равенства до тех пор, пока не встретится равенство, которое нас интересует. Однако при таком подходе нет никакой гарантии, что этот процесс перебора не продлится неопределённо долго (ср. с лабиринтом).
Процессу перебора
можно придать определённую регулярность,
так чтобы этот процесс годился для
вывода равенства(
)=y*
за конечное, но не ограниченное заранее
число шагов.
Отметим, что
равенство (
)=y*
может быть представлено в эквивалентной
форме (
,
y)=0. Последнее
равенство в общем случае имеет вид (
,
y)=0; этому
выражению может быть поставлен в
соответствие предикат P(
,
y), истинный
в случае =0..
Гёдель предложил метод сведения любого алгоритма к численному алгоритму путём специальным образом организованной нумерации любых выражений. Этот метод носит название гёделизация. Рассмотрим этот метод.
Включим все условия задачи, доступные для переработки данным алгоритмом A, в занумерованную неотрицательными целыми числами последовательность A0, A1, A2, ..., An, ... Совершенно аналогично записи возможных решений также включим в занумерованную последовательность B0, B1, B2, ..., Bm, ...
Теперь можно любой алгоритм, перерабатывающий запись условий An в запись решения Bm, свести к вычислению значений некоторой числовой функции m=(n), т.е. можно говорить об алгоритме, который перерабатывает номер записи условия в номер записи решения. Этот алгоритм будет численным алгоритмом.
Очевидно, что если есть алгоритм, решающий исходную задачу, то имеется и алгоритм вычисления соответствующей функции. Справедливо и обратное утверждение.
Гёдель предложил рассматривать запись некоторого числа n в форме
n=... где p0=2, p1=3, p2=5 и вообще pm - m-е простое число.
Из этой записи видно (в силу теоремы о единственности разложения любого числа на простые множители), что каждому числу n однозначно соответствует набор a1, a2, .., am и, наоборот, каждому набору a1, a2, ..., am однозначно соответствует число n. Например, при n=60 имеем: 60 = 22 31 51 , т.е. a1 = 2, a2 = 1, a3 = 1.
C помощью этого способа мы можем нумеровать теперь любые упорядоченные последовательности, состояшие из m чисел. Расмотрим следующие примеры.
1. Каждой паре чисел a1 и a2, для которой мы ищем её наибольший общий делитель q, может быть поставлен в соответствие гёделевский номер этой пары
n=.. некоторый Алгоритм Евклида сведётся тогда к вычислению функции q =(n).
2. Пусть требуется занумеровать все слова в некотором алфавите A. Это легко сделать, поставив в соответствие каждой букве алфавита какое-либо число. Тогда каждому слову в алфавите A будет соответствовать последовательность чисел. Проводя затем обычным способом гёделизацию, получим гёделевский номер этой последовательности. Ясно, что номер слова определяется выбранной системой соответствий между буквами и числами. Теперь легко пронумеровать все последовательности слов (например, все дедуктивные цепочки). Здесь также имеется однозначное соответствие последовательности слов и последовательности гёделевских номеров этих слов. Проведя гёделизацию вторично, мы можем определить гёделевский номер самой последовательности гёделевских номеров отдельных слов.
Итак, с помощью гёделизации арифметические алгоритмы сводятся к вычислению значений целочисленных функций. Аналогично любой нормальный алгоритм Маркова может быть также сведен к вычислению значений целочисленных функций. Поэтому алгоритм вычисления значений целочисленных функций можно считать универсальной формой алгоритма.
Оказывается, что
путём гёделизации процесс перебора
всех выводов сводится к применению
оператора
наименьшего числа
.
Введение в рассмотрение этого оператора
приводит к иному способу определения
рекурсивных функций.
Оператор наименьшего
числа
ставит в соответствие примитивно-рекурсивному
предикатуP(
,
y)(или
примитивно-рекурсивной функции (
,
y), представляющей
предикат P
) примитивно-рекурсивную функцию (
)
следующим образом:
(
)=yy
z|
P(
,
y)=
y
y
z
|
(
,
y)=0(2.5)
при условии
(
x1)(
x2)...(
xn)
(
y)y
z
| P(
,
y)(2.6)
или
(
x1)
(
x2)
... (
xn)
(
y)y
z
|(
,
y)=0,(2.7)
где z в общем случае может быть примитивно-рекурсивной функцией переменных
,
то есть
z=z(
). (2.8)
Утверждение.
Любая
общерекурсивная функция (
)
может быть представлена в виде
(
)={y|(
,
y)=0}, (2.9)
где
и
- это примитивно-рекурсивные функции,
причём для функции
справедливо выражение
(
x1)
(
x2)
... (
xn)
(
y)
|(
,
y)=0. (2.10)
Типичной ситуацией
применения
-оператора
является построение обратных функций.
Допустим, что для некоторой функцииy=f(x)
существует обратная функция, то есть
для каждого натурального y
существует единственное значение x,
для которого
f(x)=y; в таком
случае обратная функция x=(y)
может быть определена посредством
-оператора:(y)=
x
|f(x)=y.
Многие функции
анализа, такие как показательная cx
и степенная
xc
, определены на всём натуральном ряде,
если параметр c
выбран подходящим образом. Однако этого
нельзя утверждать об обратных функциях;
например, logcx
или
,
вообще говоря, не будет натуральным
числом даже при натуральномc.
В таких случаях удобно рассматривать
арифметические варианты обратных
функций, которые заключаются в следующем:
в качестве значений функции объявляется
целая часть истинных значений функции,
то есть
](y)[,
где ]x[
- целая часть числа x.
Теперь ясно, что исходя из функции у=cx
или y=xc,
можно определить арифметические
обратные функции посредством
-
оператора:
]logr(y)[
=
x
| rx+1>y;
]
[
=
x
|(x+1)
r>y.
Рекурсивное
описание называется примитивно-рекурсивным,
если в нём не участвует
-оператор,
то есть допускаются только операторы
суперпозиции, введения фиктивных
переменных и примитивной рекурсии.
Если к уже известным
нам схемам определения
примитивно-рекурсивных функций добавить
схему VI, составленную из выражений (2.9)
и (2.10), то мы получим в результате конечного
числа применений схем I-VI общерекурсивную
функцию (
).
Таким образом, примитивно-рекурсивные функции являются частным случаем общерекурсивных функций; всякая примитивно-рекурсивная функция есть общерекурсивная функция, но не наоборот.
