Скачиваний:
112
Добавлен:
01.05.2014
Размер:
7.48 Mб
Скачать

Рекурсивные функции

Определим класс примитивно рекурсивных функций [1], указав некоторый исходный запас принадлежащих этому классу функций, а также два вида операций, которые будучи применены к элементам нашего класса, порождают функции, по определению также принадлежащие ему. Будем далее понимать под натуральными числами все целые неотрицательные числа (включая ноль).

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

Нуль-функция, обозначаемая z, есть функция одной переменной. Она принимает нулевое значение для каждого натурального значения аргумента:z(x)=0.

Функция следования sзависит от одной переменной и приписывает всякому натуральному числу следующее за ним натуральное число. Таким образомs(0)=1, s(1)=2, s(2)=3,...

Для всякого положительного целого nопределимnпроектирующих функций отnпеременных, выбирающихi-ое (i=1,2,...,n) число во всяком набореnнатуральных чисел: idin(x1,...,xi,...xn)=xi.

Проектирующие функции часто называют функциями выбора. Из исходного запаса базисных функций - функцийz,s, и бесконечного множества проектирующих функций мы можем строить новыепримитивно рекурсивныефункции с помощью операций двух видов:композицииипримитивной рекурсии.

Если f- некоторая функция mпеременных, а g1,...,gm-функцииnпеременных каждая, то функцияh, определяемая равенством:

h(x1,...,xn)=f(g1(x1,...,xn),...,gm(x1,...,xn)),

называется функцией, полученной из f,g1,...,gmв результатекомпозиции (подстановки). Сокращенно будем изображать этот факт следующей формулой:

h=Cn[f,g1,...,gm ].

Операция примитивной рекурсииопределяется соотношениями:

h(x,0)=f(x), h(x,s(y))=g(x,y,h(x,y)).

В случае выполнения этих соотношений говорят, что функция h получается путем примитивной рекурсии из функцийfиg. Сокращенно:

h=Pr[f,g].

Определим теперь более широкий класс функций рекурсивные (всюду определенные и частичные) функции. Этот класс состоит из тех же базисных функций (функция следования, нуль-фунция, проектирующие функции), а также всех функций, получающихся из них применением путем конечного числа применений трех типов операций: композиции, примитивной рекурсии иминимизации. Операция минимизации Mn[f],которая применяется к функцииn+1 переменных, и порождает функцию отnпеременных определяется следующим образом:

{ y, еслиf(x1,...,xn,y)=0, причемf(x1,...,xn,t)определено и положительно для

Mn[f]={ всехt<y

{ не определено в противном случае.

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

1. Сумма: sum(x,y)=x+y=Pr[id11,Cn[s,id33]](x,y).

2. Произведение: prod(x,y)=x*y=Pr[z,Cn[sum,id13,id33]](x,y).

3. Степенная функция: exp(x,y)=xy=Pr[Cn[s,z],Cn[prod,id13,id33]](x,y).

4. Факториал: fac(y)=y!=Pr[s(0),Cn[prod,Cn[s,id12],id22]](y).

5.

{ предшествующее yчисло (y-1), еслиy>0 ;

pred(y)={

{ 0, если y=0.

pred(y)=Pr[0,id12](y)

6. { x-y, еслиx>y;

dif(x,y)={

{ 0 , в противном случае.

dif(x,y)= Pr[id11,Cn[pred,id33]](x,y).

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

7. ½x-y½=dif(x,y)+dif(y,x)

8. { 0 , если y=0;

sg(y)= {

{ 1 , если y>0.

9. __{ 1 , еслиy=0;

sg(y)= {

{0 , если y>0.

sg(y)=dif(1,dif(1,y))

__

sg(y)=dif(1,y)

10. Определение путем перебора случаев. Предположим, что функция fзадана в виде:

{g1(x,y), еслиC1,

{ .

f(x,y)= { .

{ .

{gn(x,y), еслиCn

где C1,..., Cn- некоторая полная система взаимно исключающих друг друга условий, а функцииg1,..., gnпримитивно рекурсивны. Характеристической функцией условияCiназовем функциюci(x,y), принимающую значение 1 для пар значений аргументов(x,y), удовлетворяющих этому условию, и равную 0 для всех остальных пар(x,y). Если теперь характеристические функцииc1,...cnусловийC1,..., Cn, фигурирующих в определении, примитивно рекурсивны, то примитивно рекурсивной оказывается и функция f, поскольку она определяется через функции gi иciс помощью равенства:

f(x,y)=g1(x,y)c1(x,y)+...+gn(x,y)cn(x,y)

11. Функция max(x,y)- наибольшее из чисел xи y.

{ x, еслиx³y,

max(x,y)= {

{ y,еслиx<y.

В обозначениях примера 10 имеем g1=id12, g2=id22,

__

c1(x,y)=sg(dif(y,x)), c2(x,y)=sg(dif(y,x)).Поэтому max(x,y)выражается в виде композиции примитивно рекурсивных функций:

__

max(x,y)=x×sg(dif(y,x))+y×sg(dif(y,x)).

12. min(x,y)=наименьшее из чиселx,y=

__

=y×sg(dif(y,x))+x×sg(dif(y,x)).

13. Результат суммирования значений функции:

g(x1,...,xn,y)=f(x1,...,xn,0)+...+f(x1,...,xn ,y)=

y

=åf(x1,...,xn ,i)

i=0

Эта функция оказывается примитивно рекурсивной, если такова функция f, что следует из рекурсивных уравнений:

g(x1,...,xn ,0)=f(x1,...,xn ,0),

g(x1,...,xn ,s(y))=f(x1,...,xn,s(y))+g(x1,...,xn ,y)

14. Результат перемножения значений функции:

g(x1,...,xn,y)=f(x1,...,xn,0)×...×f(x1,...,xn,y)=

y

=Pf(x1,...,xn,i)

i=0

Эта функция оказывается примитивно рекурсивной, если такова функция f, что следует из рекурсивных уравнений:

g(x1,...,xn,0)=f(x1,...,xn,0),

g(x1,...,xn,s(y))=f(x1,...,xn,s(y))×g(x1,...,xn,y)

15. Логическая композиция условий. Если C- некоторое условие, для которогоc(x,y)служит характеристической функцией, тоСn[sg,c]есть характеристическая функция отрицания условияC.Таким образом, если C- некоторое условие на x,y, то характеристическая функция для отрицанияC, будет

_ __

c(x,y)=sg(c(x,y)).

Предположим теперь, что C1,..., Cn- некие условия наx,yс характеристическими функциямиc1,...cn соответственно. Тогда характеристической функцией условияC1Ù...ÙCn(конъюнкции условийC1,..., Cn) будет просто произведение функцийci:c1(x,y)×...×cn(x,y).

Поскольку любая логическая формула может быть выражена через конъюнкцию и отрицание, то и характеристическая функция любого такого составного условия оказывается примитивно рекурсивной, если только примитивно рекурсивны характеристические функции составляющих условий. Например, характеристическая функция d(x,y)дизъюнкции условийC1,C2 выражается следующей формулой

_________

___ ___ ___ ___ ___

d(x,y)=sg(sg(c1(x,y))×sg(c2(x,y))), так как C1ÚC2= C1ÙC2

16. Навешивание ограниченных кванторов. Если дано условие С(x,y) на переменныеxиy,то можно образовать новые условия с помощью навешивания ограниченного квантора общности,("i)(i£y ® С(x,i)) (сокращенно,("ii£y)С(x,i)),или ограниченного квантора существования,($i)(i£y ® С(x,i)) (сокращенно,($ii£y)С(x,i)). Если характеристическая функцияс(x,y)условияС(x,y)примитивно рекурсивна, то примитивно рекурсивны и характеристические функцииuиeусловий, полученных навешиванием ограниченных кванторов, ибо

y y

u(x,y)=Pc(x,i), e(x,y)=sg(Sc(x,i)).

I=0 i=0

17. Минимизация при наличии примитивного рекурсивного ограничения. Говорят, что функция fотnпеременныхрегулярна, если для каждойn-ки натуральных чиселx1,...,xnсуществует такое натуральное числоy, чтоf(x1,...,xn,y)=0. Предположим, что функцияf(x1,...,xn,y)примитивно рекурсивна и регулярна. ТогдаMn[f]- всюду определенная рекурсивная функция. Предположим теперь, что имеется некоторая примитивно рекурсивная функцияg, ограничивающего величину наименьшегоy, для которогоf(x1,...,xn,y)=0. В таком случае функцияMn[f]оказывается примитивно рекурсивной, что вытекает из равенства

g(x1,...,xn) i

Mn[f]={S sg(Pf(x1,...,xn,j)).

i=0 j=0

18. Ограниченная минимизация. Пусть Mnw[f]наименьшийy, заключенный между 0 иwвключительно, для которого f(x1,...,xn,y)=0, и 0, если такого y не существует. ФункцияMnw[f]оказывается примитивно рекурсивной, если только примитивно рекурсивна функцияf(неважно, регулярна она или нет), так как для нее имеется следующее определение путем перебора случаев:

{0, если("y)(y£w®f(x1,...,xn,y)¹0),

Mnw[f]= {w i

{Ssg(Pf(x1,...,xn,j)), в противном случае.

I=0 j=0

19. Ограниченная максимизация. Пусть Mxw[f]- наибольший y, заключенный между 0 иwвключительно, для которогоf(x1,...,xn,y)=0, и 0, если такогоyне существует. Заметим, что если такой yсуществует, то он может быть охарактеризован как наименьшийy, не превосходящийw, для которогоf(x1,...,xn,y)=0,f(x1,...,xn,y+1)¹0,f(x1,...,xn,y+2)¹0 ,..., f(x1,...,xn,w)¹0. Таким образом, можно так определитьMxwчерезMnw:

__

Mxw[f]= Mnw [Cn[sg,g]],

где g- характеристическая функция условия

f(x1,...,xn,y)=0Ù("u)(u£w® (u>y ® f(x1,...,xn,u)¹0)).

20. rm(x,y)=остаток от деленияyна x. Эта функция примитивно рекурсивна, что следует из следующих формул:

rm(x,0)=0,rm(x,s(y))=s(rm(x,y))×sg(|x-s(rm(x,y))|).

21. Функция dlm(x), равная 1 приx=0 и числу делителейx,когдаx>0,примитивно рекурсивна, так как

__

dlm(x)=Ssg(rm(y,x))

y£x

22. Характеристическая функция sm(x)условияSimple(x):"x- есть

простое число" примитивно рекурсивна, так как

__ __ __

sm(x)=sg(dif(dlm(x),2) + sg(|x-1|) + sg(|x-0|)

(Число является простым тогда и только тогда, когда оно имеет не более двух делителей и отлично от 0 и 1)

23. Пусть p(x)- функция, принимающая для каждогоx, значение, равное простому числу с номеромxпри пересчете всех простых чисел в порядке возрастания, начиная сp(0)=2. Оказываетсяp(x) есть примитивно рекурсивная функция. В самом делеp(0)=2 иp(x+1)=Mny£p(x)!+1[f(x,y)], гдеf(x,y)- характеристическая примитивно рекурсивная функция отрицания условия(p(x)<y)ÙSimple(y). В дальнейшем мы будем для краткости писать pxвместоp(x).

24. Всякое целое положительное число x однозначно разложимо в произведение степеней простых чисел: x=p0a0 p1a1... pkak. Обозначим через(x)iпоказательaiв таком разложении. Еслиx=1, то(x)i=0 при любом i. Положим, наконец, (x)i=0 для любогоi, еслиx=0. Функция(x)iпримитивно рекурсивна, так как при любом x

__

(x)i=Mny<x[sg(rm(piy,x))×sg(rm(piy+1,x))].

25. Обозначим через lh(x)число отличных от нуля показателей в разложенииxна простые множители. Пустьlh(0)=0. Функцияlh примитивно рекурсивна. Действительно

__

lh(x)=Ssg(f(x,y)),

y£x __

где f(x,y)=sm(y)×sg(rm(y,x))×sg(x).

26. Если число x=2a03a1...pkak "представляет" последовательность положительных чисел a0, a1,..., akа число y=2b0×3b1 ×...pmbm "представляет" последовательностьb0,b1,..., bm, то числоxày=2a03a1...pkakpk+1b0×pk+2b1 ×...pk+m+1bm "представляет" последовательностьa0, a1,..., ak b0,b1,..., bm, которая получается, если вторую из данных последовательность записать непосредственно вслед за первой. Здесь мы имеемk+1=lh(x),m+1=lh(y)иbj=(y)j. Нетрудно видеть, чтоxyявляется примитивно рекурсивной функцией, так как является композицией функций, примитивная рекурсивность которых нами уже доказана . При записи повторных операций скобки можно опускать, так как(xày)àz=xà(yàz)

27. y/x= частное от деленияyнаx (остаток от деления отбрасываем).

Схема примитивной рекурсии для вычисления этой функции выглядит следующим образом. __

0/x=0, s(y)/x=y/x+sg ( |x- s(rm(x,y))|)

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

Функция z Функция sвычисляется Функция idmn

вычисляется модифицированной программой вычисляется

пустой из примера 3. модифицированной

программой: В начальный и конечный программой

ящик 2 пуст моменты [1]=x; из примера 3.

всегда. в начале [2]=0; В начале и конце

в конце [2]=s(x).[1]=x1,...,[n]=xn;

в конце [n+1]=xm.

Композиция.Предположим, что нам даныm+1программ,

из которых необходимо создать единую программу.

Задача решается просто: нужно лишь так перемещать результаты вычислений, чтобы они в нужное время оказывались в нужных ящиках. На следующем рисунке показывается, как это делается для случая m=2, n=3. Выделимm+nрегистров, которые не используются ни в одной изm+1 данных программ. Обозначим эти регистрыp1, p2, q1,q2,q3. В создаваемой нами программе аргументыx1,x3,x3 хранятся в начальный момент времени в ящиках[1], [2 ], [3],а все остальные ящики пусты. После остановки абака результат должен храниться в ящике c номеромn+1, то есть [4]. В нашей блок-схеме будет использоваться программа из примера 2:” Вытряхните ящик iв ящикj”.

Примитивная рекурсия. Покажем теперь, что если у нас есть программы вычисляющие функцииf иg, то мы по ним всегда можем построить абак для вычисления функцииh=Pr[f,g]. Рассмотрим случай, когда функцияhзависит от двух переменных. Случаи, когда функция зависит от нескольких переменных или только от одной, рассматриваются аналогичным образом.

Пусть данные программы представлены следующими блок-схемами.

Необходимо на их основе создать следующую блок-схему

На следующем рисунке показано решение этой задачи. Ящик p, который не используется ни в одной из данных программ используется в качестве счетчика. Первоначально в него помещается значение второго аргумента функцииh(x,y). Затем на каждой итерации цикла мы его уменьшаем на 1, до тех пор пока ящик pне опустеет.

Покажем теперь, что имея абак, вычисляющий функцию f, можно построить абак для вычисления функции Mn[f]. Для определенности будем считать, что функцияfзависит от двух переменных. На рисунке изображена граф-схема абака, который вычисляет функциюMn[f](x). В ящике 1 находятся в начальный момент xкамней. Все остальные ящики пусты. В конце работы (если абак остановится когда-нибудь) в ящике 2 будет значение функцииMn[f](x).

Таким образом, мы доказали, что рекурсивные функции вычисляются на абаках. Покажем теперь, что вычислимые по Тьюрингу функции рекурсивны.