Upload
muraru-mihaela
View
10
Download
0
Embed Size (px)
Citation preview
Paradigme de programareParadigme de programare2010-2011, semestrul 2
Curs 2
CuprinsCuprins Teza lui Church Calcul lambda sintaxa si semantica
operationala Functii curry/uncurry Functii curry/uncurry Forme normale Teorema Church Rosser Strategii de evaluare
Teza lui ChurchTeza lui Church Orice calcul efectiv poate fimodelat in calcul lambda (prinfunctii recursive)
Teza ChurchTeza Church--TuringTuring orice definitie adecvata a calculabilitatii
efective se va dovedi echivalenta cu definitiile propuse de Church, respectiv Turing
definitia lui Turing a avut un impact mai definitia lui Turing a avut un impact mai mare intrucat propunea un model de masina pe care sa se execute algoritmii
in acelasi timp, reprezentarea numarului2 in calcul lambda arata in felul urmator:
Modele de calculabilitateModele de calculabilitate Masina Turing (programare imperativa) Masina Lambda (programare functionala) Masina algoritmica Markov (programare
asociativa) Masina de calcul cu FOL (programare
logica)
Toate modelele sunt echivalente intre ele (aceleasi functii sunt calculabile in oricare din ele).
Calcul LambdaCalcul Lambda Inventat de Alonzo Church in 1932 ca un formalism
matematic menit sa descrie comportamentul functiilor
Nu a reusit sa inlocuiasca teoria multimilor ca fundament al matematicii, insa si-a gasit aplicatiisemnificative in programaresemnificative in programare
Limbaje bazate pe calcul lambda: Lisp, Scheme, Haskell, ML (intreaga programare functionala)
--expresiaexpresiaSintaxa:e x variabila
| x.e functie (unara, anonima)| (e e) aplicatie| (e e) aplicatie
parametru corpul functieiformal
parametru efectiv
--expresiaexpresiaSemantica:(x.e1 e2) = functia cu parametrul
formal x si corpul e1, aplicata asupra lui e2lui e2
pentru evaluare se substituie x cu e2 in corpul e1, se evalueaza e1 si se intoarcerezultatul
se noteaza e1[e2/x]
--expresiiexpresii -- exempleexemplex.x(x y)x. y.(x y)(x.x a)(x.x a)(x.y a)(x.x x.y)
--expresiiexpresii -- exempleexemplex.x functia identitate(x y)x. y.(x y)(x.x a)(x.x a)(x.y a)(x.x x.y)
--expresiiexpresii -- exempleexemplex.x(x y) aplicatia lui x asupra lui yx. y.(x y)(x.x a)(x.x a)(x.y a)(x.x x.y)
--expresiiexpresii -- exempleexemplex.x(x y)x. y.(x y) o functie de un parametru
x care intoarce o alta functiede un parametru y care ilaplica pe x asupra lui y
(x.x a)(x.y a)(x.x x.y)
--expresiiexpresii -- exempleexemplex.x(x y)x. y.(x y)(x.x a) functia identitate aplicata(x.x a) functia identitate aplicata
asupra lui a (se vaevalua la a)
(x.y a)(x.x x.y)
--expresiiexpresii -- exempleexemplex.x(x y)x. y.(x y)(x.x a)(x.x a)(x.y a) functia cu parametrul
formal x si corpul y,aplicata asupra lui a(se va evalua la y)
(x.x x.y)
--expresiiexpresii -- exempleexemplex.x(x y)x. y.(x y)(x.x a)(x.x a)(x.y a)(x.x x.y) functia identitate aplicata
asupra functiei cu parametrul formal x si corpul y (=> x.y)
AparitiiAparitii ale unei variabile intrale unei variabile intr--o o --expresieexpresie
Fie o variabila x si o aparitie xn a sa intr-o -expresie E.
Ex: x.(x y.x) s-ar putea rescrie cax1.(x2 y.x3) dpdv al aparitiilor lui x.
AparitieAparitie legatalegataxn este legata in E daca: E=...xn.e x = variabila de legare
xn = aparitia care leaga E=x.e si x apare in e E=x.e si xn apare in e
Ex: x.(x y.x)
Aici toate aparitiile lui x sunt legate.
AparitieAparitie liberaliberaO aparitie care nu este legata in E este
libera in E.
Ex: Ex: E = x.(y y.(x (y z)))E = (x x.(x.y y.(x z)))
AtentieAtentie!!Notiunea de aparitie libera/legata are
sens in cadrul unei expresii.
Ex: Ex: E = x.(y y.(x (y z))) =notatie x.eOrice aparitie a lui x e legata in E.In schimb, in e, aparitia lui x este libera!e = (y y.(x (y z)))
ExercitiiExercitii(x y.x)(y y.x)z.((+ z) x)(x. y.(x y) y)(x. y.(x y) y)
ExercitiiExercitii(x y.x)(y y.x)z.((+ z) x)(x. y.(x y) y)(x. y.(x y) y)
ExercitiiExercitii(x y.x)(y y.x)z.((+ z) x)(x. y.(x y) y)(x. y.(x y) y)
ExercitiiExercitii(x y.x)(y y.x)z.((+ z) x)(x. y.(x y) y)(x. y.(x y) y)
ExercitiiExercitii(x y.x)(y y.x)z.((+ z) x)(x. y.(x y) y)(x. y.(x y) y)
Variabila legata/liberaVariabila legata/liberaO variabila x este legata intr-o -
expresie E daca toate aparitiile ei sunt legate.
Variabilele legate suntVariabilele legate suntlegate fedeles!
O variabila care nu e legata intr-o -expresie e libera in acea -expresie.
ExempleExemple(x y.x)(y y.x)z.((+ z) x)(x.y.(x y) y)(x.y.(x y) y)
Obs: Si aici, notiunea are sens in cadrul unei expresii. Daca luam doar o parte din expresie, felul variabilei se poate schimba.
ExempleExempleE = (x.y.(x y) y) =notatie (x.e y)x e legata in E.y e libera in E.
Dar in e = y.(x y)?O imagine face cat 1000 de cuvinte.E exact pe dos!
Algoritm de determinare a Algoritm de determinare a variabilelor legate/liberevariabilelor legate/libere
BV(x) = BV(x.e) =BV((e1 e2)) =
FV(x) = FV(x.e) =FV((e1 e2)) =
BV = bound variables FV = free variables
Algoritm de determinare a Algoritm de determinare a variabilelor legate/liberevariabilelor legate/libere
BV(x) = BV(x.e) = {x} U BV(e)BV((e1 e2)) = BV(e ) U BV(e ) \
FV(x) = FV(x.e) =FV((e1 e2)) =
BV(e1) U BV(e2) \(FV(e1) BV(e2)) \(FV(e2) BV(e1))
BV = bound variables FV = free variables
Algoritm de determinare a Algoritm de determinare a variabilelor legate/liberevariabilelor legate/libere
BV(x) = BV(x.e) = {x} U BV(e)BV((e1 e2)) = BV(e ) U BV(e ) \
FV(x) = {x}FV(x.e) = FV(e) \ {x}FV((e1 e2)) = FV(e ) U FV(e )BV(e1) U BV(e2) \
(FV(e1) BV(e2)) \(FV(e2) BV(e1))
BV = bound variables
FV(e1) U FV(e2)
FV = free variables
--redexredex si si --reducerereducere
-redex = -expresie de forma (x.e1 e2)
-reducere = efectuarea calculului-reducere = efectuarea calculului(x.e1 e2) e1[e2/x]
Ex:(x.y.(x y) y) este un -redex.
Problema cu Problema cu --reducereareducereaEx1:(x.x t) x[t/x] = t (perfect!)
Ex2:(x.y.(x y) y)(x.y.(x y) y)
y.(x y)[y/x] = y.(y y) (oooops!)
Nu asta voiam sa se intample! Voiam sa obtinem o functie care il aplica pe y asupra oricarui argument cu care va fi vreodata apelata functia. Acum orice argument este aplicat asupra lui insusi.
Mai clar, ce se Mai clar, ce se intamplaintampla? De ? De unde apare problema?unde apare problema?
La o -reducere (x.e1 e2) e1[e2/x]inlocuiesc aparitiile libere are lui x in e1
cu e2.cu e2.
Variabilele libere din e2 se pot trezi legate in e1!
SolutiaSolutia: : --conversiaconversiaIdeea: numele parametrului formal nu conteaza, deci
il putem reboteza.
-conversie = rebotezarea sistematica a variabilelor legate dintr-o -expresie a.i. ele sa nu coincida cu variabilele libere din parametrul efectiv pe care variabilele libere din parametrul efectiv pe care aplicam expresia. ( x.e1 y.e1[y/x] , unde y nu era libera in e1 )
Ex:(x.y.(x y) y) (x.z.(x z) y)
z.(x z)[y/x] = z.(y z)
ObservatieObservatieDe ce la o -reducere (x.e1 e2) e1[e2/x] inlocuiesc
aparitiile libere are lui x in e1 cu e2?
Ex:(x.y.(x (y x.x)) t) trebuie sa devina(x.y.(x (y x.x)) t) trebuie sa devinay.(t (y x.x)).
Functia identitate ramane functia identitateoricum ii zicem parametrului formal, ceea ce trebuie sa devina t este primul x, iar acea aparitie (nu variabila!) e libera in e1, chiar daca e legata in (x.e1 e2).
NotatiiNotatiiPas de reducere: o se noteaza
Secventa de reducere:Secventa de reducere:*
ExercitiuExercitiu(x.(x z) z.x.(z x))
ExercitiuExercitiu(x.(x z) z.x.(z x))(x.(x z) t.x.(t x))
ExercitiuExercitiu(x.(x z) z.x.(z x))(x.(x z) t.x.(t x)) (t.x.(t x) z)
ExercitiuExercitiu(x.(x z) z.x.(z x))(x.(x z) t.x.(t x)) (t.x.(t x) z) x.(z x)x.(z x)
ZaharelZaharel sintacticsintactic x1. x2. x3. xn.e se noteaza
x1 x2 x3 xn .e
((x1. x2. xn.e p1) p2) pm) ((x1. x2. xn.e p1) p2) pm) se noteaza(x1 x2 xn .e p1 p2 pm)
Noi stim ca e vorba de functii unare si de aplicatiile lor.
FunctiiFunctii curry/curry/uncurryuncurryAti observat apelul:(x1 x2 xn.e p1 p2 pm)
Numarul de parametri formali nu coincide cu numarul de parametri efectivi. Se poate una numarul de parametri efectivi. Se poate una ca asta?
DA! Se poate, iar rezultatul unui astfel de apel este o functie de restul de parametri (formali).
FunctiiFunctii curry/curry/uncurryuncurryFunctia curry isi ia parametrii pe rand poate fi aplicata partial (doar pe o parte
din parametri) rezultand o noua functiedin parametri) rezultand o noua functie (x1 x2 xn.e p1 p2 pm) *
xm+1 xm+2 xn.e[p1/x1, p2/x2,pm/xm]
Functia uncurry Isi ia obligatoriu toti parametrii deodata
Exemplu (in Scheme)Exemplu (in Scheme)Sa urmarim impreuna cate o functie
curry/uncurry pentru adunarea a 2 numere
si altele.
FunctiiFunctii curry curry -- concluziiconcluzii Functii curry reutilizare de cod Sunt suportate de majoritatea
limbajelor functionale Desi nu exista nici un motiv ca Desi nu exista nici un motiv ca
celelalte limbaje sa nu le aiba, in general nu le au
Forme normaleForme normaleO -expresie e in forma normala = nu
mai contine niciun -redex.
Are orice -expresie o forma normala? Are orice -expresie o forma normala? Daca o -expresie admite o forma
normala, pot garanta gasirea ei? Secvente distincte de reducere pot
duce la forme normale distincte?
ObservatieObservatie
raspunsurile la toate intrebarile de mai sus ar trebui sa devina evidente daca ne gandim ca avem de-a face cu un ne gandim ca avem de-a face cu un model de calculabilitate: lambda-expresiile sunt practic programe capabile sa ruleze pe o ipotetica masina Lambda
Are orice Are orice --expresieexpresie o forma normala?o forma normala?
NU.
Ex:(x.(x x) x.(x x)) (x.(x x) x.(x x)) ?
--expresiiexpresii (i)reductibile(i)reductibile(x.(x x) x.(x x)) (x.(x x) x.(x x)) (x.(x x) x.(x x))
-expresie reductibila = admite o secventafinita de reducere care se termina cu o forma normala
Altfel: ireductibila
Daca o Daca o --expresieexpresie admite o forma admite o forma normala, pot garanta normala, pot garanta gasireagasirea ei?ei?DA.
Ex:E = (x.(x x) x.(x x))E1 = (x.(x x) x.(x x))E2 = (x.y E1) y
Daca incepeam sa reduc in interiorul E1nu mai terminam niciodata.
Teorema Teorema normalizariinormalizariiDaca o -expresie este reductibila,
atunci voi ajunge la forma ei normala aplicand reducere stanga->dreapta(reducand mereu cel mai din stanga(reducand mereu cel mai din stanga-redex)
SecventeSecvente distincte de reducere pot duce distincte de reducere pot duce la forme normale distincte?la forme normale distincte?NU.
Lema caroului (the diamond lemma)e a a d
Daca si atunci d a.i. siDaca si atunci d a.i. sie b b d
a
/ \/ \e d\ /
\ /b
Teorema Teorema ChurchChurch--RosserRossere * a a * d
Daca si atunci d a.i. sie * b b * d
Se demonstreaza cu ajutorul lemei caroului.
Corolar: Daca o -expresie este reductibila, atunci forma normala este unica.
Strategii de evaluareStrategii de evaluare= reguli de evaluare a expresiilor intr-un
limbaj de programare
2 mari categorii:2 mari categorii: Strategii stricte Strategii nestricte
Evaluare/Evaluare/functiefunctie stricta/nestrictastricta/nestrictaEvaluare stricta = argumentele unei functii
sunt evaluate la apel (inainte ca functia sa fie aplicata)
Evaluare nestricta = argumentele unei functiiEvaluare nestricta = argumentele unei functiinu sunt evaluate pana ce valoarea lor nu e efectiv necesara undeva in corpul functiei
Functie stricta/nestricta = functie care isievalueaza strict/nestrict argumentele
In practicaIn practica Limbajele care sunt stricte tind sa aiba
si cateva functii cu evaluare nestricta Ex: Scheme (if, and, or)
Strategii stricteStrategii stricte Evaluare aplicativa: la intalnirea unui redex
(x. e1 e2), mai intai se reduce e2 cat de mult se poate
Call by value: argumentul e evaluat inaintede a fi pasat functiei; functiei i se da o copie de a fi pasat functiei; functiei i se da o copie a valorii rezultate in urma evaluarii (Pascal, C, Java, Scheme, Ocaml etc)
Call by reference: functiei i se paseaza o referinta la argument; in principiu asta inseamna ca il poate modifica (Perl, Visual Basic; C simuleaza cu ajutorul pointerilor)
Strategii nestricteStrategii nestricte Evaluare normala: evaluare stanga-
>dreapta; difera de call by name prin aceea ca face evaluari in corpul functiilor incaneaplicate
Call by name: argumentele nu se Call by name: argumentele nu se evalueaza deloc, se transmit ca atare si, daca e nevoie de ele, se reevalueaza de fiecare data cand e nevoie (lent dar sigur)
Call by need: un call by name in care prima evaluare stocheaza rezultatul intr-un cache(va fi luat de acolo cand va mai fi nevoie de el) (Haskell, R)