Sunteți pe pagina 1din 11

Capitolul I

Introducere n -calcul (lambda-calcul)


-calculul (sau lambda-calculul) este o teorie a funciilor, care iniial a fost
dezvoltat de logicianul Alonzo Church ca fundament al matematicii. Aceast teorie a fost
elaborat n anii 1930, cu mult nainte de a fi inventate computerele . Puin mai devreme (prin
anul 1920), Moses Schnfinkel dezvoltase o alt teorie a funciilor bazat pe ceea ce numim
n zilele noastre teoria combinatorilor.
n anii 30, Haskell Curry a redescoperit i extins teoria lui Schnfinkel i a
demonstrat (artat) c era echivalent cu -calculul. Referitor la acest lucru Kleene a artat c
-calculul este un sistem universal de calcul (n sensul c poate exprima toate funciile intuitiv
calculabile); a fost primul sistem de genul acesta care a fost riguros analizat.
n anii 50, John McCarthy a fost inspirat de -calcul, inventnd limbajul de
programare LISP.
La nceputul anilor 60, Peter Landin a artat (demonstrat) cum pot fi descrise
(declarate, specificate) semanticile limbajelor de programare imperativ, prin traducerea
(transpunerea) lor n -calcul. De asemenea, el a inventat prototipul unui puternic limbaj de
programare numit ISWIM [24]. Acesta a introdus principalele notaii ale programrii
funcionale i a influenat design-ul pentru ambele feluri de limbaje: funcional i imperativ.
Dezvoltnd pe aceast teorie, Christopher Strachey a pus bazele domeniului
important al semanticilor denotaionale. Unele chestiuni tehnice din lucrrile teoretice ale lui
Strachey au condus pe matematicianul i logicianul Dana Scott la descoperirea teoriei
domeniilor, care acum este una dintre cele mai importante pri din informatica teoretic.
n timpul anilor 70, Peter Henderson i Jim Morris au pornit de la lucrarea lui
Landin i au scris un numr important de lucrri, argumentnd c programarea funcional ar
constitui un instrument important pentru productorii de software. Aproape n aceeai
perioad, David Turner a demonstrat despre combinatorii lui Schnfinkel i Curry c ei ar
putea fi folosii ca un fel de cod al calculatorului pentru a compila i executa programe scrise
n limbaje de programare funcional.
Asemenea calculatoare pot beneficia de proprietile matematice ale lambda
-calcului pentru a realiza o execuie paralel a programelor. n timpul anilor 80, mai multe
grupuri de cercetare au preluat ideile lui Henderson i Turner i au nceput s lucreze pentru a
implementa computere pentru programare funcional prin conceperea unor arhitecturi
speciale , unele dintre acestea avnd mai multe procesoare.
Noi astzi, privind retrospectiv, vedem c o ramur obscur a logicii
matematice st la baza dezvoltrii teoriei limbajelor de programare, din ea rezultnd:
(i)
(ii)
(iii)
(iv)

Studiul chestiunilor fundamentale privind calculabilitatea


Designul limbajelor de programare
Semantica limbajelor de programare
Arhitectura computerelor

1.1. Sintaxa i semantica lambda-calcului


Lambda-calcul este o notaie pentru a defini funcii. Expresiile notaiei sunt
numite -expresii i fiecare asemenea expresie definete o funcie. Se va vedea ulterior cum
pot fi folosite funciile pentru a reprezenta o larg varietate de date i structuri de date,

