Lambda calculus. Štruktúra prednášok: úvod do syntaxe, netypovaný λ-kalkul (gramatika + konvencie) sémantika (redukčné pravidlá)

Σχετικά έγγραφα
Ekvačná a kvantifikačná logika

Matematika Funkcia viac premenných, Parciálne derivácie

Κεφάλαιο 10 Λάμβδα λογισμός

Motivácia Denícia determinantu Výpo et determinantov Determinant sú inu matíc Vyuºitie determinantov. Determinanty. 14. decembra 2010.

Cvičenie č. 4,5 Limita funkcie

Foundations of Computer Science ENGR 3520 Fall 2013 Thursday, Nov 21, 2013

1. Limita, spojitost a diferenciálny počet funkcie jednej premennej

7. FUNKCIE POJEM FUNKCIE

A Lambda Model Characterizing Computational Behaviours of Terms

Goniometrické rovnice a nerovnice. Základné goniometrické rovnice

Matematika prednáška 4 Postupnosti a rady 4.5 Funkcionálne rady - mocninové rady - Taylorov rad, MacLaurinov rad

6 Limita funkcie. 6.1 Myšlienka limity, interval bez bodu

Ján Kollár Funkcionálne programovanie 1

ARMA modely čast 2: moving average modely (MA)

Start. Vstup r. O = 2*π*r S = π*r*r. Vystup O, S. Stop. Start. Vstup P, C V = P*C*1,19. Vystup V. Stop

T λx. (λy. x) F λx. (λy. y) if λpca. pca

Tomáš Madaras Prvočísla

{1 x2 }, 1 + x + + xn +

The λ-calculus. Lecturer: John Wickerson. Phil Wadler

Komplexné čísla, Diskrétna Fourierova transformácia 1

Prechod z 2D do 3D. Martin Florek 3. marca 2009

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

x E[x] x xµº λx. E[x] λx. x 2 3x +2

Obvod a obsah štvoruholníka

Vybrané partie z logiky

1.1 Zobrazenia a funkcie

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων

ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

C.S. 430 Assignment 6, Sample Solutions

ΠΕΤΡΟΣ ΣΤΕΦΑΝΕΑΣ ΓΙΩΡΓΟΣ ΚΟΛΕΤΣΟΣ ΕΦΑΡΜΟΓΕΣ ΤΗΣ ΛΟΓΙΚΗΣ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Goniometrické substitúcie

Definícia parciálna derivácia funkcie podľa premennej x. Definícia parciálna derivácia funkcie podľa premennej y. Ak existuje limita.

Gramatická indukcia a jej využitie

Riešenie cvičení z 5. kapitoly

Moderné vzdelávanie pre vedomostnú spoločnosť Projekt je spolufinancovaný zo zdrojov EÚ M A T E M A T I K A

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty

4. Výrokové funkcie (formy), ich definičný obor a obor pravdivosti

About these lecture notes. Simply Typed λ-calculus. Types

Zložené funkcie a substitúcia

Deliteľnosť a znaky deliteľnosti

ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2014

ARMA modely čast 2: moving average modely (MA)

Matematika 2. časť: Funkcia viac premenných Letný semester 2013/2014

Integrovanie racionálnych funkcií

x x x2 n

MATEMATICKÁ ANALÝZA 1

Type Theory and Coq. Herman Geuvers. Principal Types and Type Checking

From the finite to the transfinite: Λµ-terms and streams

Η γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου

Απόδειξη. Η ιδιότητα(vi) του ορισμού δεν ισχύει στην πράξη αυτή. Πράγματι, έχουμε. 1 (x, y, z) =(1 x, 1 y, 2 1 z) =(x, y, 2z)

Úvod do lineárnej algebry. Monika Molnárová Prednášky

Kompilátory. Cvičenie 6: LLVM. Peter Kostolányi. 21. novembra 2017

FUNKCIE N REÁLNYCH PREMENNÝCH

Podnikateľ 90 Mobilný telefón Cena 95 % 50 % 25 %

Príklady na precvičovanie Fourierove rady

M6: Model Hydraulický systém dvoch zásobníkov kvapaliny s interakciou

Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει:

VLASTNÉ ČÍSLA A JORDANOV KANONICKÝ TVAR. Michal Zajac. 3 T b 1 = T b 2 = = = 2b

