Sunteți pe pagina 1din 13

Reducerea schemelor de

recurenta

Student,
Burtea Bogdan-Florian
Grupa 405

Contents
Definitie schema.......................................................................................................................................3
Definitie recurenta...................................................................................................................................3
Functii primitiv recursive unare.............................................................................................................4
Functii primitiv recursive: cazul general...............................................................................................4
Enumerari primitiv recursive.................................................................................................................6

Definitie schema
Schemele sunt realizate din cuvinte cheie, variabile, date
constante (numere, caractere, siruri etc), spatii goale si comentarii.
Cuvintele

cheie,

variabilele

si

simbolurile

sunt

denumite

identificatori. Identificatorii pot fi formati din urmatorul set de


caractere:
Litere mici a-z
Litere mari A-Z
Cifre 0-9
Caractere ? ! .+ - * / < = > : $ % ~ & _ ^ @
Identificatorii trebuie delimitatii de spatii goale, paranteze, un sir
prin ghilimele duble () sau caracterul pentru comentarii (;). Orice
implementare trebuie sa recunoasca ca indentificator orice sir ce
respecta aceste reguli. Alte siruri de caractere, spre exemplu
-1234a, ce nu reprezinta un numar, pot fi recunoscute de unele
implementari, dar este de prefer sa fie evitate.
Numerele sunt constante. Daca adaugi un numar intr-o schema,
aceasta il va returna. Spre exemplu:
123137123971293719 => 123137123971293719
=>
2.32173981 => 2.32173981
2.2 + 1.1i => 2.2 + 1.1i

Definitie recurenta
Recurenta in informatica este o metoda a carei solutii depinde
de solutia altor probleme mai mici ale aceleasi probleme. Aceasta
abordare poate fi aplicata mai multor tipuri de probleme. Recurenta
este una dintre ideile principale ale informaticii.

Cele mai multe limbaje de programare accepta recuranta,


permitand unei functii sa se apeleze singura in codul programului.
O recurenta contine un set de valori initiale
x0 = b0 x1 = b1 xk = bk
si o formula recursive
xk = a(xn-1, xn-2, , x0) pentru n>k
de la care putem calcula valoarea lui x n, pentru orice n>k, de la
valoarile intiale

Functii primitiv recursive unare


Vom considera ca functii de baza functiile S(x) = x + 1, E(x) = x[x1/2]2(x-y = max (x-y,0),[x] este partea intreaga a lui x). Functia E(x)
reprezinta abaterea fata de cel mai apropiat patrat perfect mai mic
decat x.
Familia functiilor primitv recursive unare este cea mai mica
familie de functii naturale unare care contine functiile S si E si este
inchisa faa de operatiile de adunare (f(x) = g(x) + h(x)), compunere
(f(x) = g(h(x))) si iteratie (f(x)=gx(a)).
Definitia de mai sus este constructiva. Ea indica modul in care
pornind de la functiilede baza S si E putem construi celelalte functii
prin aplicarea de un numar finit de ori (si in orice ordine) a celor trei
operatii. De pilda, functia f(x) = x+4 este primitiv recursiva
deoarece se ibtine prin aplicarea de patru ori a compunerii asupra
functiei succesor f(x)=S(S(S(S(x)))).
Observatie. Orice functie primitiv recursiva unara este totala.
Demonstratia acestei afirmatii se face observand ca fybctuuke de
vaza S su E sunt totale si ca operatiile de suma, compunere si
iteratie pastreaza aceasta proprietate.

Functii primitiv recursive: cazul general