inclusiv numere, perechi, liste etc. De exemplu, va fi demonstrat cum o pereche arbitrar de
numere (x,y), poate fi reprezentat ca lambda-expresie. Ca o convenie de notaie, numele
mnemonicelor sunt evideniate n bold (ngroat) sau subliniat, n expresii lambda particulare,
de exemplu: 1 este lambda-expresie (definit n subcapitolul 2.3), care este folosit pentru
reprezentarea numrului unu (1).
Sunt numai 3 feluri de -expresii:
(i) variabilele: x, y, z etc. Funciile ascunse n spatele unor nume de variabile
sunt determinate de valorile (din context) de care sunt legate aceste
variabile. Asemenea valori care denot funcii se numesc abstracii (vezi 3
mai jos). Noi folosim V1, V2,V3 ... etc. pentru variabile arbitrare.
(ii) aplicarea de funcii : dac E1 i E2 sunt -expresii, atunci i (E1,E2) este
tot o -expresie care indic rezultatul aplicrii funciei indicate de E1,
funciei indicate de E2. E1 este numit rator (de la operator) i E2 este
numit rand (de la operand). De exemplu, dac (m, n) indic o funcie (De
menionat c n metalimbajul pe care l folosim pentru a vorbi despre
lambda-calcul sum este o lambda-expresie, n timp ce + este un simbol
matematic !) reprezentnd o pereche de numere m i n (vezi subcap. 2.2)
iar sum (suma) indic o funcie de adunare din -calcul, atunci aplicarea
(sum(m, n)), indic (nseamn) de fapt, suma m+n.
(iii)formule abstracte (abstracii): dac V este o variabil i E este o expresie, atunci i V. E este o o expresie numit abstracie, avnd corpul
E (body E) i variabila legat V (the bound variable V) . Asemenea
abstracii indic, noteaz, funcii ce iau ca argument pe a i returneaz ca
rezultat funciaindicat de E, ntr-un context n care legtura variabilei V,
indic pe a. Mai specific, abstracia V. E indic o funcie care dac
primeste un argument E i l transform n ceva notat cu E [E/V] (notaia
nseamn rezultatul substituirii lui V cu E pentru toate apariiile libere ale
lui V n E, vezi subcap. 1.8). De exemplu, x.sum(x,1) indic o funcie de
adunare cu o unitate.
Folosind notaia BNF, sintaxa lambda-expresiilor este dat doar de 3 reguli:
<-expresie> ::= <variabila>
| (<-expresie > <-expresie >)
| ( <variabila > . <-expresie >)
Notnd cu V clasa de expresii <variabila> iar cu E, E1, E2, ...elemente cu
sintaxa din clasa <-expresie >, notaia BNF o simplificm scriind-o astfel:
E ::=V | (E1 E2) | V.E
unde: V variabila, (E1 E2) aplicarea i V.E abstracia

Descrierea a ceea ce nseamn -expresie, aa cum a fost exemplificat mai sus, este totui
vag i intuitiv. Logicienilor (Dana Scott, n [32]) le-au fost necesari 40 de ani pentru a o
face riguroas i folositoare. Nu vom intra n detalii privind istoricul acestei munci.
Un exemplu: (x. x) denot, indic funcia identitate: ((x. x) E) = E.
Exemplu: (x.(f. (f x))) indic funcia care atunci cnd se aplic lui E d (f.(f x))[E/x],
adic (f. (f E)). Aceasta este funcia care atunci cnd se aplic lui E d (f E)[E / f], cu alte
cuvinte (E E). n acest fel putem scrie c:
((x. (f. (f x))) E) = (f. (f E))
i
((x.(f. (f x))) = (E E)
Exerciiul 1: Descriei funcia indicat, denotat de (x. (z. z)).
Exemplu: Subcapitolul 2.3 descrie felul cum numerele pot fi reprezentate prin lambdaexpresii. Presupunem c acest lucru a fost fcut i c 0, 1, 2 ... sunt lambda-expresii ce
reprezint respectiv pe 0, 1, 2 ... . Presupunem c de asemenea add este o lambda-expresie ce
indic o funcie care ndeplinete (satisface):
((add m) n) = m+n
Atunci (x. ((add 1) x)) este o lambda-expresie ce indic sau denot funcia ce transform pe
n n 1+n, iar (x. (y. ((add x) y))) este o lambda-expresie indicnd (denotnd) funcia ce
transform pe m n funcia care aplicat lui n d m+n, numit (y. ((add m) y)).
Legttura dintre funciile sum (ii) de la nceputul acestui subcapitol (pagina 2) i funcia add
din exemplu anterior va fi explicat n subcapitolul 2.5.

1.2. Convenii de notaie


Urmtoarele convenii ajut la reducerea numrului de paranteze care trebuiesc scrise.
1. Aplicarea funciei asociaz la stnga, E1, E2 ... En nseamn ((... (E1 E2)...)En). De
exemplu:
E1 E2
nseamn (E1 E2)
E1 E2 E3
nseamn ((E1 E2) E3)
E1 E2 E3 E4 nseamn ((E1 E2) E3) E4)
2. V. E1 E2 ... En nseamn (V. (E1 E2 ... En)). n acest fel domeniul de aciune al lui V
se extinde la dreapta pe ct de mult este posibil.
3. V1 ...Vn. E nseamn (V1. (... .(Vn. E) ...)). De exemplu:
x y. E nseamn (x. (y. E))
x y z. E nseamn (x. (y. ( z. E)))
x y z w. E nseamn (x. (y. ( z. ( w. E))))
Exemplu: x y. add y x nseamn (x. (y. ((add y) x))).

