Show Menu
Cheatography

FLP_partial Cheat Sheet (DRAFT) by

Partial FLP Cheatsheat

This is a draft cheat sheet. It is a work in progress and is not finished yet.

Prereq­uisites

2.1

2.2

3.1

3.2

5.1

6.1

6.2

Quiz-uri

1.1. Care ar fi cea mai apropiata scriere in lambda calcul pentru A, unde f(x) = x² + 1 si A = f(2)?
5
(x² + 1)(2)
2² + 1
(λ x. x² + 1)(2)
1.2. Care din conceptele de mai jos nu este un model de calcul­abi­litate?
masinile Turing
punctele fixe
funcțiile recursive
lambda calcul
1.3. In lambda calcul fara tipuri
trebuie sa specificam mereu tipul oricarei expresii
sunt eliminate expresiile de forma f(f)
nu specificam domeni­ul/­cod­omeniul functiilor
putem avea efecte laterale
2.1. Care din lambda termenii de mai jos nu este închis?
λxyz.xxy
λxy.xxy
λx.xxy
λx.xx
2.2. Care sunt variab­ilele libere din termenul λx.xxy?
termenul nu are variabile libere
x
y
x și y
2.3. Care din următo­arele afirmații este adevărată?
un combinator este orice lambda termen
un combinator este un lambda termen fără variabile libere (închis)
un combinator este un lambda termen cu variabile libere
un combinator este un lambda termen care are și variabile libere, și variabile legate
3.1. Ce este un β-redex?
un λ-termen de forma M[N/x]
un λ-termen de forma (λx.M)N
un λ-termen de forma (λx.M)
un λ-termen de forma x
3.2. Ce este o formă normală pentru un λ-termen?
un λ-redex
cea mai mică β-reducție
o α-echi­valență
un λ-termen fără redex-uri
3.3. În ce constă strategia normală de evaluare pentru λ-termeni?
alegerea redex-ului cel mai din stânga și apoi cel mai din exterior
alegerea redex-ului cel mai din stânga și apoi cel mai din interior
aplicarea unei reduceri în corpul unei abstra­ctizări
nu este definită
4.1. O codare în lambda calcul pentru constanta booleana true este:
λxy.x
λxy.xy
λx.x
nu se poate coda în lambda calcul
4.2. Codarea numerelor naturale în lambda calcul se mai numește și:
mașina Turing universală
numerele naturale nu se pot coda în lambda calcul
numeralii Church
redex
4.3. Un lambda termen M este punct fix al unui lambda termen F dacă
F =ᵦ M
F M =ᵦ M
M F =ᵦ M
F M =ᵦ F
5.1. Ce înseamnă că un termen M este typable?
există un tip σ astfel încât M să aibă tipul σ
există o derivare a lui M
M are o formă normală
M este o abstra­ctizare
5.2. Care din următorii termeni este typable?
xx
xxy
x(xy)
niciunul din termenii de mai sus
5.3. Ce este o judecată în calculul λ→?
o expresie de forma M:σ
o expresie de forma x:σ
o expresie de forma Γ⊢M:σ
o abstra­ctizare
6.1. Ce înseamnă type checking?
pentru un termen dat, constă în găsirea unui tip pentru un termen
pentru un termen dat, constă în găsirea unui context pentru un termen
pentru un context, termen și tip date, constă în verifi­carea faptului că termenul poate avea tipul în contextul dat
pentru un context și un tip date, constă în găsirea unui tip pentru termen în contextul dat
6.2.Care din problemele de mai jos nu este decidabilă pentru lambda calcul cu tipuri simple?
inhabi­tation
typability
type checking
toate de mai sus sunt probleme decidabile
6.3. Care din afirma­țiile de mai jos este adevărată pentru tipul Void?
are un inhabitant numit void
nu poate exista un astfel de tip
nu are niciun inhabitant
orice termen poate avea tipul Void

Curs 4