Sa presupunem ca g si h sunt functii naturale, totale, de n,
respeciv n+2 variabile. Atunci g si h definesc o functie unica de n+1
variabile prin relatiile:
f(x1, .... , xn, 0) = g(x1, ... ,xn),
(1)
f(x1, ... , xn, y + 1) = h(x1, ... , xn, y, f(x1, ..., xn, y))
Spunem ca f a fost definita prin recurenta primitiva cu ajutorul
functiilor g si h. Variabila y este variabila de recurenta; spunem ca f
a fost obtinuta prin recurenta primitiva dupa y. Variabilele x 1, ... , xn
se numesc parametri.
Operatia de recurenta primitiva este utilizata ca o regula de
compunere a functiilor cu scopul de a produce o noua functie.
Teorema.
Fie g si h doua functii naturale, totale, de n, respectiv n+2
variabile. Atunci exista o unica functie naturala f, totala, de n+1
variabile care verifica ecuatiile (1).
Demonstratie.
Pe baza acestei teoreme putem construi familia functiilor primitv
recursive ca fiind cea mai mica familie de functii naturale care
contine functiile constante (Cm(x1, ... , xn) = m), proiectii (Pi(x1, ... ,xn)
= x) = xi, 1 i n), succesor (S(x) = x + 1), si este inchisa faa de
operatiile de compunere functionala (f(x1, ... , xn) = h(g1(x1, ... ,xn), ...
...,gm(x1, ... ,xn))) si recurenta primitiva.
De exemplu, functiile (de doua variabile) suma, produs sunt
primitiv recursive. Intr-adevar, considerand mai intai functiile g 1(x) =
P1(x), g2(x, y, z) = (S P3)(x, y, z), g1(x) = x, g2(x, y, z) = z+1, putem
construi apoi functiile suma si produs prin recurenta primitiva astfel:

f1(x,0) = g1(x),
f1(x, y + 1) = g2(x, y, f1(x, y)),
f2(x,0) = C0(x),
f2(x, y + 1) = (f1(P1, P3))(x, y, f2(x, y)),
f1(x, y) x + y, f2(x, y) =xy.
In primul rand trebuie sa aratam ca orice functie care se obtine
din functiile S si E prin compunere si iteratie este primitiv recursiva.
Deoarece este clar ca operatiile de compunere si iteratie sunt cazuri
particulare ale operatiilor de compunere functionala si recurenta
primitiva, este suficient sa aratam ca E este primitiv recursiva.
Observatie. Orice functie primitiv recursiva este totala.
Exemplul 1. Functia exponentiala; xy : x0 = 1, xy+1 = x(xy)
Exemplul 2. Functia factorial; x! : 0! = 1, (x+1)! = (x+1)x!
Exemplul 3. Functia predecesor; Pd(x) : Pd(0) = 0, Pd(x) = x 1,
daca x>0; Pd(0) = 0, Pd(x+1) = x.

Enumerari primitiv recursive


Vom discuta de reducea studiului functiilor primitiv recursive la
studiul functiilor primitiv recursive unare. Reducerea se poate realiza
prin intermediul unor enumerari primitiv recursive a sirurilor finite
de numere naturale. Vom construi si analiza enumerarea lui Cantor
si enumerarea lui Gdel.
Intr-o prima etapa cautam o bijectie intre N 2 si N astfel inca
functia de la N2 la N, cat si componentele functiei nverse sunt
primitiv recursive. O astfel de bijectie se poate construi in felul
urmator:
x/y
0

0
0

1
1

2
3

3
6

4
1

5
15

...
...

0
1

1
1

1
2

3
4
5

9
2

0
.
.

4
2

3
.
.

30

...

39

...

94

...

115

...

.
.

.
.

0
7

7
.
.

1
3

...

3
2

2
5

6
.
.

8
1

22

6
1

5
.
.

Metoda de mai sus se numeste enumerarea lui Cantorl ea a fost