1.3. Variabile libere i variabile legate


O apariie a unei variabile V ntr-o lambda-expresie spunem c e liber, dac nu este sub
incidenta unei V (ca la cuantori) , altfel o numim legat.

De exemplu:

liber legat liber legat

1.4. Regulile conversiei


n capitolul 2 este explicat cum pot fi lambda-expresiile folosite pentru a nota (reprezenta)
obiecte date ca numere, iruri etc. De exemplu, o expresie matematic ca (2+3) x 5 poate fi
reprezentat ca lambda-expresie i rezultatul acesteia 25, de asemenea poate fi notat
(reprezentat) ca lambda-expresie.
Procedura simplificrii lui (2+3) x 5 = 25 va deveni o procedura numit conversie (sau
reducere). Regulile de -conversie descrise mai jos, sunt foarte generale. Totodat, atunci
cnd sunt aplicate pentru lambda-expresii ce reprezint expresii matematice, ele simuleaz
evaluarea expresiilor, cunoscut din matematic.
Sunt 3 tipuri de -conversie numite: -conversie, -conversie i -conversie (originea
denumirii acestor notaii nu este clar). n stabilirea regulilor conversiei, notaia E[E/V] este
folosit pentru a explica rezultatul substituirii lui E pentru fiecare apariie liber a lui V n E.
Substituia este valid dac i numai dac nici o variabil liber din E un devine legat n
E[E/V]. Substituirea este descris n mai multe detalii n subcapitolul 1.8.
Regulile -conversiei
-conversie.
Oricare abstracie a formei V. E poate fi convertit la V. E[V/V] demonstreaz c
substituia lui V pentru V n E este valid.
-conversie.
Oricare aplicaie a formei (lV. E1) E2 poate fi convertit n E1[E2/V],, demonstreaz c
substituia lui E2 pentru V n E1 este valid.
-conversie.
Oricare abstracie a formei V. (E V) n care V nu are apariii libere n E poate
fi redus la E.
Urmtoarele notaii vor fi folosite:
E1 E2 nseamn E1 -converge la E2

E1 E2 nseamn E1 -converge la E2

E1 E2 nseamn E1 -converge la E2

n subcapitolul 1.4.4. de mai jos aceast notaie este extins.


Cea mai important conversie este -conversia; este cea care poate fi folosit pentru a simula
evoluia mecanismelor arbitrare. -conversia este folosit s fac o manipulare tehnic a
variabilelor legate i -conversia exprim faptul c dou funcii care ntotdeauna au aceleai
soluii, avnd aceleai argumente, sunt egale (vezi subsapitolul 1.7.). n urmtoarele
subcapitole, sunt date mai multe explicaii i exemplea celor 3 tipuri de conversie (obs.:
conversie i reducere sunt folosite mai jos ca sinonime).

1.4.1. -conversie
O lambda-expresie (n mod obligatoriu o abstracie), creia o -reducere i se poate aplica, este
numit -redex. Termenul de redex este o prescurtare de la expresie redus. Regula conversiei spune c variabilele legate pot fi redenumite altfel, dac dovedim c nu apare un
conflict de nume.
Exemple
x. x y. y

x. fx y. fy

Nu este cazul n care


x. y. add x y y. y. add y y

