Sunteți pe pagina 1din 31

Fundamentele limbajelor de programare

C01

Denisa Diaconescu
Traian S, erbănut, ă

Departamentul de Informatică, FMI, UB

1
Organizare
Instructori

• Curs
• Seria 23: Traian S, erbănut, ă
• Seria 24: Denisa Diaconescu
• Seria 25: Traian S, erbănut, ă

• Laborator
• 231: Horat, iu Cheval
• 232: Horat, iu Cheval/Bogdan Macovei
• 233: Andrei Văcaru
• 234: Horat, iu Cheval/Bogdan Macovei
• 241: Natalia Ozunu
• 242: Bogdan Macovei
• 243: Bogdan Macovei
• 244: Bogdan Macovei
• 251: Mihai Calancea
• 252: Andrei Burdus, a
2
Resurse

• Moodle

• Teams
https://tinyurl.com/FLP2023-Teams

• Suporturile de curs si laborator


https://tinyurl.com/FLP2023-Materials

3
Prezent, ă

Prezent, a la curs sau la laboratoare nu este obligatorie,


dar extrem de încurajată.

4
Evaluare

Notare
• Nota finală: 1 (oficiu) + nota laborator + part, ial + examen
• Restant, ă: 1 (oficiu) + examen
(nota de la laborator si part, ialul nu se iau în calcul la restant, ă)

Condit, ie de promovabilitate
• cel put, in 5 > 4.99

5
Nota laborator

• valorează 2 puncte din nota finală


• se notează activitatea din cadrul laboratorului

6
Examen part, ial

• valorează 3 puncte din nota finală


• durata 30 min
• în săptămâna 7, în cadrul cursului
• nu este obligatoriu s, i nu se poate reface
• întrebări grilă asemănatoare cu cele din quiz-urile de la curs
• materiale ajutătoare: suporturile de curs s, i de laborator

7
Examen final

• valorează 4 puncte din nota finală


• durata 1 oră
• în sesiune, fizic
• acoperă toată materia
• exercit, ii asemănătoare cu exemplele de la curs (nu grile)
• materiale ajutătoare: suporturile de curs s, i de laborator

8
Imagine de ansamblu asupra materiei

Curs Laborator
• Partea I • Limbajul suport: Haskell
• Lambda calcul
• Parsere
• Deduct, ie naturală
• Corespondent, a Curry-Howard • Type-checking
• Partea II • Implementarea unor semantici de
• Puncte fixe/recursivitate limbaje
• Semantica limbajelor de
programare
• Elemente de programare
logică*

9
Bibliografie

• H. Barendregt, E. Barendsen, Introduction to Lambda Calculus, 2000.


• R. Nederpelt, H. Geuvers , Type Theory and Formal Proof. Cambridge University
Press, 2014.
• B.C. Pierce, Types and programming languages. MIT Press, 2002
• P. Selinger,Lecture Notes on the Lambda Calculus. Dep. of Mathematics and
Statistics, Dalhousie University, Canada.
• P. Blackburn, J. Bos, and K. Striegnitz, Learn Prolog Now! (Texts in Computing,
Vol. 7),College Publications, 2006
• M. Huth, M. Ryan, Logic in Computer Science (Modelling and Reasoning
about Systems), Cambridge University Press, 2004.
• J. Lloyd. Foundations of Logic Programming, second edition. Springer, 1987.

10
La acest curs vom folosi destul de mult literele greces, ti

11
Integritate academică

Nu tris, at, i, ceret, i-ne ajutorul!

12
Ce s, i de ce lambda calcul?
Ce este o funct, ie în matematică?

• In matematica modernă, avem "funct, ii prin grafice":


• orice funct, ie f are un domeniu X s, i un codomeniu Y fixate, s, i
• orice funct, ie f : X → Y este o mult, ime de perechi f ⊆ X × Y a.î.
pentru orice x ∈ X , există exact un y ∈ Y astfel încât (x , y ) ∈ f .

• Acesta este un punct de vedere extensional, singurul lucru pe care


îl putem observa despre funct, ie este cum duce intrările în ies, iri.

• Două funct, ii f , g : X → Y sunt considerate ca fiind extensional


egale dacă pentru aceeas, i intrare obt, in aceeas, i ies, ire,
f (x ) = g (x ), pentru orice x ∈ X .

13
Ce este o funct, ie în matematică?

