Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TA / 2.2 Функции.doc
Скачиваний:
31
Добавлен:
14.04.2015
Размер:
133.02 Кб
Скачать

2.2. Вычислимые и рекурсивные функции.

Арифметическая функция y=(x1, x2, ...,xn) — это целочисленные функции, зависящие от целочисленных значений аргументов, т.е. это функция, построенная на множестве {0, 1, 2, ...}. Под f понимается суперпозиция операций сложения, вычитания, умножения и деления, операций определения абсолютного значения результата при вычитании и целой части - при делении, а также некоторых специальных операций, например,

min(x, y) = .

Заметим здесь же, что логические функции являются частным случаем арифметических функций, а “мостом”, связывающим арифметику и логику, являются предикаты.

Арифметические функции, значения которых можно вычислять посредством некоторого алгоритма, называются вычислимыми функциями. Понятие “вычислимые функции”, основанное на интуитивном смысле алгоритма, также является интуитивным. Однако между ними имеется существенная разница: совокупность вычислителных процессов, удовлетворяющих признакам 1-5 алгоритма (п. В.1), очень обширна; напротив, совокупность вычислимых функций для самых разных процессов, удовлетворяющих признакам 1-5, оказалась одной и той же, и при том легко описываемой в обычных математических терминах. Точно описанная совокупность арифметических функций, совпадающая с совокупностью всех вычислимых функций при самом широком до сих пор известном понятии алгоритма (см. признаки 1-5), носит название совокупности рекурсивных функций.

2.2.1. Построение класса примитивно-рекурсивных функций

Рассмотрим, каким образом может быть построен класс рекурсивных функций.

Определение. Функция y=(x1, x2, ..., xn) называется алгоритмически вычислимой (просто вычислимой), если существует алгоритм, позволяющий определить значение функции при любых значениях переменных х1, х2, ..., хn.

Определение. Предикат Р(х1, х2, ..., хn), определённый на множестве целых чисел, называется алгоритмически разрешимым (просто разрешимым), если существует алгоритм для определения значений предиката Р при любых значениях переменных х1, х2, ..., хn.

Эти определения являются неточными, поскольку ещё не сформулировано точно понятие алгоритма. Для их уточнения построим класс вычислимых функций, начав с элементарных. Элементарными являются все функции вида:

(x)=x+1, (y)=12y, (a, b, c)=ab+c, (b)=b2 (=bb) и т.п.

Рассмотрим эти функции подробнее. Если в функции (x)=x+1 положить x=0 (начальное значение) и затем многократно использовать эту формулу с предыдущим значением, то таким путём мы можем получить все числа натурального ряда. Многократное применение одной и той же формулы (вычислительного процесса) называют итерацией. Операцию сложения двух чисел a+b можно представить как применение формулы x+1 b раз, если в качестве начального значения x положить a; таким образом, сложение двух целых чисел - это итерация добавления единицы. Нетрудно видеть, что произведение an=a+a+...+a - n раз повторенное сложение (умножение - итерация сложения).

Функция может быть представлена в виде=d+c, где d=ab, так что включает в себя две операции: умножение, как итерацию сложения, и операцию сложения, как итерацию добавления единицы (в последнем случае полагаем d начальным значением для x). Все эти функции растут довольно медленно и по этому признаку их относят к элементарным.

Рассмотрим операцию возведения в степень. Для функции (b) имеем bn= bb...b - n раз повторенное умножение на число b, то есть это итерация умножения: bn =. Эта функция, хотя и растёт довольно быстро, является ещё элементарной, так как она выражается через произведение.

Построим еще более быстро растущую функцию, которая является итерацией возведения в степень: (0, a)=a, (1, a)=aa, (2, a)= ... !!!, и вообще,

(n+1, a)=a(n, a). (2.1)

Функция (2.1) растёт чрезвычайно быстро; эта функция, начиная с некоторого а=а*, мажорирует все элементарные функции, то есть для любой элементарной функции (a) найдётся такое число m*, что будет выполняться неравенство а)<(m*, a) для всех аа*.

Таким образом, итерация возведения в степень позволяет получить неэлементарную функцию. В то же время (n, a) заведомо вычислима. Действительно, пусть мы хотим вычислить значение (n, a) при любых n=n*, a=a*. При a=a* формула (2.1) даёт

(n+1, a*)=(a*) (n, a*) . (2.1’)