utilizata pentru prima oara de catre fondatorul teoriei multimilor
pentru a demonstra ca N2 si N au aceeasi cardinalitate (Cantor,
1874). Vom nota cu J: N2 N functia (de enumerare) a lui Cantor,
J(x,y) = (x + y)(x + y + 1)/2 + x = (x 2 + 2xy + y2 + 3x + y)/2. Este
evident ca J este functie primitiv recursiva.
Lema 1. Functia lui Cantor J este bijectiva.
Demonstratie. Vom arata ca pentru orice z exista o unica
pereche (x,y) astfel incat z = J(x, y).
Fie x, y, z trei numere astfel incat
2z=(x + y)(x + y + 1) + x
(1)
Atunci 8z + 1 = (2x + 2y + 1)2 + 8x. Deci, (2x + 2y + 1)2 8z +
1 < (2x + 2y + 3) 2 si (2x + 2y + 1)

8 z +1 < 2x + 2y + 3. In

concluzie, [

8 z +1 ] este egala fie cu 2x + 2y + 1, fie cu 2x + 2y +


2. Am obtinut urmatoarele relatii: [([ 8 z +1 ] + 1)/2] = x + y + 1 si
x + y = [([ 8 z +1 ] + 1)/2] 1. Din relatia (1) si ultima egalitate,
obtinem 3x + y = 2z- ([([ 8 z +1 ] + 1)/2] 1)2
Astfel spus, am dedus sistemul de ecuatii:

x + y = [([

8 z +1 ] + 1)/2] 1,
3x + y = 2z- ([([ 8 z +1 ] + 1)/2] 1)2,
Care admite o solutie unica. Daca membrul drept al fiecarei
ecuatii se noteaza cu Q1(z), respectiv Q2(z), atunci solutiile
sistemului se pot exprima astfel: x = [(Q2(z) - Q1(z))/2] = K(z), y =
Q1(z) - [(Q2(z) - Q1(z))/2] = L(z). Functiile K si L sunt primitiv
recursive.
Rezumand, fie z N. Notam cu r cel mai mare numar natural
care satisface inegalitatea 1 + 2 + 3 + ... + r z. Punem x = z (1
+ 2 + 3 + ... + r). Prin umare xr; fie y = r z. Atunci z = (1 + 2
+ ... + (x + y)) + x = (x + y) (x + y + 1)/2 + x = J(x,y). Deci z= J(x,
y) = J(K(z), L(z)).
Teorema 1.
Functia lui Cantor J este bijectiva si primitiv recursiva. Exista
doua functii primitiv recursive K si L astfel incat J(K(z),L(z)) = z,
K(J(x, y)) = x, L(J(x, y)) = y.
Teorema 2.(Teorema reducerii numarului de variabile la
functii primitiv recursive)
Orice functie primitiv recursiva f(x,y) se poate scrie sub forma
f*(J(x,y)), unde f* este functie primitiv recursiva unara.
Demonstratie. Aplicand Teorema 1 obtinem f*(x)=f(K(x),L(x)),
f*(J(x,y)) = f(K(J(x,y)), L(J(x,y))) = f(x, y).
Cazul general al reducerii se poate obtine imediat.
Corolarul 1. Orice functie primitiv recursiva se poate obtine din
functiile primitiv recursive unare, functia x + y, functiile identitate,
prin compunere functionala.
Demonstratie. Aplicand Teorema 2 si tinem seama de forma
functiei pereche (x + y)2 + x.

Trecem acum la stadiul enumerarilor primitiv recursive al


multimii tututor sirurilor finite de numere naturale. Vom prezenta
metoda lui Godel. Metoda foloseste proprietatea numerelor naturale
de a admite o descompunere unica in factori primitivi(numerele
prime sunt luate in oridine crescatoare). Daca n N, atunci exista un
sir finit (x0,...xk) astfel incat n =

px0 0 ...

, unde pi=pn(i) = al ipxk


k

lea numar prim. Reciproc, fiecarui sir (x0, ... , xk) de numere naturale
ii asociem numarul

px0 0 ...

; acest numar se numeste numarul


pxk
k

lui Godel asociat sirului (x0, ... , xk) si se noteaza cu <(x0, ... , xk)>.
Codificarea de mai sus (care admite mai multe variante) se numeste
enumerarea

lui

Godel(Godel,1931).

De

exemplu

