Programowanie funkcyjne. Wykªad 13 Siªa wyrazu rachunku lambda Zdzisªaw Spªawski Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 1
Wst p Warto±ci logiczne Liczby naturalne jako liczebniki Churcha Kombinatory punku staªego Reguªy delta Kombinator punktu staªego w OCamlu Zadania kontrolne Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 2
Wst p J zyk funkcyjny mo»na potraktowa jak rachunek lambda (beztypowy lub z typami) z dodanymi staªymi (z odpowiednimi reguªami redukcji) i du» ilo±ci lukru syntaktyczego. Te rozszerzenia rachunku lambda stosuje si w celu uªatwienia pisania programów, polepszenia ich czytelno±ci i zwi kszenia efektywno±ci. Logicznie nie s one koniecznie. Jako przykªady zostan zdeniowane warto±ci logiczne i liczby naturalne z odpowiednimi funkcjami jako termy rachunku lambda. Zostan te» podane najwa»niejsze twierdzenia ±wiadcz ce o sile wyrazu rachunku lambda. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 3
Warto±ci logiczne Specykacja algebraiczna: if true M N = M if false M N = N Odpowiednie termy mo»na zdeniowa na przykªad tak: true λxy.x false λxy.y if λbuv.buv Udowodnimy,»e speªnione jest pierwsze równanie specykacji. if true M N (λbuv.b u v) true M N β (λuv.true u v)m N β (λv.true M v) N β true M N (λxy.x) M N β (λy.m)n β M Analogicznie wygl da dowód drugiego równania. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 4
Liczby naturalne jako liczebniki Churcha Specykacja algebraiczna: Iter 0 M N = N Iter (suc n) M N = M(Iter n M N) Odpowiednie termy mo»na zdeniowa na ró»ne sposoby, np. liczebniki Churcha s zdeniowane nast puj co: 0 λfx.x 1 λfx.fx 2 λfx.f(fx) i tak dalej. Mo»emy to uogólni i zauwa»y,»e liczebnik reprezentuj cy liczb n b dzie miaª posta λfx.f n x, czyli jest iteratorem. Wobec tego deniujemy: suc λnfx.f(nfx) Iter λnfa.nfa ( η λn.n) Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 5
Kombinatory punku staªego Równania staªopunktowe w matematyce. Rozwa»my równania algebraiczne, np. x = 5/x czy x = 6 x Problem rozwi zania tych równa«mo»na te» sformuªowa jako problem znalezienia punktów staªych funkcji: f 1 λx.5/x i f 2 λx.6 x Punktem staªym funkcji jest warto± nale» ca do dziedziny funkcji, odwzorowywana przez funkcj na siebie. Poszukujemy wi c takich warto±ci w 1 i w 2,»e f 1 w 1 = w 1 i f 2 w 2 = w 2 Oczywi±cie w 1 = 5 i w 2 = 3. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 6
Kombinatory punku staªego Równania staªopunktowe w programowaniu. Podobny problem pojawia si przy denicjach funkcji rekurencyjnych, np. lub inaczej: s(n) = if n = 0 then 1 else n s(n 1) s = λn.if n = 0 then 1 else n s(n 1) Z matematycznego punktu widzenia to jest równanie (wy»szego rz du) z jedn niewiadom s. Symbol = oznacza tu β (lub βη) konwersj. Problem rozwi zania tego równania, tj. znalezienia lambda termu, speªniaj cego równanie, sprowadza si do znalezienia punktu staªego funkcjonaªu: F λfn.if n = 0 then 1 else n f(n 1) Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 7
Kombinatory punku staªego Kombinator punktu staªego Denicja. Kombinatorem punktu staªego nazywamy ka»dy term M taki,»e F.MF = F (MF ). Twierdzenie o punkcie staªym. Dowód. (i) F. X.X = F X (ii) Istnieje kombinator punktu staªego Y λf.(λx.f(xx))(λx.f(xx)) taki,»e YF = F (YF ). (i) Niech W λx.f (xx) i X W W. Wówczas X W W (λx.f (xx))w F (W W ) F X (ii) YF (λf.(λx.f(xx))(λx.f(xx)))f β (λx.f (xx))(λx.f (xx)) β F ((λx.f (xx))(λx.f (xx))) = β F ((λf.(λx.f(xx))(λx.f(xx)))f ) F (YF ) Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 8
Kombinatory punku staªego Przykªad u»ycia kombinatora punktu staªego: silnia. Teraz mo»emy zdeniowa lambda term dla silni jako: s Y F gdzie F λfn.if n = 0 then 1 else n f(n 1) Uwaga. Przy warto±ciowaniu tego termu nale»y stosowa redukcj normaln. s n (Y F ) n = β F (Y F ) n (λfn.if n = 0 then 1 else n f(n 1))(Y F ) n β if n = 0 then 1 else n (Y F )(n 1) if n = 0 then 1 else n s(n 1) Oczywi±cie, mo»liwa jest inna denicja silni za pomoc iteratora, co odpowiadaªoby rekursji ogonowej. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 9
Reguªy delta Reguªy delta Denicja. (i) Niech δ b dzie pewn staª. Wówczas Λδ jest zbiorem λ-termów zbudowanych ze zmiennych i staªej δ za pomoc aplikacji i abstrakcji w zwykªy sposób. (ii) Analogicznie deniuje si Λ δ, gdzie δ oznacza ci g staªych. (iii) Niech M oznacza ci g zamkni tych λ-termów w postaci normalnej. δ-redukcja ma posta δ M f( M). Dla zadanej funkcji f δ-redukcja nie jest pojedyncz reguª, lecz schematem reguª. Tak wzbogacony system nazywamy rachunkiem λδ. Relacje kontrakcji i redukcji s oznaczane odpowiednio przez βδ i βδ. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 10
Reguªy delta Reguªy delta Twierdzenie. Niech f b dzie funkcj na zamkni tych λ-termach w postaci normalnej. Wówczas relacja redukcji βδ speªnia twierdzenie Churcha-Rossera. Poj cie redeksu, postaci normalnej i strategii redukcji w sposób naturalny uogólnia si na rachunek λδ. Prawdziwe jest te» twierdzenie o standardyzacji. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 11
Reguªy delta Przykªad: poprzednik. { pred 0 = 0 pred (suc n) = n Ide obliczania poprzednika wyja±nia poni»szy program. } y := 0; 0, 0 z := 0; while y n do ( z = pred y ) begin } z := y; n-krotna iteracja operacji q q y, z suc y, y y := suc y; end ( z = pred n ) Teraz ten algorytm mo»emy zapisa w postaci lambda-termu. pred snd (Iter n (λp.pair(suc(fst p))(fst p)) (pair 0 0)) Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 12
Reguªy delta Denicja. Funkcja cz ±ciowa f : N k N jest deniowalna w beztypowym rachunku lambda, je±li istnieje zamkni ty term F, speªniaj cy dla dowolnych n 1... n k N nast puj ce warunki: (i) Je±li f(n 1... n k ) = m, to F n 1... n k = β m; (ii) Je±li warto± f(n 1... n k ) jest nieokre±lona, to F n 1... n k nie ma postaci normalnej. Twierdzenie. Wszystkie funkcje rekurencyjne s λ-deniowalne. Teza Churcha [Churcha-Turinga]. Ka»da funkcja obliczalna w nieformalnym sensie jest rekurencyjna. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 13
Kombinator punktu staªego w OCamlu Kombinator punktu staªego w OCamlu. I Bezpo±rednia denicja kombinatora Y λf.(λx.f(xx))(λx.f(xx)) w j zyku OCaml spowoduje bª d typu. Mo»emy jednak zdeniowa typ danych: type 'a coded = Encode of ('a coded -> 'a);; a nast pnie funkcjonaª fixl : ('a -> 'a) -> 'a let fixl f = let g (Encode x) = f (x (Encode x)) in g (Encode g);; który dziaªa poprawnie dla dla j zyków z warto±ciowaniem leniwym. W OCamlu, który stosuje warto±ciowanie gorliwie, warto±ciowanie fixl nie ko«czy si i nie uda si nam zdeniowa np. niesko«czonej listy jedynek (sprawd¹ to!): let ones = fixl (function x -> 1::x);; Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 14
Kombinator punktu staªego w OCamlu Kombinator punktu staªego w OCamlu. II Mo»na jednak nieco zmodykowa powy»szy funkcjonaª (spróbuj to zrobi ) i otrzyma funkcjonaª: fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b, który znajduje punkty staªe funkcji (ale ju» nie list!). Przekonaj si o tym, deniuj c funkcj obliczaj c silni zadanej liczby bez jawnego u»ycia rekursji. Funkcjonaª fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b mo»na te» zdeniowa bez u»ycia typu 'a coded, np. let fix f = let rec fixf x = f fixf x in fixf;; Mo»na go teraz u»y do zdeniowania silni bez u»ycia rekursji: let fact = fix (fun f n -> if n=0 then 1 else n*f(n-1));; Przekonaj si,»e jest to rzeczywi±cie funkcja silni. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 15
Kombinator punktu staªego w OCamlu Skªadnia i semantyka prostego j zyka imperatywnego. I Na wykªadzie 3 byªa podana skªadnia i semantyka dla prostego j zyka imperatywnego PJI. Funkcje semantyczne zostaªy tam zapisane jako funkcjonaªy w j zyku OCaml. Materiaª z tego wykªadu pozwala lepiej zrozumie denicj funkcji semantycznej dla p tli while. Skªadnia abstrakcyjna V Zmienna N Liczba B ::= true false B&&B B B not B E < E E = E E ::= N V E + E E E E E E C ::= skip C; C V := E if B then C else C while B do C od Semantyk denotacyjn j zyka zadaje si deniuj c funkcje semantyczne, które opisuj, jak semantyka wyra»enia mo»e by otrzymana z semantyki skªadowych tego wyra»enia (semantyka kompozycyjna). Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 16
Kombinator punktu staªego w OCamlu Skªadnia i semantyka prostego j zyka imperatywnego. II Funkcja semantyczna dla instrukcji C jest funkcj cz ±ciow [C ], zmieniaj c wektor stanu programu S (pami operacyjn ). Dziedzin S reprezentujemy za pomoc zbioru funkcji σ : Zmienna Z. Zaªó»my dla uproszczenia,»e funkcje semantyczne dla wyra»e«logicznych B i arytmetycznych E s znane. Zdeniujemy funkcj semantyczn [C ] : S S dla instrukcji, a potem (pomijaj c pewne szczegóªy formalne), zaprogramujemy j w OCamlu. Teraz mo»emy to zrobi w czystym rachunku lambda. Semantyka denotacyjna [B ] : S {true, false} [E ] : S Z [skip]σ = σ [C 1 ; C 2 ]σ [C 2 ]([C 1 ]σ) [V := E ]σ σ[v [E ]σ] [if B then C 1 else C 2 fi]σ { [C1 ]σ gdy [B ]σ = true [C 2 ]σ gdy [B ]σ = false Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 17
Kombinator punktu staªego w OCamlu Skªadnia i semantyka prostego j zyka imperatywnego. III Wykonuj c jednokrotnie p tl while otrzymujemy poni»sze równanie dla funkcji semantycznej [while B do C od]: { [while B do C od]([c ]σ) gdy [B ]σ = true [while B do C od]σ σ gdy [B ]σ = false Z analogicznym problemem mieli±my do czynienia w przypadku funkcji silnia. Nale»y znale¹ najmniejszy punkt staªy funkcjonaªu: { f([c ]σ) gdy [B ]σ = true F λf.λσ. σ gdy [B ]σ = false czyli, u»ywaj c operatora punktu staªego fix: [while B do C od] fix F Powy»ej s u»ywane dwa funkcjonaªy F : [S S] [S S] i fix : [[S S] [S S]] [S S], znajduj cy najmniejszy punkt staªy zadanego funkcjonaªu. Jego istnienie gwarantuje teoria dziedzin. Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 18
Zadania kontrolne Zadanie 1. Wykorzystuj c term if zdeniuj pozostaªe spójniki logiczne. Zadanie 2.Udowodnij,»e termy 0, suc, Iter speªniaj specykacj algebraiczn ze strony 6. Zadanie 3. Zdeniuj lambda wyra»enia pair, fst i snd z nast puj cymi reguªami redukcji: fst (pair M N) M snd (pair M N) N Zdzisªaw Spªawski: Programowanie funkcyjne. Wykªad 13, Siªa wyrazu rachunku lambda 19