Documente Academic
Documente Profesional
Documente Cultură
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.
De exemplu:
E1 E2 nseamn E1 -converge la E2
E1 E2 nseamn E1 -converge la E2
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
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
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
Exemple:
((x. y. add x y) 3) 4 (y. add 3 y) 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
n reducerile (ii) i (iii) din exerciiul de mai sus, una dintre ele ncepe cu aceeai lambdaexpresie, dar reducre redex-urile n ordine diferit.
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
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
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]
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)
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.