180 likes | 302 Views
Lambda calculus. 20.-30 .- te roky formaliz ácia matematiky, logiky 1932 – skúmanie funkcií , z áklady matematiky Alonzo Church Haskell Curry λ -calul ako formalizácia výpočtu c harakteri zácia rekurzívnych funkcií najmenší programovací jazyk iný model pre výpočet Turingovho stroja
E N D
Lambda calculus • 20.-30.-te roky formalizácia matematiky, logiky • 1932 – skúmanie funkcií, základy matematiky • Alonzo Church • Haskell Curry • λ-calul ako formalizácia výpočtu • charakterizácia rekurzívnych funkcií • najmenší programovací jazyk • iný model pre výpočet Turingovho stroja • 60.te roky jazyk Lisp
2+3=5 • rovnosť dvoch výrazov • ale jeden má zložitejšiu štruktúru • 5=5 nepokrýva proces výpočtu 2+3 • dosadenie argumentov, aplikovanie sčítania x+3 • výraz • funkcia - abstrakcia • x -> x+3, λx(x+3) • int f (int x) { return x+3;} • f = λx(x+3) • funkcia – aplikácia • f(7)
Syntax L je λ-term • x je premenná (spočítateľná množina premenných) L ::= x | (L L) | (λx L) • (L L) je aplikácia (funkcie) • (λx L) je λ-abstrakcia definujúca funkciu s argumentom x a telom L
Príklady λ-termov • (λx x) • (λx y) • (λx (x x)) • ((λx (x x)) (λx (x x))) • (λy (λx (x x)))
Konvencie • malé písmená označujú premenné: x, y, x1, x2, … • veľké písmená označujú λ-termy: M, N, … • vonkajšie zátvorky nepíšeme • symbol . nahradzuje (, zodpovedajúca ) chýba • (λx x)-> λx.x • (λx (x x))->λx.xx • ((λx (x x)) (λx (x x)))->(λx.xx)(λx.xx) • vnorené abstrakcie majú asociativitu vpravo • (λy (λx (x x)))-> λy.λx.xx -> λyx.xx • vnorené aplikácie majú asociativitu vľavo • (((λxyz.yz) a) b) c) -> (λxyz.yz)abc
Dôležité príklady • K = λxy.x • I = λx.x • S = λxyz.xz(yz) • = λx.xx • = = (λx.x x)(λx.x x) • 3 = λx.xxx
Voľná premenná, podterm • voľná premenná λ-termu • Free(x) = x • Free(λx.M) = Free(M) – {x} • Free(M N) = Free(M) U Free(N) viazaná premenná nie je voľná: • λx.xy – y je voľná, x je viazaná • podtermyλ-termu • Subt(x) = x • Subt(λx.M) = Subt(M) U {λx.M} • Subt(M N) = Subt(M) U Subt(N) U { (M N) }
Príklady • λxy.xz • x je viazaná, • z voľná, • y sa nenachádza v Subt(λxy.xz) • λx.(λy.y)(x (λy.y)) • má dva výskyty podtermu (λy.y) • x (y z) Subt( w(x(y z)) ) • ale x(y z) Subt( w x(y z)) ) neplatí, lebo • Subt( w x(y z)) ) obsahuje • w x(y z), w x, y z, w, x, z, y
Substitúcia • ak sa na to ide najivne: • (λx.zx)[z:y]-> λx.yx -- rovnaké vstupy, rôzne výsledky • (λy.zy)[z:y]-> λy.yy • substitúcia N[x:M] x[x:M]= M y[x:M] = y (A B)[x:M]= (A[x:M] B[x:M]) (λx.B)[x:M]= (λx.B) (λy.B)[x:M]= λ z.(B[y:z][x:M]) ak xFree(B), yFree(M) pričom z nie je voľné v B alebo M (λy.B)[x:M]= λy.B[x:M]
Príklady • najivne • (λx.zx)[z:y]-> λx.yx • (λy.zy)[z:y]-> λy.yy • (λx.zx)[z:y] = • λx.((zx)[z:y]) = • λx.(z[z:y]x[z:y]) = • λx.(yx) • (λy.zy)[z:y]= • (λw.(zy)[y:w])[z:y] = • (λw.(z[y:w]y[y:w]))[z:y] = • (λw.(zw))[z:y] = • λw.(zw)[z:y] = • λw.(z[z:y]w[z:y]) = • λw.(yw)
α-konverzia λx.M =α λy.M[x:y] • λx.M je premenovaním viazanej premennej λy.M[x:y], ak y nie je voľná v M • =αje relácia ekvivalencie • =αkongruencia na λ termoch
β-redukcia K = λxy.x I = λx.x S = λxyz.xz(yz) (λ x.B) e ->β B[x:e] Príklad: • I M = x • (λx.x) M ->β x[x:M] = M • K M N = M • (λxy.x)MN ->β(λy.M)N ->β M • S M N P = M P (N P) • λxyz.xz(yz) MNP ->3β MP(NP) • S K K = I • λxyz.xz(yz) (λxy.x) (λxy.x) ->β • λyz.(λxy.x)z(yz) (λxy.x) ->β • λyz.(λxy.x)z((λxy.x)z) ->β • λz.(λy.z)((λxy.x)z) ->β • λz.(λy.z)(λy.z) ->β • λz.z = I
Vlastnosti β-redukcie • = λx.xx • = • 3 = λx.xxx • nekonečná sekvencia • ->β ->β ->β … • puchnúca sekvencia • 3 3 ->β3 3 3 ->β3 3 3 3 • nejednoznačný výsledok • KI ->β I ale aj • KI ->β KI ->β KI ->β …
Church-Rosser vlastnosť M * * M2 M1 * * R pre ľub.trojicu termov M, M1, M2 takých, že M ->*M1 a M ->*M2 existuje R, že M1 ->*R a M2 ->*R Dôsledok: ak term má normálnu formu vzhľadom na ->, potom je jednoznačne určená ? je ->β Church-Rosser ?
Cvičenie Definujte základné funkcie pre interpreter λ-kalkuku: • free • subterm • substitute • β-redukcia navrhovaná reprezentácia (kľudne si zvoľte inú): data LExp = LAMBDA String LExp | – abstrakcia ID String | – premenná LExp [LExp] |– aplikácia, zovšeobecnená CON String | – konštanta, built-in fcia CN Integer– int.konštanta deriving(Show, Read, Eq)
Cvičenie (použite váš tool) 1) určite voľné a viazané premenné: • (λx.x y) (λy.y) • λx.λy.z (λz.z (λx.y)) • (λx.λy.x z (y z)) (λx.y (λy.y)) 2) redukujte: • (λx.λy.x (λz.y z)) (((λx. λy.y) 8) (λx.(λy.y) x)) • (λh.(λx.h (x x)) (λx.h (x x))) ((λa.λb.a) (+ 1 5)) 3) Nech F = (λt.t t) (λf.λx.f (f x)). Vyhodnoťte F succ 0, succ = λx. (+ x 1)
Riešenia • (λx.λy.x (λz.y z)) (((λx. λy.y) 8) (λx.(λy.y) x)) ->β • (λx.λy.x (λz.y z)) ((λy.y) (λx.(λy.y) x)) ->β • (λx.λy.x (λz.y z)) ((λy.y) (λy.y) ) ->β • (λx.λy.x (λz.y z)) (λy.y) ->β • λy.(λz.y z) (λy.y) ->β • (λz.(λy.y) z) ->β • (λz.z) ->β • I
Riešenie • (λh.(λx.h (x x)) (λx.h (x x))) ((λa.λb.a) (+ 1 5))->β • (λx.((λa.λb.a) (+ 1 5)) (x x)) (λx.((λa.λb.a) (+ 1 5)) (x x)) ->β • ((λa.λb.a) (+ 1 5)) ( (λx.((λa.λb.a) (+ 1 5)) (x x))(λx.((λa.λb.a) (+ 1 5)) (x x))) ->β • (λb.(+ 1 5) ( (λx.((λa.λb.a) (+ 1 5)) (x x))(λx.((λa.λb.a) (+ 1 5)) (x x))) ->β • (+ 1 5) ->β • 6