Expres­ivi­tatea λ-calc­ulului
Deși lambda calculul constă doar în λ-termeni, putem reprezenta și manipula tipuri de date comune.
Booleeni
•T ≜ λxy.x (dintre cele doua altern­ative o alege pe prima)
•F ≜ λxy.y (dintre cele doua altern­ative o alege pe a doua)
if = λbtf.t , if b = true
        λbtf.f, if b = false
altfel spus, if ≜ λbtf.b t f
and ≜ λb1b2.if b1 b2 (sau λb1b2.b2 b1 b2 sau λb1b2.b1 b2 F)
or ≜ λb1b2.if b1 T b2
not ≜ λb1.if b1 F T F
Operațiile lucrează corect doar dacă primesc ca argumente valori booleene. Folosind lambda calcul fară tipuri, avem garbage in, garbage out.
Numere naturale
Numeralul Church pentru numărul n ∈ N este notat n(bar).
Numeralul Church n(bar) este λ-termenul λfx.fnx, unde fn reprezintă compunerea lui f cu ea însăși de n ori. Avem deci n ≜ λfx.fnx.
Definim Succ ≜ λnfx.f (n f x)
       add ≜ λmnfx.m f (n f x)
       add′ ≜ λmn.m Succ n
       mul ≜ λmn.m (add n) 0(bar)
       exp ≜ λmn.m (mul n) 1(bar)
       isZero ≜ λnxy.n (λz.y) x
Puncte fixe în lambda­-calcul
Dacă F și M sunt λ-termeni, spunem că M este un punct fix al lui F dacă F M =β M.
Thm: În lambda calculul fără tipuri, orice termen are un punct fix.
Combin­atori de punct fix
= termeni închiși care „const­ruiesc” un punct fix pentru un termen arbitrar.
Exemple:
Combin­atorul de punct fix al lui Curry: Y ≜ λy.(λx.y (x x)) (λx.y (x x)) (YF punct fix al lui F, pt orice teremn F, deoarece YF ↠β F (Y F))
Combin­atorul de punct fix al lui Turing: Θ ≜ (λxy.y (x x y)) (λxy.y (x x y)) (ΘF punct fix al lui F, pt orice termen F, deoareceΘF ↠β F (Θ F))
Rezolvarea de ecuații în lambda calcul
fact n = if(isZero n) (1) (mul n (fact(pred n)) )
fact = λn.if(­isZero n) (1) (mul n (fact(pred n)) )
fact = (λfn.i­f(i­sZero n) (1) (mul n (f(pred n)) ))fact
Notăm F = λfn.if­(isZero n) (1) (mul n (f(pred n)) )
Ultima ecuat, ie devine fact = F fact, o ecuație de punct fix.
Luăm deci fact ≜ Y F, adică fact ≜ Y (λfn.i­f(i­sZero n) (1) (mul n (f(pred n)) ))
 

Curs 1

Ce este o funcție în matema­tică?
extens­ional: „funcții prin grafice”, clasă mai largă de funcții, cuprinde și funcții care nu pot fi definite prin formule
   (domeniu și codomeniu fixate, funcția e o mulțime de perechi -> duce intrări în ieșiri)
  funcții extens­ional egale = pentru aceeași intrare obțin aceeași ieșire (f(x) = g(x), ∀x∈ X)
intens­ional: „funcții ca formule” (nu e mereu necesar să știm domeniul și codome­niul; paradigmă utilă în inform­ati­că-­>un program = o fcț de la intrări la ieșiri)
 ­  funcții intens­ional egale: definite prin acceași formulă (eventual prelucrată)
Lambda calcul
lambda calcul = teorie a funcțiilor ca formule
Exemplu: λx.x2 = x->x2 (e expresie, nu instrucțiune/declarație)
 ­ ­ ­Var­iabila x este locală­/legată în termenul λx.x2
Exemplu: f◦f = λx.f(f(x))
               f→f◦f = λf.λx.f­(f(x))
              ((λf.λx.f(f(x)))(λy.y2))(5) = 625