<3,1,2>=23*31*52=600, <1,2,0,5> = 21*32*50*75 = 2 898 918.


Exista o anumita dificultate in manuirea enumerarii lui Godel
deoarece mai multe siruri de numere au acelasi numar Godel. De
exemplu, sirurile (1,2,3,4), (1,3,4,0), (1,3,4,0,0), ... au acelasi numar
Godel:

33

750.

Deoarece

orice

numar

natural

admite

descompunere unica in factori primi, rezulta ca posibilitatea ca doua


siruri sa aiba acelasi numar Godel se poate materializa numai
pentru siruri care difera prin numarul de 0 care urmeaza ultimului
numar nenul. Din context va rezulta lungimea sirului, informatie
care inlatura astfel ambiguitatea semnalata mai sus.
Daca K este un numar fixat, atunci <x 0, ... , xk> este o functie
primitiv recursiva de x0, ... , xk. Chiar daca lungimea sirului nu este
fixata procesul de calcul al numarului lui Godel al secventei (x 0, ... ,
xk) poate fi gandit ca un proces primitiv recursiv, daca numerele
x0, ... , xk sunt generate de functii primitiv recursive. Ca sa fixam
ideile, sa presupunem ca f(i) este o functie primitiv recursiva si ca
f(i)=xi, oricare ar fi i. Numarul lui Godel atasat sirului (x 0, ... , xk) este
dat

de

formula

x 0 , ... , x k > pn (i)f (i)


i=0

Evident, functia g(k)= <x0, ... , xk> este primitiv recursiva.

Problema inversa decodificarea unui numar Godel consta in


calcularea numerelor x0, ... , xk astfel incat <x0, ... , xk> = z, unde z
este un numar dat. Vom introduce functia exp(i, z) care calculeaza
pentru fiecare numar z>0 exponentul celui de-al i-lea numar prim in
descompunerea canonica a lui z. De exemplu, exp(2,40)=3,
deoarece 40=23*30*51; exp(i, 0)= 0. Functia exp realizeaza exact

decodificarea ceruta. Din formula exp(i, z) =

( pn(i))
x =0

rezulta ca

exp este primitiv recursiva.


Functia care calculeaza cel mai mic numar prim care divide un
numar dat este primitiv recursiva. Notand aceasta functie cu long
avem:
x

long ( z )=x [ pn(i)exp ( i , z) =z ]


i=0

Functia long se numeste functia lungime.


Ca o aplicatie imediata la metoda de enumerare a lui Godel vom
demonstra o noua proprietate de inchidere a familiei functiilor
primitiv recursive. Deocamdata vom exemplifica in cazul lui
Fibonacci: f(0) = f(1) =1, f(y+2)= f(y) + f(y+1). Functia lui Fibonacci
este construita printr-un procedeu inductiv care difera de recurenta
primitiva: valoarea functiei in punctul y+1 depinde nu numai de
valoarea functiei in punctul y, ci si de valoarea functiei in punctul y1. Vom arata ca functia lui Fibonacci este primitiv recursiva. Mai
general, vom arata ca o functie definita inductiv pentru care
valoarea ei in punctul y+1 depinde de valorile functiei in punctele 0,
..., y este primitiv recursiva.
Solutia este urmatoarea. Sirul f(0), f(1), ... , f(y) poate fi
reprezentat prin numarul lui Godel asociat, <f(0), ... ,f(y)>. Tinand
seama de rezultatele stabilite mai sus pentru numerele lui Godel va
fi suficient sa scriem f(y+1) in functie de <f(0), ... ,f(y)>.
Presupunem date functiile g si h. Atunci exista o unica functie f
care satisface ecuatiile:

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