ιαφάνειες παρουσίασης #11

ΟΜΟΣΠΟΝ ΙΑ ΕΚΠΑΙ ΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑ ΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2013

Η γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations)

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος

Reálna funkcia reálnej premennej

Spojité rozdelenia pravdepodobnosti. Pomôcka k predmetu PaŠ. RNDr. Aleš Kozubík, PhD. 26. marca Domovská stránka. Titulná strana.

Η γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας

MIDTERM (A) riešenia a bodovanie

Planárne a rovinné grafy

Metódy vol nej optimalizácie

Τυποποίηση και Τερματισμός στο λ-λογισμό

FUNKTSIONAALNE PROGRAMMEERIMINE. Skeemid. Eesmärk: esitada riistvara skeeme ja teisi andmevoodiagrammidel baseeruvaid kirjeldusi Haskellis

Matematika 2. časť: Analytická geometria

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Εισαγωγή στη Γλώσσα ML

KATEDRA DOPRAVNEJ A MANIPULAČNEJ TECHNIKY Strojnícka fakulta, Žilinská Univerzita

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Funkcie - základné pojmy

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

7 Derivácia funkcie. 7.1 Motivácia k derivácii

Introduction to Type Theory February 2008 Alpha Lernet Summer School Piriapolis, Uruguay. Herman Geuvers Nijmegen & Eindhoven, NL

The Simply Typed Lambda Calculus

Lineárna algebra I - pole skalárov, lineárny priestor, lineárna závislosť, dimenzia, podpriestor, suma podpriestorov, izomorfizmus

ALGEBRA. Číselné množiny a operácie s nimi. Úprava algebrických výrazov

1 Prevod miestneho stredného slnečného času LMT 1 na iný miestny stredný slnečný čas LMT 2

3. Striedavé prúdy. Sínusoida

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

ECE570 Lecture 6: Rewrite Systems

PRIEMER DROTU d = 0,4-6,3 mm

Symbolická logika. Stanislav Krajči. Prírodovedecká fakulta

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

Αλγόριθμοι. Α. Υπολογιστικά Προβλήματα. Β. Εισαγωγή στους Αλγόριθμους. Γ. ομή Αλγόριθμων. Δ. ομές εδομένων

Συναρτησιακός προγραμματισμός : Η άλλη πλευρά του νομίσματος

24. Základné spôsoby zobrazovania priestoru do roviny

LR(0) syntaktické analyzátory. doc. RNDr. Ľubomír Dedera

Σύντομη Εισαγωγή στην SML/NJ

Εισαγωγή στη Γλώσσα ML. Juan Miró

KURZ JAZYKA C učebný text pre kvartu a kvintu osemročného gymnázia

1. písomná práca z matematiky Skupina A

Vybrané partie z logiky

Obsah. 1.1 Reálne čísla a ich základné vlastnosti Komplexné čísla... 8

Chí kvadrát test dobrej zhody. Metódy riešenia úloh z pravdepodobnosti a štatistiky

Transcript:

Lambda calculus Štruktúra prednášok: úvod do syntaxe, netypovaný λ-kalkul (gramatika + konvencie) sémantika (redukčné pravidlá) programovací jazyk nad λ-kalkulom domáca úloha: interpreter λ-kalkulu,... rekurzia (pevný bod) vlastnosti teórie de Bruijn-ova notácia typovaný λ-kalkul domáca úloha: typovač λ-kalkulu,...

Vznik teórie 20.-30.-te roky formalizácia matematiky, logiky 1932 skúmanie funkcií, základy matematiky Alonzo Church Haskell Curry λ-kalkul 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

