Paradigme de programare - Cursuri Automatica si...

Preview:

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)

λλ--expresiaexpresia

Sintaxa:e ≡ x variabila

| λx.e functie (unara, anonima)

| (e e) aplicatie| (e e) aplicatie

parametru corpul functiei

formal

parametru efectiv

λλ--expresiaexpresia

Semantica:(λ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 -- exempleexemple

λx.x(x y)λx. λy.(x y)(λx.x a)(λx.x a)(λx.y a)(λx.x λx.y)

λλ--expresiiexpresii -- exempleexemple

λx.x functia identitate(x y)λx. λy.(x y)(λx.x a)(λx.x a)(λx.y a)(λx.x λx.y)

λλ--expresiiexpresii -- exempleexemple

λx.x(x y) aplicatia lui x asupra lui yλx. λy.(x y)(λx.x a)(λx.x a)(λx.y a)(λx.x λx.y)

λλ--expresiiexpresii -- exempleexemple

λx.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 -- exempleexemple

λx.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 -- exempleexemple

λx.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 -- exempleexemple

λx.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 caλx1.(x2 λy.x3) dpdv al aparitiilor lui x.

AparitieAparitie legatalegata

xn 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 liberalibera

O 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/libera

O 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.

ExempleExemple

E = (λ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 e1cu 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 devina

λy.(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).

NotatiiNotatii

Pas 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/uncurryuncurry

Ati 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/uncurryuncurry

Functia 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 functiecurry/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 normale

O λ-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 normalizariinormalizarii

Daca 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--RosserRosser

e →* a a →* d Daca si atunci ∃∃∃∃ d a.i. si

e →* 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/nestricta

Evaluare stricta = argumentele unei functiisunt 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 aibasi 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)