Funcția identitate f = λx.x are tipul X->X, unde X poate să fie orice mulțime
Funcția g = λf.λx.f­(f(x)) are tipul (X->X)->(X->X)
f(f) ≃ (λx.x)­(λx.x) ≃ λx.x ≃ f
Combin­atorul ω = λx.xx care reprezintă funcția care aplică x lui x
 ­ ­ω(λy.y) ≃ (λx.xx­)(λy.y) ≃ (λy.y)­(λy.y) ≃ (λy.y)
ω =λx.x(x), ω(ω) = ?
ω(f) = f(f), for any f that belongs to its domain. So ω(ω) = ω(ω) and cannot be further evaluated
Lambda calcul fără tipuri:
-- nu specificăm tipul niciunei expresii
-- nu specificăm domeni­ul/­cod­omeniul funcțiilor
-- flexib­ilitate maximă, dar riscant deoarece putem ajunge în situații în care încercăm să aplicăm o funcție unui argument pe care nu îl poate procesa
Lambda calcul cu tipuri simple
-- specificăm mereu tipul oricărei expersii
-- nu putem aplica funcții unui argument care are alt tip față de denumirea funcției
-- expresii de forma f(f) sunt eliminate, chiar dacă f e funția identitate
Lambda calcul cu tipuri polimo­rfice
-- o situație interm­ediară între cele două de mai sus
-- putem specifica că o expresie are tipul X->X, dar fără a specifica cine este X
Calcul­abi­litate
informal: o funcție este calcul­abilă dacă există o metodă „pen-a­nd-­paper” care permite calcularea lui f(n), pentru orice n
Turing - a definit un calculator ideal numit mașina Turing și a postulat că o funcție este calcul­abilă ddacă poate fi calculată de o astfel de mașină
Godel - a definit clasa funcțiilor recursive și a postualt că o funcție este calcul­abilă ddacă este o funcție recursivă
Church - a definit un limbaj de programare ideal numit lambda calcul și a postulat că o funcție este calcul­abilă ddacă poate fi scrisă ca un labda termen
Teza Church­-Turing - cele 3 metode sunt echiva­lente și coincid cu noțiunea intuitivă de calcul­abi­litate
Ce este o demons­trație?
Logica clasică: plecând de la niște presup­uneri, este suficient să ajungi la o contra­dicție
Logica constr­uctivă: pentru a arăta că un obiect există, trebuie să îl construim explicit
- legătura dintre lambda calcul și logica constr­uctivă este dată de paradigma „proof­-as­-pr­ograms” (o demons­trație trebuie să fie o constr­ucție, un program; lambda calculul este o notație pentru un astfel de program)

Curs 2

Lambda Calcul
•Un model de calcul­abi­litate
•Limbajele de programare funcți­onală sunt extensii ale sale
•Un limbaj formal
•Expre­siile din acest limbaj se numesc lambda termeni
Lambda termeni
Fie V o mulțime infinită de variabile, notate x, y, z,....
Mulțimea lambda termenilor este dată de următoarea formă BNF:
    lambda termen = variabilă | aplicare | abstra­ctizare
   M, N ::= x | (M N) | (λx.M)
Definiție altern­ativă:
Fie V o mulțime infinită de variabile, notate x, y, z, ....
Fie A un alfabet format din elementele din V și simboluri speciale (, ), λ, ..
Fie A mulțimea tuturor cuvintelor finite pentru alfabetul A.
Mulțimea lambda termenilor este cea mai mică submulțime Λ ⊆ A
astfel încât:
    [Varia­bila] V ⊆ Λ
    [Aplicare] dacă M, N ∈ Λ atunci (M N) ∈ Λ
    [Abstr­act­izare] dacă x ∈ V și M ∈ Λ atunci (λx.M) ∈ Λ