Обозначим (a*)m = (m); (m)- элементарная, всюду однозначно вычислимая функция. Алгоритм её вычисления сводится к повторенному m раз умножению на a*. Запись (см. (2.1’))

(n+1, a*)=( (n, a*)) (2.2)

связывает значение функции  в данной точке с её значением в предыдущей точке.

Достаточно теперь задать начальное значение (0, a*) = a*, чтобы получить вычислительную процедуру, которая последовательно даёт следующие значения:

(1, a*)=((0, a*))=(a*),

(2, a*)=( (1, a*))=((a*)),

(3, a*)= ((2, a*))=(((a*))),

. . .

Этот процесс следует продолжать, пока не будет достигнуто значение (n*, a*).

Очевидно, этим способом функция определена всюду и однозначно, так как вычисление её значений сводится к вычислению значений функции (m), которая является всюду определённой и однозначной.

Рассмотрим подробнее способ определения функции (n, a). Эта функция была задана по индукции: было задано начальное значение функции (0, a), и был указан способ вычисления её значения по предыдущим значениям с помощью допустимых операций. Как видим, был применён метод математической индукции. Используем этот метод в качестве основы для определения вычислимой функции, Но сперва несколько уточним и расширим схему определения по индукции.

Обозначим через x функцию “следовать за”, которая означает переход к следующему элементу заданного множества; для множества натуральных чисел функция x совпадает с x+1. Общую схему определения вычислимой функции (x) теперь можно уточнить следующим образом:

1) задано (0);

2) для любого x указывается, каким образом значение (x) выражается в терминах x и (x):

(0)=q, (x)=(x, (x)). (2.3)

В более общем случае в функции могут присутствовать ещё и неизменяемые в процессе индукции параметры x2, x3, ..., xn (обозначим ). Схема (2.3) тогда будет иметь вид:

(0, )=()

(y ,)=(y, y, ),(2.4)

Если фунции и известны и вычислимы, то с помощью схемы (2.4) для заданных x2=x2*, x3=x3*, ..., может быть организована процедура вычисления последовательно

(1, ), (2, )и т. д. Следовательно, схема, заданная выражениями (2.4), действительно определяет вычислимую функцию.

Добавим к описанной функции x также функцию-константу и функцию-тождество. Эти три функции будем считать первоначально известными или просто первоначальными.

Итак, мы имеем следующие первоначальные функции:

I. (x)=x - описанная выше функция следования, применённая для множества натуральных чисел.

II.()=q, где q - функция-константа.

III.()=xi - функция-тождество.

Включим в число допустимых операций схему подстановки:

IV.()=(1(), 2(), ..., m()).

И наконец, введём в систему допустимых операций схемы (2.3) и (2.4) определения вычислимой функции:

Va - соответствует схеме (2.3),

Vb - соответствует схеме (2.4).

Итак, схемы I-III задают первоначальные функции (как бы играют роль аксиом), а IV и V - правила вывода. Применяя многократно эти схемы, можно построить обширный класс вычислимых функций.

Определение. Функция () называется примитивно-рекурсивной, если она может быть определена с помощью конечного числа применений схем I-V.

Это определение раскрывает механизм построения класса примитивно-рекурсивных функций; этот класс включает в себя подкласс всех элементарных функций.

Отметим, что с помощью примитивной рекурсии могут быть определены конечные суммы и произведения вида

и .

Рассмотрим пример построения примитивно-рекурсивной функции.

Пример 2.2.. Определим функцию (n, x) так:

(0, x)=x, (A)

(y, x)=((y, x)). (B)

Согласно этой схеме имеем:

(1, x) = ((0, x)) = x = x+1,

(2, x) = ((1, x)) = ( x+1) = x+1+1 = x+2,

(3, x) = ((2, x)) = (x+2) = x+3, и вообще (n, x)=x+n .

Назовём представляющей функцией предиката P()такую функцию (), которая обращается в нуль лишь для тех и только тех x1, x2, ..., xn, для которых P()истинно. Тогда истинность P() соответствует равенству () = 0.

Определение. Предикат называется примитивно-рекурсивным, если существует примитивно-рекурсивная функция, представляющая этот предикат.

Из сущности механизма построения класса примитивно-рекурсивных функций видно, что каждая примитивно-рекурсивная функция является вычислимой. Верно ли обратное утверждение: всякая вычислимая функция — примитивно-рекурсивная? Иначе: все ли вычислимые функции охватывает этот механизм? Ответ на этот вопрос даётся в следующем параграфе.

Соседние файлы в папке TA