pentru c substituia (y. add x y) [y/x] nu este valid, de vreme ce z ce nlocuiete x devine
variabil legat.
1.4.2. -conversie
O lambda-expresie (n mod obligatoriu o abstracie) creia i se poate aplica o -reducere, este
numit -redex. Regula -conversiei descrie practic evaluarea unui apel de funcie ntr-un
limbaj de programare: funcia V . E1 cu parametrul formal V si corpul E1.
E1 este evaluat ntr-un context n care fostul parametru formal V este legat de parametrul
actualul E2.
Exemple
(x. f x) E f E

(x. (y. add x y)) 3 y. add 3 y

(y. add 3 y) 4 add 3 4

Nu este cazul n care


(x. (y. add x y)) (square y) y. add (square y) y

pentru c substituirea (y. add x y) [(square y)/x] nu este valid, de vreme ce z este liber n
(square y), dar devine legat dup substituirea lui x n (y. add x y).
Este necesar ceva practic pentru a structura lambda-expresiile dup regulile din subcapitolul
1.3, n aa fel nct s identifici -redex-uri. De exemplu, considerm aplicaia
(x. y. add x y) 3 4 .
Punerea n paranteze conform conveniilor o extinde la forma:
(((x. (y. ((add x) y))) 3) 4)
ce a avut forma
((x. E) 3) 4
unde
E = (y. add x y)
(x. E) 3 este un -redex i poate fi redus la E[3/x].

1.4.3 -conversie
O lambda-expresie (n mod necesar o abstracie) creia o -reducere i poate fi aplicat, este
numit -redex. Regula -conversiei exprim proprietatea c dou funcii sunt egale, dac
dau acelai rezultate, cnd sunt luate n considerare aceleai argumente. Aceast proprietate
este numit extindere i este detaliat mai trziu n subcapitolul 1.7. De exemplu, conversia garanteaz (asigur) cx. (sin x) i sin nseamn de fapt aceeai funcie. La
general, V. (E V) indic funcia care cnd este aplicat unui argument E, returneaz (E V)
[E/V]. Dac V nu apare liber n E, atunci (E V)[E/V] = (E E) Astfel c, V. E V i E
amndou dau acelai rezultat, n spe EE, cnd este aplicat argumentelor care sunt la fel,
i de aici rezult aceeai funcie.
Exemple:
x. add x add

x. add x y add x

Nu este cazul c
x. add x x add x

pentru c x este liber n add x.


1.4.4 Conversii generalizate
Definiiile lui -conversie, -conversie i -conversie pot fi generalizate dup cum urmeaz:
E1 E2 dac E2 poate fi obinut din E1 prin -conversie a oricrui subterm.

E1 E2 dac E2 poate fi obinut din E1 prin -conversie a oricrui subterm.

E1 E2 dac E2 poate fi obinut din E1 prin -conversie a oricrui subterm.

Exemple:
((x. y. add x y) 3) 4 (y. add 3 y) 4

(y. add 3 y) 4 add 3 4

Prima este o -conversie n sensul general pentru c (y. add 3 y) 4 este obinut din ((x. y.
add x y) 3) 4 (care ea nsi nu este un -redex), reducnd subexpresia (x. y. add x y) 3).
Cteodat vom scrie o secven de conversii ca cele dou de mai sus, astfel:
((x. y. add x y) 3) 4 (y. add 3 y) 4 add 3 4

Exerciiul 2
Care dintre cele 3 -reducii de mai jos sunt conversii generalizate (reducerea unei
subexpresii) i care sunt conversii n sensul celui definit de la pagina 4 (?)
(i) (x. x) 1 1

(ii) (y. y) ((x. x) 1) (y. y)1 1

(iii) (y. y) ((x. x) 1) (x. x)1 1

n reducerile (ii) i (iii) din exerciiul de mai sus, una dintre ele ncepe cu aceeai lambdaexpresie, dar reducre redex-urile n ordine diferit.

O proprietate important a -reducerilor este aceea c nu conteaz n ce ordine se fac


acestea, ntotdeauna se termin cu acelai rezultat. Dac exist mai multe redex-uri disjuncte
ntr-o expresie, o main le poate reduce n paralel. De menionat, totodat, c exist cteva
secvene de reducere, posibile, dar care nu se termin niciodat. Acest lucru este explicat mai
trziu n legtur cu teorema de normalizare din capitolul 2.9. Este una dintre problemele
curente i importante de cercetare pentru a cincea generaie de calculatoare, n a concepe un
procesor care realizeaz evaluarea paralel pentru a mri viteza de execuie a programelor
funcionale.