Od Haskellu k λ-kalkulu length [] = 0 length (x:xs) = 1+length xs > length [1,2,3,4,5] let length xs = if (null xs) then 0 else (1+length (tail xs)) in length [1,2,3,4,5] let length xs = (if (null xs) 0 ((+) 1 (length (tail xs)))) in (length ((:) 1 ((:) 2 ((:) 3 ((:) 4 ((:) 5 []))))) ) let length = λys.(if (null xs) 0 ((+) 1 (length (tail ys)))) in (length let length = (λf.λys.(if (null xs) 0 ((+) 1 (f (tail ys)))) ) length in (length let length = Y(λf.λys.(if (null xs) 0 ((+) 1 (f (tail ys)))) ) in (length

Syntax Celý program v jazyku pozostáva z jedného λ-termu. L je λ-term: x je premenná (spočítateľná množina premenných) L ::= x (L L) (λx L) 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 Cvičenie (na zamyslenie): syntax jazyka je veľmi jednoduchá, neporovnateľná napr. s Pascalom. Zamyslite sa nad tým, či existuje viac programov v Pascale alebo λ-termov.

Príklady λ-termov (λx x) (λx y) (λx (x x)) ((λx (x x)) (λx (x x))) (λy (λx (x x))) z týchto príkladov zatiaľ nie je evidentné, že to bude programovací jazyk.

Syntaktické konvencie malé písmená označujú premenné: x, y, x 1, x 2, 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 ale nie (λx.x)x ((λ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 termov O ich dôležitosti sa dozvieme neskôr, keď budeme vedieť, ako sa v tejto teórii počíta K = λxy.x = λx.λy.x (funkcia s dvomi argumentami, výsledkom je 1.) I = λx.x (identita) S = λxyz.xz(yz) = λxyz.((x z) (y z)) (S a b c = (a c) (b c) ) ω= λx.xx Ω = ωω = (λx.x x)(λx.x x) ω 3 = λx.xxx = (λx ((x x) x))

Výpočet na to, aby sme vedeli počítať v tejto teórii, potrebujeme definovať redukčné pravidlo(á), ktoré simuluje krok výpočtu, redukčné pravidlo je založené na pojme substitúcie, ktorú, ak pochopíme len intuitívne, dostaneme intuitívne zlé výsledky, preto sa vybudovaniu substitúcie treba chvíľku venovať s pomocnými pojmami, ako je voľná premenná,... musíme sa presvedčiť, že redukčné pravidlo má rozumné vlastnosti, zamyslíme sa nad tým, čo je rozumné... výpočet je opakované aplikovanie redukčného pravidla, a to kdekoľvek to v terme ide. Keď to už nejde, máme výsledok (tzv. normálna forma) môže sa stať, že rôznym aplikovaním red.pravidla prídeme k rôznym výsledkom, resp. rôznym výpočtom???

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á λ-termu Bound(x) = {} Bound(λx.M) = Bound(M) U {x} Bound(M N) = Bound(M)UBound(N) viazaná premenná a voľná premenná: λx.xy y je voľná, x je viazaná Bound(M) Free(M) =??? 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 λx.λy.(x z) x je viazaná, z voľná, y sa nenachádza v Subt(λx.λy.(x z)) λ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) ) = Subt( ((w x) (y z)) ), lebo Subt( w x (y z) ) obsahuje tieto podtermy: ((w x) (y z)), (w x), (y z), w, x, z, y teda w x (y z) = (w x)(y z)

Substitúcia ak sa na to ide naivne (alebo textovo ): (λx.zx)[z:y] -> λx.yx (λy.zy)[z:y] -> λy.yy Problém: rovnaké vstupy, rôzne výsledky výrazy (λx.zx) a (λy.zy) intuitívne predstavujú rovnaké funkcie a po substitúcii [z:y] sú výsledky λx.yx a λy.yy intuitívne rôzne funkcie 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 x Free(B), y Free(M) ak z nie je voľné v B alebo M, z Free((B M)),x y inak (λy.b)[x:m] = λy.b[x:m] x y správne:(λy.zy)[z:y]->(λw.(zy)[y:w])[z:y]->(λw.(z w))[z:y] ->λw.yw

Príklady naivne (λ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] = treba si vymyslieť novú premennú (λ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)

Vlastnosti substitúcie Ak premenná x nie je voľná v M, x Free(M), potom M[x:N] = M. Dôkaz indukciou Ak Free(M) =, M nazývame uzavretý výraz. Dosledok: Uzavretý výraz sa aplikáciou substitúcie nezmení. Lemma: x y sú rôzne premenné, x nie je voľná v L, x Free(L), ak každá viazaná premenná v M nie je voľná v (N L) v Bound(M) v Free((N L) ), potom 1. M[x:N] [y:l] = M[y:L][x:N[y:L]] 2. M[y:N] [y:l] = M[y:N[y:L]]

1) M[x:N] [y:l] = M[y:L][x:N[y:L]] Indukciou vzhľadom na M: M je premenná M = x, obe strany sú N[y:L] M = y, obe strany sú L, lebo x nie je voľná v L, M = z, rôzna premenná od x,y, potom obe strany sú z. M =(λz.q) z = x, obe strany sú (λx.(q[y:l])) Predpoklady: x y x Free(L), v Bound(M) v Free((N L)) z = y, obe strany sú (λy.(q[x:n])), lebo y nie je voľná v (N L), takže ani N z je rôzne od x,y, potom, podľa predpokladu, z nie je voľná v N ani L (λz.q)[x:n] [y:l] = λz.(q[x:n]) [y:l] = λz.(q[x:n][y:l]) = indukcia λz.(q[y:l][x:n[y:l]]) = (λz.q)[y:l][x:n[y:l]]. M =(Q R), no problem, indukciou na Q a R...

2) M[y:N] [y:l] = M[y:N[y:L]] Domáca úloha: podobne dokážte tvrdenie 2) predchádzajúcej lemmy. Domáca úloha: za akých podmienok (najslabších) platí, navrhnite a zdôvodnite, dokážte... M[x:N] [y:l] = M[y:L][x:N] M[x:y] [y:n] = M[x:N] M[x:y] [y:x] = M