Convenții
•Se elimină parant­ezele exteri­oare.
• Aplicarea este asociativa la stânga (M N P = (M N P), f x y z = ((f x) y) z)
• Corpul abstra­cti­zării (partea de după punct) se extinde la dreapta cât se poate (λx.M N = λx.(M N), nu (λx.M) N)
• Mai mulți λ pot fi comprimați (λxyz.M = λx.λy.λz.M)
Exemple:
    (λx.(λ­y.(­λz.((x z)(y z))))) = λxyz.x z (y z)
    (((a b) (c d)) ((e f) (g h))) = a b (c d) (e f (g h))
    x x x x = (((x x) x) x)
    λx.x λy.y = (λx.(x (λy.y)))
Variabile libere și variabile legate
λx.N, unde
    λ_._ = operator de legare (binder)
    x (din λx._) = variabilă de legare (binding)
    N = domeniul (scope) de legare a lui x
•toate aparițiile lui x în N sunt legate.
• o apariție care nu este legată se numește liberă
•un termen fără variabile libere se numește închis (combi­nator).
Exemplu: M ≡ (λx.xy) (λy.yz)
    x este legată
    z este liberă,
    y are o apariție legată și una liberă
    mulțimea variab­ilelor libere ale lui M este {y, z}.
Variabile libere
Mulțimea variab­ilelor libere dintr-un termen M este notată FV(M) și este definită prin:
    FV(x) = {x}
    FV(M N) = FV(M) ∪ FV(N),
   ­FV(­λx.M) = FV(M)\{x}
Redenumire de variabile
Dacă x, y sunt variabile și M este un termen, M<y­/x> este rezultatul obținut după redenu­mirea lui x cu y în M.
    x<y­/x>≡ y, z<y­/x>≡ z, dacă x != z
    (M N)<­y/x> ≡ (M<­y/x­>) (N<­y/x­>),
    (λx.M)­<y/­x> ≡ λy.(M<­y/x­>),
    (λz.M)­<y/­x> ≡ λz.(M<­y/x­>), dacă x != z
α-echi­valență
α-echi­valența = cea mai mică relație de congruenșă =α pe mulțimea lambda termen­ilor, aî pentru orice termen M și orice variabilă y care nu apare în M, avem λx.M =α λy.(M<­y/x­>)
-- cea mai mică relație pe lambda termeni care satisface regulile:
  &nbsp vezi poza din cardul 2.1
Convenția Barend­regt: variab­ilele legate sunt redenumite pt a fi distincte.
Substi­tuții (card 2.2)
M[N/x] este rezultatul obținut dupa înlocuirea lui x cu N în M.
Cazuri speciale:
1. Înlocuim doar variabile libere: x (λxy.x­)[N/x] = N (λxy.x), nu N (λxy.N) sau N (λNy.N).
2.Nu vrem sa legăm variabile libere neinte­nți­onat:M ≡ λx.y x, N ≡ λz.x z (x legată în M și lilberă în N). Redenumim variab­ilele legate înainte de substi­tuție!
 ­M[N/y] = (λx'.y x')[N/y] = λx'.N x'= λx'.(λz.x z) x'
Exemple
(λz.x)­[y/x] = λz.y
(λy.x)­[y/x] = λy'.y, nu λy.y,
(λy.x)[(λz.z w)/x] = λyz.zw

Curs 3

β-reducții (card 3.1)
Convenție: M=N (2 termeni egali) dacă sunt α-echi­val­enți.
β-reducție = procesul de a evalua lambda termeni prin „pasarea de argumente funcți­ilo­r"
β-redex = un termen de forma (λx.M) N
redusul unui redex (λx.M) N este M[N/x]
Reducem lambda termeni prin găsirea unui subtermen care este redex și apoi înlocuirea acelui redex cu redusul său; repetăm acest proces până nu mai sunt redexuri
forma normală = un lambda termen fără redexuri
Observ­ații:
   ­•re­ducerea unui redex poate crea noi redex-­uri­/șterge alte redex-uri
    • numărul de pași necesari pâna a atinge o fn poate varia, în funcție de ordinea în care sunt reduse redex-­urile, iar rezultatul final nu depinde de alegerea redex-­urilor
    •lungimea unui termen nu trebuie să scadă în procesul de β-redu­cție; poate crește sau rămâne neschi­mbat.