1.5. Egalitatea -expresiilor


Cele 3 reguli de conversie, pstreaz nelesul lambda-expresiilor: dac E2 poate fi convertit
la E2, atunci E1 i E2 indic (nseamn, denot) aceeai funcie. Aceast proprietate a
conversiei ar trebui intuitiv s fie clar. Este posibil s se dea o definiie matematic a funciei
indicate de o lambda-expresie i pe urm s dovedim c aceast funcie nu este schimbat de
, sau -conversie. Este surprinztor de dificil [33] s facem asta i nu este scopul acestei
cri.
Pur i simplu, vom defini dou lambda-expresii ca fiind egale, dac ele pot fi transformate,
una n cealalt printr-o secven de lambda-conversii nainte i napoi. Este important, s fim
clar nelei, n legtur cu diferena dintre egalitate i identitate. Dou lambda-expresii sunt
identice, dac sunt formate din exact aceleai secvene de caractere; sunt egale, dac una
poate fi convertit n cealalt. De exemplu, x. x este egal cu y. y, dar nu este identic cu
ea. Se folosete urmtoarea notaie:
E1 E2 nseamn c E1 i E2 sunt identice.
E1 = E2 nseamn c E1 i E2 sunt egale.
Egalitatea (=) este definit n termeni de identitate (L) i conversie (, i
), dup cum urmeaz. (?)
Egalitatea -expresiilor
Dac E i E sunt lambda-expresii, atunci, E = E, dac E L E sau exist
expresii E1, E2, E3, ... En, ca acestea:
1. E E1
2. E En
3. Pentru fiecare i, de asemenea
a) Ei Ei+1 sau Ei Ei+1 sau Ei Ei+1 sau
b) Ei+1 Ei sau Ei+1 Ei sau Ei+1 Ei.
Exemple
(x. x) 1 = 1
(x. x) ((y. y) 1 ) = 1
(x. y. add x y) 3 4 = add 3 4
Din definiia egalitii (=) rezult:
(i)
Pentru oricare E exist E = E (egalitatea este reflexiv).
(ii)
Dac E = E, atunci E = E (egalitatea este simetric).
(iii)
Dac E = E i E = E, atunci E = E (egalitatea este tranzitiv).
Dac o relaie este reflexiv, simetric i tranzitiv, atunci ea este numit
relaie de echivalen. Conform acestei definiii , = (egalitatea) este o relaie de echivalen.
O alt proprietate important a egalitii (=), este c dac E1 = E2 i E1 i E2
sunt dou lambda-expresii care difer n sensul c una conine pe E1 i cealalt pe E2, atunci
E1 = E2. Aceast proprietate este numit Legea lui Leibnitz. Este valabil pentru c aceeai

secven a reducerilor pentru a afla din E1 pe E2, poate fi folosit pentru a afla din E1 pe
E2. De exemplu, E1 = E2, atunci aplicnd Legea lui Leibnitz, V. E1 = V. E2.
Este esenial pentru substituiile folosite la i -reducii, ca ele s fie
substituii valide. Validarea cerut, respinge, de exemplu, ca x. (y. x) s fie -redus la y.
(y. y) (de vreme ce z devine legat dup substituirea lui x n y. x). Dac aceast substituie
nevalid a fost permis, atunci ar fi trebuit s rezulte c sunt egale:
x. y. x = y. y. y
Dar de vreme ce,
(x. (y. x)) 1 2 (y. 1) 2 1

i
(y. (y. y)) 1 2 (y. y) 2 2

vom fi constrni s concluzionm c 1 = 2. n mod general, prin nlocuirile lui