α-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 intuícia: výrazy, ktoré sa odlišujú menom viazanej premennej predstavujú rovnaké funkcie

β-redukcia K = λxy.x I = λx.x S = λxyz.xz(yz) Príklad: I M = x (λ x.b) E -> β B[x:E] (λ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) -> β λz. ((λxy.x)z((λxy.x)z) ) -> β λz. ((λy.z)((λxy.x)z) ) -> β λz. ((λy.z)(λy.z)) -> β λz.z = I

Vlastnosti β-redukcie ω= λx.xx = λx.(x x) Ω = ωω ω 3 = λx.((x x) x) nekonečná sekvencia Ω -> β Ω -> β Ω -> β puchnúca sekvencia ω 3 ω 3 -> β ω 3 ω 3 ω 3 -> β ω 3 ω 3 ω 3 ω 3 nejednoznačný výsledok pre dva rôzne výpočty KIΩ -> β I ale aj KIΩ -> β KIΩ -> β KIΩ -> β Cvičenie: overte si tieto tvrdenia, Pokúste sa nájsť λ term, ktorý vedie k rôznym výsledkom

η-redukcia λ x.(b x) -> η B ak x Free(B) podmienka je podstatná, lebo ak napr. B=x, teda x Free(B), λx.(x x) x βη je uzáver β U η vzhľadom na podtermy, čo znamená ak M β N alebo M η N, potom M βη N, ak M βη N, potom (P M) βη (P N) aj (M Q) βη (N Q), ak M βη N, potom λx.m βη λx.n.

Domáca úloha Definujte základné funkcie pre interpreter λ-kalkulu: free - zistí, či premenná je voľná subterm - vráti zoznam podtermov substitute - korektne implementuje substitúciu onestepbetareduce normalform - opakuje redukciu, kým sa dá navrhovaná reprezentácia (kľudne si zvoľte inú): data LExp = LAMBDA String LExp abstrakcia ID String premenná LExp [LExp] aplikácia, zovšeobecnená App LExp LExp aplikácia 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šenie (zle) (λ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.x)[x:(λz.y z)] y Free(λz.y z), x:free(x) λy.(λz.y z) (λy.y) -> β (λz.(λy.y) z) -> β (λz.z) -> β I

Riešenie (dobre) Nájdite pomocou vášho nástroja pre vyhodnocovanie λ-výrazov (λx.λy.(x ((λz.y) z))) (((λx. λv.v) 8) (λx.(λw.w) x)) -> β (λx.λy.(x ((λz.y) z))) ((λv.v) (λx.(λw.w) x)) -> β (λx.λy.(x ((λz.y) z))) ((λv.v) (λw.w) ) -> β (λx.λy.(x ((λz.y) z))) (λv.v) -> β λy.((λv.v) ((λz.y) z)) -> β λy.(((λz.y) z)) -> β λy.y

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