β-forma normală
(λx.x x) (λx.x x) nu poate fi redus la o β-formă normală (evaluarea nu se termină)
Există lambda termeni care deși pot fi reduși la o formă norală, pot să nu o atingă niciodată (contează strategia de evaluare).
Notăm cu M -»β M' faptul că M poate fi β-redus până în M' în 0 sau mai mulți pași (închiderea reflexivă și tranzitivă a relației →β)
Notăm cu M =β M′ faptul că M poate fi transf­ormat în M′ în 0 sau mai mulți pași de β-redu­cție, transf­ormare în care pașii de reducție pot fi și întorși.
=β este închiderea reflexivă, simetrică și tranzitivă a relației →β.
M este slab normal­izabil (weakly normal­ising) dacă există N în forma normală aî M -»β N.
M este puternic normal­izabil (strong normal­ising) dacă nu există reduceri infinite care încep din M.
puternic normal­izabil => slab normal­izabil
Exemple:
    (λx.y) ((λz.zz ) (λw.w)) - puternic normalizabil.
   ­(λxy.y) ((λx.x x) (λx.x x)) (λz.z) - slab normal­izabil, dar nu puternic normal­izabil.
Confluența β-redu­cției. Teorema Church­-Rosser
Card 3.2
*Exemple
(λx.x) M -»β M
(λxy.x) M N -»β M
(λx.x x) (λy.y y y) -»β (λy.y y y) (λy.y y y) (λy.y y y). . .
Strategii de evaluare
Lambda calculul nu specifică o strategie de evaluare, fiind nedete­rminist
Strategia normală = leftmo­st-­out­ermost (alegem redex-ul cel mai din stânga și apoi cel mai din exterior)
  dacă M1 și M2 sunt redex-uri și M1 este un subtermen al lui M2, atunci M1 nu va fi um redex ales.
  printre redex-­urile care nu sunt subtermeni ai altor redex-uri (și sunt incomp­atibili față de relația de subter­men), îl alegem pe cel mai din stânga.
Dacă un termen are o formă normală, atunci strategia normală va converge la ea.
Strategia aplicativă = leftmo­st-­inn­ermost (alegem redex-ul cel mai din stânga și apoi cel mai din interior)
  dacă M1 și M2 sunt redex-uri și M1 este un subtermen al lui M2, atunci M2 nu va fi următorul redex ales
  printre redex-­urile care nu sunt subtermeni ai altor redex-uri (și sunt incomp­atibili față de relația de subter­men), îl alegem pe cel mai din stânga.
Strategii în programare funcți­onală
Call-b­y-Name (CBN) = strategia normală fără a face reduceri în corpul unei λ-abst­rac­tizări.
Call-b­y-Value (CBV) = strategia aplicativă fără a face reduceri în corpul unei λ-abst­rac­tizări (folosit în general de limbajele de progr funcți­onală, excepție Haskell, e o formă de evaluare leneșă).
O valoare este un λ-term pt care nu există β-reducții date de strategia de evaluare consid­erată.

Curs 5

Tipuri simple
Fie V = {α, β, γ, ...} o mulțime infinită de tipuri variabilă.
Mulțimea tuturor tipurilor simple T este definită prin:
   T = V | T → T