1 i 2, prin oricare alte expresii, se poate arta c oricare alte dou expresii sunt egale.
Exerciiul 3.
Gsii un exemplu care arat c dac substituirea n -reducere sunt permise s
fie non-valide, atunci rezult c oricare alte dou lambda-expresii sunt egale.
Exemplu
Dac V1, V2, ... Vn sunt toate distincte i nici una dintre ele nu apare liber n
oricare dintre E1, E2, ... En, atunci:
(V1 V2 ... Vn. E) E1 E2 ... En
= ((V1. (lV2 ... Vn. E)) E1) E2 ... En
((V2 ... Vn. E) [E1/V1]) E2 ... En
= (V2 ... Vn. E [E1/V1]) E2 ... En
.....
= E [E1/V1] [E2/V2] ... [En/Vn]
Exerciiul 4
n ultimul exemplu, unde a fost fcut presupunerea c V1, V2 ... Vn sunt toate
distincte i c nici una dintre ele nu apare liber, n oricare dintre E1, E2 ... En?
Exerciiul 5
Gsii un exemplu care s arate c dac V1 = V2, atunci, chiar dac V2 nu este
liber n E1, nu este neaprat cazul pentru
(V1V2. E) E1 E2 = E [E1/V1] [E2/V2]
Exerciiul 6
Gsii un exemplu care s arate c dac V1 V2, dar V2 apare liber n E1,
atunci nu este neaprat cazul ca
(V1V2. E) E1 E2 = E [E1/V1] [E2/V2]

1.6 Relaia
n capitolul anterior E1 = E2 a fost definit pentru a nsemna c E2 pentru a fi
obinut din E1, printr-o secven de conversii nainte sau napoi. Un caz special este cnd E2
este obinut din E1, folosind numai conversia nainte. Aceasta se scrie E1 E2.

Definiia lui
Dac E i E sunt lambda-expresii, atunci E E, dac E E sau exist
expresiile E1, E2, ... En astfel ca:
1. E E1
2. E En
3. Pentru fiecare i avem ori Ei Ei+1 sau Ei Ei+1 sau Ei + Ei+1

S observm c definiia lui este exact ca definiia =, cu excepia c partea a


doua de la punctul 3 lipsete.
Exerciiul 7
Gsii E, E astfel ca E = E, dar nu este cazul ca E E.
Exerciiul 8 (foarte greu!)
Artai c dac E1 = E2, atunci exist E astfel ca E1 E i E2 E. (Aceast proprietate este
numit Teorema lui Church-Rosser. Cteva consecine ale teoremei sunt discutate n
subcapitolul 2.9).

1.7 Extinderea
Presupunem c V nu apare liber n E1 sau E2 i
E1 V = E2 V
Atunci conform Legii lui Leibnitz
V. E1 V = V. E2 V
astfel, prin -reducere aplicat la ambele pri, vom avea
E1 = E2
Este adesea comod s demonstrm, c dou lambda-expresii sunt egale folosind aceast
proprietate, cu alte cuvinte s demonstrm c E1 = E2, demonstrnd c E1 V = E2 V pentru
civa V care nu apar liberi n E1 sau E2. Ne vom referi la asemenea demonstraii ca fiind prin
extindere.
Exerciiul 9:
Artai c
( f g x. f x (g x)) ( x y. x) ( x y. x) =x. x

1.8. Substituia
La nceputul subcapitolului 1.4 E [E/V] era definit ca fiind rezultatul
substituirii lui E pentru fiecare apariie liber a lui V n E. Substituirea s-a spus c este valid,
dac nici o vaiabil liber n E, devine legat n E [E/V]. n definiiile a i -conversiei, s-a
menionat c substituirile implicate, trebuie s fie valide. n acest fel, de exemplu, era doar
cazul c
( V. E1) E2 E1[E2/V]

atta timp ct substituia E1[E2/V] era valid.


Este foarte comod s extindem nelesul lui E [E/V], astfel c nu trebuie s ne facem
probleme despre validitate.
Aceasta este ndeplinit de definiia de mai jos, care are proprietatea c pentru toate expresiile
E, E1 i E2 i pentru toate variabilele V i V, avem:
( V. E1) E2 E1[E2/V] i V. E V. E [V/V]

Pentru a ne asigura c aceast proprietate este valabil, E [E/V] este definit recursiv pe
structura lui E, dup cum urmeaz:

E[E/V]

V (unde V V)

E1 E2

E1[E/V] E2 [E/V]