• Înainte de secolul 20, funct, iile erau privite ca "reguli/formule".


• A defini o funct, ie înseamnă să dai o regulă/formulă pentru a o
calcula. De exemplu,
f (x ) = x 2 − 1.

• Doua funct, ii sunt intensional egale dacă sunt definite de aceeas, i


formulă. De exemplu, este f de mai sus intensional egala cu g de
mai jos?
g (x ) = (x − 1)(x + 1).

• Daca privim o funct, ie ca o formulă, nu este mereu necesar să s, tim


domeniul s, i codomeniul ei. De exemplu, funct, ia identitate
h (x ) = x
poate fi privită ca o funct, ie h : X → X , pentru orice mult, ime X .

14
Extensional vs. intensional

• Paradigma "funct, ii prin grafice" este foarte elegantă s, i defines, te o


clasă mai largă de funct, ii, deoarece cuprinde s, i funct, ii care nu pot fi
definite prin formule.

• Paradigma "funct, ii ca formule" este utilă de multe ori în informatică.


De exemplu, putem privi un program ca o funct, ie de la intrări la
ies, iri. De cele mai multe ori, nu ne interesează doar cum sunt duse
intrările în ies, iri, ci s, i cum o putem implementa, cum a fost calculată
ies, irea, diverse informat, ii suplimentare etc.
• Cât a durat să o calculăm?
• Câtă memorie a folosit?
• Cu cine a comunicat?

15
O paranteză: expresii aritmetice

• Expresiile aritmetice sunt construite din


• variabile (x , y , z , . . .)
• numere (1, 2, 3, . . .)
• operatori ("+", "−", "×" etc)

• Gândim o expresie de forma x + y ca rezultatul adunării lui x cu y,


nu ca instruct, iunea/declarat, ia de a aduna x cu y.

• Expresiile aritmetice pot fi combinate, fără a ment, iona în mod


explicit rezultatele intermediare. De exemplu, scriem
A = (x + y ) × z 2
în loc de
fie w = x + y, apoi fie u = z 2 , apoi fie A = w × u.

16
Lambda calcul

• Lambda calculul este o teorie a funct, iilor ca formule.

• Este un sistem care permite manipularea funct, iilor ca expresii.


Extindem intuit, ia de la expresii aritmetice pentru funct, ii.

• De exemplu, dacă în mod normal am scrie


Fie f funct, ia x 7→ x 2 . Atunci A = f (5),
în lambda calcul scriem doar
A = (λx .x 2 )(5).

• Expresia λx .x 2 reprezintă funct, ia care duce x în x 2


(nu instruct, iunea/declarat, ia că x este dus în x 2 ).

• Variabila x este locală/legată în termenul λx .x 2


De aceea, nu contează dacă am fi scris λy .y 2

17
Funct, ii de nivel înalt

• Lambda calculul ne permite să lucrăm us, or cu funct, ii de nivel înalt


(funct, ii ale căror intrări/ies, iri sunt tot funct, ii).

• De exemplu, operat, ia f ◦ f este exprimată în lambda calcul prin


λx .f (f (x ))
iar operat, ia f 7→ f ◦ f prin
λf .λx .f (f (x ))

• Evaluarea funct, iilor de nivel înalt poate deveni complexă.


De exemplu, expresia
((λf .λx .f (f (x )))(λy .y 2 ))(5)
se evalueaza la 625.

18
Lambda calcul fără tipuri vs cu tipuri

Cateva exemple:

• Funct, ia identitate f = λx .x are tipul X → X .


• X poate să fie orice multime
• contează doar ca domeniul s, i codomeniul să coincidă

• Funct, ia g = λf .λx .f (f (x )) are tipul (X → X ) → (X → X )


• g duce orice funct, ie f : X → X intr-o funct, ie g (f ) : X → X

19
Lambda calcul fără tipuri vs cu tipuri

Permit, ând flexibilitate în alegerea domeniilor s, i a codomeniilor,


putem manipula funct, ii în moduri surprinzătoare. De exemplu,

• Pentru funct, ia identitate f = λx .x avem f (x ) = x, pentru orice x.


În particular, putem lua x = f si obt, inem
f (f ) ≃ (λx .x )(λx .x ) ≃ λx .x ≃ f .

• Combinatorul ω = λx .xx care pentru un x reprezintă funct, ia care