• (Tipul variabilă) Dacă α ∈ V, atunci α ∈ T.
• (Tipul săgeată) Dacă σ, τ ∈ T, atunci (σ → τ) ∈ T.
Tipurile săgeată reprezintă tipuri pentru funcții cum ar fi Nat->Real (fct de la nr nat la nr reale) sau (Nat ->I­nt)­->(­Int­->Nat) (fcț care au ca intrare o fcț de la nr nat la nr întregi li produce o fcț de la întregi la nat)
Parant­ezele în tipurile săgeată sunt asociative la dreapta.
Termeni și tipuri
M are tip σ: M :σ
Variabilă x :σ. Pp că orice var din M are tip unic (Dacă x :σ și x : τ, atunci σ ≡ τ)
Aplicare: Dacă M :σ → τ și N:σ, atunci M N : τ.
Abstra­ctizare Dacă x :σ și M : τ, atunci λx. M :σ → τ.
M are tip (este typeable) daca există un tip σ astfel încât M :σ.
Metode de a asocia tipuri variab­ile­lelor
Asocierea explicită (Churc­h-t­yping):
    •constă în prescierea unui unic tip pt fiecare variabilă, la introd­ucerea acesteia (tipuri stabilite explicit)
Asocierea implicită (Curry­-ty­ping):
    • constă în a nu prescrie un tip pt fiecare variabilă, ci în a le lăsa „deschise” (teremenii typeable sunt descop­eriți printr-un proces de căutare).
Sistem de deducție pentru Church λ→ (card 5.1)
Mulțimea λ-term­enilor cu pre-tipuri ΛT este: ΛT = x | ΛT ΛT | λx : T. ΛT.
O afirmație este o expresie de forma M :σ, unde M ∈ ΛT și σ ∈ T (M =
subiect, σ =tip).
O declarație este o afirmație în care subiectul e variabilă (
x :σ*).
Un context este o listă de declarații cu subiecți diferiți.
O judecată este o expresie de forma Γ ⊢ M :σ, unde Γ este context și M :σ este o afirmație.

Curs 6

Ce probleme putem să rezolvăm în teoria tipurilor?
Type Checking
Se reduce la a verifica că putem găsi o derivare pentru
    context ⊢ term : type
Well-t­ype­dness (Typab­ility):
Se reduce la a verifica dacă un termen e legal.
    ? ⊢ term : ?
O variațiune a problemei este Type Assignment în care este dat contextul și trebuie găsit tipul.
 ­  context ⊢ term : ?
Term Finding (Inhab­ita­tion)
Dându-se un context și un tip, să se stabil­ească dacă există un termen cu ac tip, în contextul dat
 ­  context ⊢ ? : type
!Toate aceste probleme sunt decidabile pentru calculul Church λ→!
Limitări ale lambda­-ca­lcu­lului cu tipuri simple
•nu mai avem recursie nelimi­tată, dar avem recursie primitivă (looping cu număr cunoscut de iterații)
•tipurile pot fi prea restri­ctive (soluții posibile: let-po­lym­orphism, unde variab­ilele libere se redenumesc la fiecare folosire; cuanti­fic­atori de tipuri operatorul de legare Π)
Coresp­ondența Curry-­Howard (card 6.1, 6.2)
Teoria Tipurilor
Logică
∘ tipuri
∘ termeni
∘ inhabi­tation a tipului σ
∘formule
∘ demons­trații
∘ demons­trație a lui σ
∘ tip produs
∘ tip funcție
∘ tip sumă
∘ tipul void
∘ tipul unit
∘ conjuncție
∘ implicație
∘ disjuncție
∘ false
∘ true
Logica Intuiț­ionistă
∘ logică constr­uctivă, bazată pe demons­trație
∘ demons­tra­țiile sunt execut­abile și produc exemple
Urm formule echiv nu sunt demons­trabile în logica intuiț­ion­istă:
    ¬¬φ ⊃ φ (dubla negație)
    φ ∨ ¬φ (excluded middle)
   ((φ ⊃ τ) ⊃ φ) ⊃ φ (legea lui Pierce)
Nu există semantică cu tabele de adevăr pentru logica intuiț­ion­istă!
Inițial, coresp­ondența Curry-­Howard a fost între: (Calcul Church λ →) și (Sistemul de deducție naturală al lui Gentzen pentru logica intuiț­ion­istă)