V. E1

V. E1

V. E1 (unde V V i
V nu este liber n E)

V. E1 [E/V]

V. E1 (unde V V i
V este liber n E)

V. E1 [V/V] [E/V] (unde V este o


variabil i nu este liber n E sau E1)

Aceast definiie particular a lui E [E/V] este bazat pe (dar nu identic cu) cea din anexa C
din [2].
Pentru a arta cum funcioneaz aceasta considerm (y. y x) [y/x]. Cum y este liber y,
ultimul caz din tabelul anterior se aplic. Cum z nu apare n y x sau y, avem:
(y. y x) [y/x] L z. (y x) [z/y] [y/x] L z. (z x) [y/x] L z. z y (?)
n ultima linie din tabelul anterior, alegerea particular a lui V nu este specificat. Oricare
variabil ce nu apare n E sau E1, va fi suficient.
O discuie serioas despre substituie poate fi gsit n cartea lui Hindley i Seldin [19], unde
diferite proprieti tehnice sunt enunate i demonstrate. Urmtorul exerciiu este luat din
aceast carte.
Exerciiul 10
Folosii tabelul de mai sus pentru a rezolva:
(i)
(y. x (x. x)) [(y. y x) / x].
(ii)
(y ( z. x z)) [(y. z y) / x].
Este simplu, chiar dac ia mai mult timp, a demonstra din definiia lui E [E/V
], c rezult:
(V. E1) E2 E1 [E2/V] i V. E V. E [V/V]
pentru toate expresiile E, E1 i E2 i pentru toate variabilele V i V.
n capitolul 3 se va arta cum teoria combinatorilor poate fi folosit pentru a
simplifica substituii complexe, n operaii mai simple astfel fiecare term devenind o expresie
format din combinatori. O notaie alternativa consta n a se folosi aa numiii nameless term
(termi fr nume) a lui De Bruijn [6]. Ideea lui De Bruijn este c variabilele pot fi gndite ca
nite pointeri pentru lambda-expresiile pe care le leag. n loc de labeling (etichetarea)
lambda-expresiilor cu nume (cu alte cuvinte variabile legate) i identificarea prin aceste nume,

numrul unul poate indica cel mai apropiat. Urmeaz numere succesive alocarte pentru
nivelurile upwards (n sus) ce trebuiesc parcurse. De exemplu, x. y. x y ar fi reprezentat
de 2 1. Ca un exemplu mult mai complicat, considerm expresia de mai jos, n care vom
indica numrul de nivele care separ o variabil de ce este legat de ea.

2 1
x. y. x y ( y. x y y)
3 1 1
n notaia lui De Bruijn aceasta este 2 1 3 1 1.
O variabil liber este o expresie reprezentat de un numr mai mare dect
adncimea celui mai de sus ; diferitelor variabile libere alocndu-li-se numere diferite. De
exemplu,
x. ( y. y x z) x y w
va fi reprezentat de
( 1 2 3) 1 2 4
De vreme ce sunt doar dou anterioare lui 3, acest numr trebuie s indice o
variabil liber; n mod similar exita doar o anterioar celei de-a doua apariii a lui 2 i a lui
4, deci acestea de asemenea trebuie s fie variabile libere. Observm c 2 nu poate fi folosit s
reprezinte pe w, de vreme ce acesta a fost folosit pentru a reprezenta variabila liber y; n
acest fel, alegem primul numr disponibil mai mare ca 2 (3 este deja folosit pentru a
reprezenta pe z). Trebuie avut grij pentru a aloca numere suficient de mari variabilelor libere.
De exemplu, prima apariie a lui z n x. z ( y. z) poate fi reprezentat de 2, dar a doua
apariie l cere pe 3, iar de vreme ce sunt aceleai variabile, trebuie folosit 3.
Exemplu
Cu schema lui De Bruijn x. x ( y. x y y) va fi reprezentat de 1( 2 1 1).
Exerciiul 11
Ce -expresie este reprezentat de 2( 2)?
Exerciiul 12
Descriei un algoritm pentru programa reprezentarea lui De Bruijn a expresiei
E[E/V] pornind de la reprezentarea lui E i a lui E.

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