aplică x lui x
ω(λy .y ) ≃ (λx .xx )(λy .y ) ≃ (λy .y )(λy .y ) ≃ (λy .y )
Ce reprezintă ω(ω)?

20
Lambda calcul fără tipuri vs cu tipuri

Permit, ând flexibilitate în alegerea domeniilor s, i a codomeniilor,


putem manipula funct, ii în moduri surprinzătoare. De exemplu,

• Pentru funct, ia identitate f = λx .x avem f (x ) = x, pentru orice x.


În particular, putem lua x = f si obt, inem
f (f ) ≃ (λx .x )(λx .x ) ≃ λx .x ≃ f .

• Combinatorul ω = λx .xx care pentru un x reprezintă funct, ia care


aplică x lui x
ω(λy .y ) ≃ (λx .xx )(λy .y ) ≃ (λy .y )(λy .y ) ≃ (λy .y )
Ce reprezintă ω(ω)?
ω(ω) ≃ (λx .xx )(λx .xx ) ≃ (λx .xx )(λx .xx )

20
Lambda calcul

• Lambda calcul fără tipuri


• nu specificăm tipul niciunei expresii
• nu specificăm domeniul/codomeniul funct, iilor
• flexibilitate maximă, dar riscant deoarece putem ajunge în situat, ii în
care încercăm să aplicăm o funct, ie unui argument pe care nu îl poate
procesa
• Lambda calcul cu tipuri simple
• specificăm mereu tipul oricărei expresii
• nu putem aplica funct, ii unui argument care are alt tip fat, ă de
domeniul funct, iei
• expresiile de forma f (f ) sunt eliminate, chiar dacă f este funct, ia
identitate
• Lambda calcul cu tipuri polimorfice
• o situat, ie intermediară între cele două de mai sus
• de exemplu, putem specifica că o expresie are tipul X → X ,
dar fără a specifica cine este X 21
Calculabilitate

• Una din marile întrebări din anii 1930:


Ce înseamnă că o funct, ie f : N → N este calculabilă?

• O definit, ie informală:
ar trebui să existe o "metodă pe foaie" (pen-and-paper)
care să îi permită unei persoane cu experient, ă
să calculeze f (n), pentru orice n.

• Conceptul de metodă "pen-and-paper" nu este us, or de formalizat

22
Definit, ii pentru Calculabilitate

1. Turing – a definit un calculator ideal numit mas, ina Turing s, i a


postulat că o funct, ie este calculabilă ddacă poate fi calculată de o
astfel de mas, ină.

2. Gödel – a definit clasa funct, iilor recursive s, i a postulat că o funct, ie


este calculabilă ddacă este o funct, ie recursivă.

3. Church – a definit un limbaj de programare ideal numit lambda


calcul s, i a postulat că o funct, ie este calculabilă ddacă poate fi scrisă
ca un lambda termen.

23
Teza Church-Turing

• Church, Kleene, Rosser s, i Turing au


arătat că cele trei modele de
calculabilitate sunt echivalente (definesc
aceeas, i clasă de funct, ii calculabile).

• Dacă sunt sau nu echivalente cu


not, iunea "intuitivă" de calculabilitate este
o întrebare la care nu se poate
răspunde, deoarece nu avem o definit, ie
pentru "calculabilitate intuitivă".

• Faptul că cele trei modele coincid cu


not, iunea intuitivă de calculabilitate se
numes, te teza Church-Turing.

24
Lambda calcul în informatică

• Lambda calcul este un limbaj de programare ideal.


• Probabil cel mai simplu limbaj de programare Turing complet.
• Toate limbajele de programare funct, ională sunt extensii ale lambda
calculului cu diferite caracteristici (tipuri de date, efecte laterale etc)

25
Proofs-as-programs

• Ce este o demonstrat, ie?


• Logica clasică: plecând de la nis, te presupuneri, este suficient să
ajungi la o contradict, ie
• Logica constructivistă: pentru a arata ca un obiect există, trebuie să îl
construim explicit.

• Legătura dintre lambda calcul s, i logica constructivistă este dată de


paradigma proofs-as-programs.
• o demonstrat, ie trebuie să fie o "construct, ie", un program
• lambda calculul este o notat, ie pentru astfel de programe

26
Quiz time!

https://tinyurl.com/C01-Quiz1

27
Pe săptămâna viitoare!

28

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