curs2

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)