Domáca úloha (nepovinná) Pri práci s vašim interpretrom vám bude chýbať: vstup λ termu funkcia fromstring :: String -> LExp, ktorá vám vytvorí vnútornú reprezentáciu z textového reťazca, príklad: fromstring \x.xx = (LAMBDA x (LExp [(Id x ), (Id x )])) takejto funkcii sa hovorí syntaktický analyzátor a musíte sa vysporiadať s problémom, keď je vstupný reťazec nekorektný výstup λ termu funkcia tostring :: LExp -> String, ktorá vám vytvorí textovú (čitateľnú) reprezentáciu pre λ term.

čo by Vás mohlo inšpirovať Fold na termoch foldlambda lambda var apl con cn lterm lterm == (LAMBDA str exp) = lambda str (foldlambda lambda var apl con cn exp) lterm == (VAR str) = var str lterm == (APL exp1 exp2) = apl lterm == (CON str) = con str lterm == (CN int) = cn int (foldlambda lambda var apl con cn exp1) (foldlambda lambda var apl con cn exp2) vars = foldlambda (\x y->y) (\x->[x]) (++) (\_->[]) (\_->[]) show :: LExp -> String show = foldlambda (\x y->"(\\"++x++"->"++y++")") (\x->x) (\x y->"("++x++" "++y++")") (\x->x) (\x->x)

Od λ-termu k programu Na to, aby sme vedeli v tomto jazyku programovať, potrebujeme: mať v ňom nejaké hodnoty, napr. aspoň int, bool,... základné dátové typy, záznam (record, record-case), zoznam,... if-then-else let, letrec, či where rekurziu V ďalšom obohatíme λ-kalkul syntaktickými cukrovinkami tak, aby sme sa presvedčili, že sa v tom programovať naozaj dá. Rekurzia pomocou operátora pevného bodu bude najnáročnejším klincom v tejto línii.

Churchove čísla 0 := λf.λx.x 1 := λf.λx.f x 2 := λf.λx.f (f x) 3 := λf.λx.f (f (f x))..... C (+1) 0 = c succ := λn.λf.λx.f(n f x) plus := λm.λn.λf.λx. m f (n f x) Domáca úloha (povinná): definujte mult, definujte 2 n, m n, definujte n-1

Logické hodnoty a operátory TRUE := λx.λy. x := λxy.x FALSE := λx.λy. y := λxy.y AND := λx.λ.y. x y FALSE := λxy.x y FALSE OR := λx.λy. x TRUE y := λxy.x TRUE y NOT := λx. x FALSE TRUE IFTHENELSE := λpxy. p x y AND TRUE FALSE (λ p q. p q FALSE) TRUE FALSE β TRUE FALSE FALSE (λ x y. x) FALSE FALSE β FALSE Cvičenie: definujte XOR

Kartézsky súčin typov (pár) PAIR := λx.λy.λc. c x y := λxyc. c x y LEFT := λx.x TRUE RIGHT := λx.x FALSE TRUE := λx.λy.x := λxy.x FALSE := λx.λy.y := λxy.y LEFT (PAIR A B) LEFT ((λxyc. c x y) A B) β LEFT (λc. c A B) β (λx.x TRUE) (λc. c A B) β (λc. c A B) (λxy.x) β ((λxy.x) A B) β A Cvičenie: definujte n-ticu Curry λ(x,y).m -> λp. (λxλy.m) (LEFT p) (RIGHT p)

Súčet typov (disjunkcia) A+B reprezentujeme ako pár [Bool x (A B)] 1 st := λx.pair TRUE x konštruktor pre A 2 nd := λy.pair FALSE y B 1 st-1 := λz.right z deštruktor pre A 2 nd-1 := λz.right z B?1 st-1 := λz.left z test, či A 1 st-1 1 st A (λz.right z) ( λx.pair TRUE x ) A β RIGHT (PAIR TRUE A) β A Cvičenie: reprezentujte zoznam s konštruktormi Nil, Cons a funkciami isempty, head a tail

where (let, letrec) M where v = N -> (λv.m) N M where v 1 = N 1 -> (λ(v 1, v 2,, v n ).M) (N 1,, N n ) v 2 = N 2 v n = N n zložený where n*(x+n) where -> (λn. (λx.n*(x+n)) (4*n+1)) 3 n = 3 x = 4*n+1