f(x1, .... , xn, y+1) = h(x1, .... , xn, y, < f(x1, .... , xn, 0) , ... , f(x1, ....
, xn, y) >).
Vom spune ca f a fost definita prin recurenta ereditara cu
ajutorul lui g si h.
Propozitia 1. Familia functiilor primitiv recursive este inchisa
fata de recurenta ereditara.
Demonstratie. Construim functia auxiliara:
t(x1, ... , xn, y) = <f(x1,...., xn, 0), ... , f(x1, ... , xn, y) >.
Este clar ca f(x1, ... , xn, y+1) = h(x1, ... , xn, y, t(x1, ... , xn, y)).
Functia t poate fi definita prin recurenta primitiva cu ajutorul
functiilor g si h. Intr-adevar,
t(x1, .... , xn , 0) = 2f(x1, .... , xn, 0) = 2g(x1, .... , xn),
t(x1, .... , xn, y + 1) = t(x1, .... , xn, y) pn(y + 1)h(x1, .... , xn, y, t(x1, ...
,xn,y))

Deci t este primitiv recursiva. Din t poate fi regasita f in felul


urmator:
f(x1, ... , xn, y) = exp(y, t(x1, .... , xn, y)), formula care arata ca f
este primitiv recursiva.
Corolarul 2 . Functia f definita prin ecuatiile
f(x1, .... , xn , 0) = g1 (x1, .... , xn ),
f(x1, .... , xn , 1) = g2 (x1, .... , xn ),
f(x1, .... , xn , y+1) = h (x1, .... , xn, y, f(x1, .... , xn , y) , f(x1, .... , xn ,
y-1)),
unde g1, g2 si h sunt functii primitiv recursive, este primitiv
recursiva.
Demonstratie.
Construim functia h(x1, .... , xn , y, z) = eq(y, 0) g2 (x1, .... , xn ) +
gr(y, 0) h(x1, .... , xn , y, exp(y, z),exp(y-1,z)). Atunci f(x1, .... , xn , 0) =
g1 (x1, .... , xn ), f(x1, .... , xn , y+1) = h (x1, .... , xn, y,< f(x1, .... , xn ,

0) ,..., f(x1, .... , xn , y)>). Cum h este primitiv recursiva din Propozitia
1, rezulta ca f este primitiv recursiva.
Exemplu. Functia lui Fibonacci este primitiv recursiva. Pentru a
arata acest lucru este suficient sa remarcam ca functia lui Fibonacci
satisface ipotezele Corolarului 2.
Corolarul 3. Fie f o functie definita de ecuatiile:
f(x1, .... , xn , 0) = g (x1, .... , xn ),
f(x1, .... , xn , y+1) = h (x1, .... , xn, y, f(x1, .... , xn , t(x1, .... , xn ,
y))).
Daca g, h si t sunt primitiv recursive si t(x 1, .... , xn , y) y,
oricare ar fi x1, .... , xn , y, atunci f este primitiv recursiva.
Demonstratie. Construim functia primitiv recursiva:
h(x1, .... , xn , y, z)= h (x1, .... , xn, y,exp( t(x1, .... , xn ,y), z)).
Atunci: f(x1, .... , xn , y+1) = h (x1, .... , xn, y, f(x1, .... , xn , t(x1, .... ,
xn , y))) =
= h(x1, .... , xn , y, < f(x1, .... , xn, 0) , ... , f(x1, .... , xn, y) >).
Aplicand Propozitia 1 deducem ca f este primitiv recursiva.

Bibliografie
1. Brian Harvey, Matthew Wright, Simply Scheme: Introducing Computer
Science, MIT Press, 1999
2. R. Kent Dybvig, The Scheme Programming Language, MIT Press, 2003
3. Richard E. Crandall, Carl Pomerance, Prime Numbers: A Computational
Perspectives, Springer Science & Business Media, 1 ian. 2001
4. Recursive Functions and Metamathematics: Problems of Completeness and
Decidability, Gdel's Theorems, Springer Science & Business Media, 30 sept.
1999
5. Cristian Sorin CALUDE: Complexitatea calculului ; aspecte
calitative, Editura Stiinific i Enciclopedica, Bucureti, 1982.

S-ar putea să vă placă și