Paradigmata programování 1

Podobné dokumenty
Paradigmata programování 1

Jazyk Scheme: jeho syntax a sémantika

Paradigmata programování 1

Přednáška 3. Rekurze 1

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Paradigmata programování 1

Paradigmata programování 1

1. Od Scheme k Lispu

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Matematická logika. Miroslav Kolařík

Programovací jazyk Pascal

Funkcionální programování. Kristýna Kaslová

Úvod do informatiky. Miroslav Kolařík

Sémantika predikátové logiky

Booleovská algebra. Booleovské binární a unární funkce. Základní zákony.

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Výroková logika. Teoretická informatika Tomáš Foltýnek

Predikátová logika. prvního řádu

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

Paměť počítače. alg2 1

Lokální definice (1) plocha-kruhu

Omezenost funkce. Definice. (shora, zdola) omezená na množině M D(f ) tuto vlastnost. nazývá se (shora, zdola) omezená tuto vlastnost má množina

teorie logických spojek chápaných jako pravdivostní funkce

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Texty k přednáškám z MMAN3: 4. Funkce a zobrazení v euklidovských prostorech

Paradigmata programování II Přednáška 1: Vedlejší efekt

Výroková a predikátová logika - II

Výroková a predikátová logika - II

platné nejsou Sokrates je smrtelný. (r) 1/??

Okruh č.3: Sémantický výklad predikátové logiky

Teorie množin. Čekají nás základní množinové operace kartézské součiny, relace zobrazení, operace. Teoretické základy informatiky.

Algoritmizace a programování

Matematika I (KMI/PMATE)

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

Architektura počítačů Logické obvody

Architektura počítačů Logické obvody

Struktura programu v době běhu

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

Matematika (KMI/PMATE)

0.1 Úvod do matematické analýzy

Unární je také spojka negace. pro je operace binární - příkladem může být funkce se signaturou. Binární je velká většina logických spojek

Matematická logika. Miroslav Kolařík

Paradigmata programování 2

Algoritmizace a programování

Odvozené a strukturované typy dat

Základy algoritmizace a programování

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Základní datové struktury

Výroková a predikátová logika - II

Stefan Ratschan. Fakulta informačních technologíı. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

0.1 Funkce a její vlastnosti

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Základy logiky a teorie množin

Booleovy algebry. Irina Perfilieva. logo

Sdílení dat mezi podprogramy

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Množiny, relace, zobrazení

Predikátová logika (logika predikátů)

Funkce, elementární funkce.

Úvod do programovacích jazyků (Java)

Matematická analýza 1

Pro každé formule α, β, γ, δ platí: Pro každé formule α, β, γ platí: Poznámka: Platí právě tehdy, když je tautologie.

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Formální systém výrokové logiky

Booleovská algebra. Pravdivostní tabulka. Karnaughova mapa. Booleovské n-krychle. Základní zákony. Unární a binární funkce. Podmínky.

Překladač a jeho struktura

Teoretická informatika Tomáš Foltýnek Algebra Struktury s jednou operací

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Základy algoritmizace a programování

Matematická analýza ve Vesmíru. Jiří Bouchala

Paradigmata programování 1 poznámky k přednášce. 3. Rekurze 1

Základní pojmy matematické logiky

4.2 Syntaxe predikátové logiky

Místo pojmu výroková formule budeme používat zkráceně jen formule. Při jejich zápisu

1 Báze a dimenze vektorového prostoru 1

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Bakalářská matematika I

Úvod do TI - logika Predikátová logika 1.řádu (4.přednáška) Marie Duží marie.duzi@vsb.cz

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Čísla v plovoucířádovéčárce. INP 2008 FIT VUT v Brně

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vyřešené teoretické otázky do OOP ( )

Funkcionální programování úvod

0. ÚVOD - matematické symboly, značení,

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Úvod. Programovací paradigmata

Matematika B101MA1, B101MA2

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D.

Matematická logika. Rostislav Horčík. horcik

1 Výroková logika 1. 2 Predikátová logika 3. 3 Důkazy matematických vět 4. 4 Doporučená literatura 7

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Matematická analýza pro informatiky I.

Poslední aktualizace: 14. října 2011

Rovnost lze vyjádřit jako predikát, např. můžeme zvolit, že P(x, y) reprezentujetvrzení xjerovnoy.

Výroková logika - opakování

Transkript:

Paradigmata programování 1 Vytváření abstrakcí pomocí procedur Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 2 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 1 / 43

Přednáška 2: Přehled 1 Uživatelsky definované procedury: procedury a λ-výrazy, speciální forma lambda a vznik procedur aplikace procedur, prostředí a jejich hierarchie, rozšíření vyhodnocovacího procesu, lexikální a dynamický rozsah platnosti symbolů. 2 Procedury vyšších řádů: procedury jako elementy prvního řádu, procedury versus (matematické) funkce. 3 Jazyk Scheme: další podmíněné výrazy, speciální formy cond, and a or. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 2 / 43

Opakování Syntax a sémantika jazyka syntax = tvar (jak se program zapisuje) sémantika = význam (co program znamená) Jazyk Scheme program = posloupnost S-výrazů, interpretace programu daná popisem vyhodnocování elementů jazyka během vyhodnocování dochází k postupné aplikaci procedur Abstrakce pojmenováním hodnot definice vazeb symbolů v počátečním prostředí nutné zavést speciální formy vyšší míra abstrakce = vyšší programátorský komfort V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 3 / 43

Nový typ abstrakce: vytváření nových procedur Motivace redundance kódu snaha eliminovat (čistota kódu / efektivita), vytvoření nové procedury (musíme zajistit), pojmenování nové procedury (známe define). Příklad (Výpočet délky přepony) Místo: (sqrt (+ (* 3 3) (* 4 4))) = 5 Chceme: (prepona 3 4) = 5 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 4 / 43

λ-výrazy a vznik procedur Vytvoření procedury: (lambda (x) (* x x)) = #<procedure 8221f10> procedura, která pro dané x vrací násobek x s x Přímá aplikace procedury: ((lambda (x) (* x x)) 8) = 64 Pojmenování a následná aplikace procedury: (define na2 (lambda (x) (* x x))) (na2 2) = 4 (+ 1 (na2 4)) = 17 (na2 (na2 8)) = 4096 Mantra k zapamatování: procedury vznikají vyhodnocením λ-výrazů (!!) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 5 / 43

Syntaxe λ-výrazů Definice (λ-výraz) Každý seznam ve tvaru (lambda ( param 1 param 2 param n ) tělo ), kde n je nezáporné číslo, param 1, param 2,..., param n jsou vzájemně různé symboly, tělo je libovolný symbolický výraz, se nazývá λ-výraz. λ-výraz je seznam (ve speciálním tvaru), symboly param 1,..., param n jsou formální argumenty (parametry), n je počet formálních argumentů (parametrů) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 6 / 43

Poznámky k λ-výrazům (lambda ( param 1 param 2 param n ) tělo ) Formální argumenty: účel = pojmenování hodnot (se kterými je vytvořená proc. aplikována), připouští se i nula formálních argumentů (prázdný seznam!!). Tělo procedury: představuje předpis procedury, je vykonáváno při aplikaci procedury, (obvykle) obsahuje symboly param i. Vyhodnocení λ-výrazů lambda nemůže být procedura, lambda je speciální forma, nutno specifikovat, jak se vyhodnocuje (!!) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 7 / 43

Volné a vázané výskyty symbolů Symboly vyskytující se v těle λ-výrazu dělíme na: 1 vázané symboly symboly, které jsou formálními argumenty λ-výrazu 2 volné symboly všechny ostatní symboly v těle λ-výrazu Příklad (lambda (x y nepouzity) (* (+ 1 x) y)) nemají výskyt v těle: nepouzity vázané: x, y volné: +, * volné a vázané symboly různé role konzistentní přejmenování vázaných symbolů nemění význam λ-výrazu V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 8 / 43

Zjednodušený model aplikace procedur Definice (aplikace uživatelsky definovaných procedur) Při aplikaci procedury vzniklé vyhodnocením λ-výrazu (lambda ( param 1 param 2 param n ) tělo ) dojde k vytvoření lokálního prostředí, ve kterém: na symboly formálních argumentů param 1,..., param n jsou navázány hodnoty, se kterými je procedura aplikována požadavek: stejný počet argumentů a formálních argumentů v lokálním prostředí je vyhodnoceno tělo procedury během vyhodnocení těla procedury se hledají vazby symbolů následovně: vazby vázaných symbolů se hledají v lokálním prostředí, vazby volných symbolů se hledají v počátečním prostředí. výsledek aplikace procedury = hodnota vzniklá jako výsledek vyhodnocení těla V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 9 / 43

Příklad (Příklady uživatelsky definovaných procedur) (define na3 (lambda (x) (* x (na2 x)))) (define na4 (lambda (x) (na2 (na2 x)))) (define na5 (lambda (x) (* (na2 x) (na3 x)))) (define na6 (lambda (x) (na2 (na3 x)))). (define abs (lambda (x) (if (>= x 0) x (- x)))) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 10 / 43

Příklad (Identita) ((lambda (x) x) 20) = 20 (define id (lambda (x) x)) (id (* 2 20)) = 40 (id (+ 1 (id 20))) = 21 (id #f) = #f ((id -) 10 20) = -10 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 11 / 43

Příklad (Projekce) (lambda (x y z) x) = první projekce (lambda (x y z) y) = druhá projekce (lambda (x y z) z) = třetí projekce (define 1-z-3 (lambda (x y z) x)) (define 2-z-3 (lambda (x y z) y)) (define 3-z-3 (lambda (x y z) z)) (1-z-3 10 20 30) = 10 (2-z-3 10 (+ 1 (3-z-3 2 4 6)) 20) = 7 ((3-z-3 #f - +) 13) = 13 ((2-z-3 1-z-3 2-z-3 3-z-3) 10 20 30) = 20 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 12 / 43

Příklad (Konstantní procedury a procedury bez argumentu) (lambda (x) 10) = procedura vrať číslo 10 (lambda (x) #f) = procedura: vrať pravdivostní hodnotu #f (lambda (x) +) = procedura: vrať hodnotu navázanou na symbol +. (define c (lambda (x) 10)) (+ 1 (c 20)) = 11 (((lambda (x) -) 10) 20 30) = -10 (define const-proc (lambda (x) 10)) (define noarg-proc (lambda () 10)) (const-proc 20) = 10 (noarg-proc) = 10 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 13 / 43

Nutné rozšíření (abstraktního) interpretu Scheme Aplikace uživatelsky definovaných procedur vyžaduje: 1 obecný pojem prostředí prostředí již není jen jedno (globální / počáteční) každé aplikace vyžaduje lokální prostředí pro uchování hodnot argumentů 2 rozšíření Eval předchozí chápání vyhodnocování nestačí (vyhodnocení symbolu je problém) vyhodnocování elementů musí být definováno relativně vzhledem k prostředí 3 přesný popis sémantiky speciální formy lambda z čeho se skládá procedura vzniklá vyhodnocením λ-výrazu 4 popis Apply pro uživatelsky definované procedury jak probíhá aplikace uživatelsky definované procedury V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 14 / 43

Prostředí a jejich hierarchie Definice (prostředí) Prostředí P obsahuje: tabulka vazeb mezi symboly a elementy (jako doposud), ukazatel na svého předka (ukazatel na jiné prostředí). Výjimka: globální (počíteční) prostředí nemá předka (pouze tabulka vazeb). Značení P 1 P 2 znamená: P 1 je předkem prostředí P 2 (také: P 1 je nadřazeno P 2 ) s P E znamená: na symbol s je v prostředí P navázán element E (také: E je aktuální vazba symbolu s v prostředí P) zkrácené značení: s E pokud je P patrné z kontextu V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 15 / 43

Definice (vyhodnocení elementu E v prostředí P) Výsledek vyhodnocení elementu E v prostředí P, značeno Eval[E, P], je definován: (A) Pokud je E číslo, pak Eval[E, P] := E. (B) Pokud je E symbol, mohou nastat tři situace: (B.1) Pokud E P F, pak Eval[E, P] := F. (B.2) Pokud E nemá vazbu v P a pokud P P, pak Eval[E, P] := Eval[E, P ]. (B.e) Pokud E nemá vazbu v P a pokud P = P G, pak CHYBA: E nemá vazbu. (C) Pokud je E ve tvaru (E 1 E 2 E n ), pak F 1 := Eval[E 1, P] a rozlišujeme: (C.1) Pokud F 1 je procedura, pak pro F 2 := Eval[E 2, P],..., F n := Eval[E n, P] položíme Eval[E, P] := Apply[F 1, F 2,..., F n ]. (C.2) Pokud F 1 je speciální forma, pak Eval[E, P] := Apply[F 1, E 2,..., E n ]. (C.e) Pokud F 1 není procedura ani speciální forma: CHYBA: Nelze provést aplikaci: první prvek seznamu E se nevyhodnotil na proceduru ani na speciální formu.. (D) Ve všech ostatních případech klademe Eval[E, P] := E. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 16 / 43

Anatomie uživatelsky definovaných procedur Co jsou uživatelsky definované proedury: elementy jazyka Scheme, nemají čitelnou reprezentaci, skládají se z několika složek (komponent), které jsou potřeba pro jejich aplikaci. Definice (uživatelsky definovaná procedura) Každá trojice ve tvaru parametry, tělo, P, kde parametry je seznam formálních argumentů, tělo je libovolný element, P je prostředí, se nazývá uživatelsky definovaná procedura. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 17 / 43

Sémantika speciální formy lambda Definice (speciální forma lambda) Při aplikaci speciální formy lambda vyvolané vyhodnocením λ-výrazu (lambda ( param 1 param 2 param n ) tělo ) v prostředí P vznikne procedura ( param 1 param 2 param n ), tělo, P. Poznámky: při aplikaci speciální formy lambda se nic nevyhodnocuje (!!) vytvoření nové procedury je levná záležitost procedura: parametry, tělo, prostředí vzniku (prostředí aplikace lambda) lambda je překvapivě jednoduchá Aktuální prostředí = prostředí, v němž byla vyvolána aplikace speciální formy V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 18 / 43

Definice (aplikace procedury) Mějme dánu proceduru E a nechť E 1,..., E n jsou libovolné elementy jazyka. Aplikace procedury E na argumenty E 1,..., E n (v tomto pořadí), značená Apply[E, E 1,..., E n ] je definována následovně: Pokud je E primitivní procedura,... Pokud je E uživatelsky definovaná procedura ve tvaru ( param 1 param m ), tělo, P, pak: 1 Pokud se m n, pak CHYBA: Chybný počet argumentů. 2 Vytvoří se nové prázdné prostředí P l, které nazýváme lokální prostředí procedury. 3 Nastavíme předka prostředí P l na hodnotu P. 4 V prostředí P l se zavedou vazby param i E i pro i = 1,..., n. 5 Položíme Apply[E, E 1,..., E n ] := Eval[ tělo, P l ]. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 19 / 43

Příklad (Výpočet délky přepony) (define na2 (lambda (x) (* x x))) (define soucet-ctvercu (lambda (a b) (+ (na2 a) (na2 b)))) (define prepona (lambda (odvesna-a odvesna-b) (sqrt (soucet-ctvercu odvesna-a odvesna-b)))) (prepona 3 4) = 5 (jak vypadají prostředí) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 20 / 43

Procedury vyšších řádů Pojmenované / anonymní procedury ve většině PJ vznikají procedury jako pojmenované (mají vždy jméno), ve Scheme vznikají jako anonymní (bezejmenné). Procedury vyšších řádů (pojem pochází z matematické logiky) procedury, kterým předáváme jiné procedury jako argumenty procedury, které vracejí jiné procedury jako výsledky aplikace Poznámka (nikoli okrajová): ve vetšině programocích jazyků jsou procedury vyšších řádů černá magie ve Scheme (a jiných funkcionálních jazycích) jsou zadarmo všechny procedury ve Scheme jsou de facto procedury vyšších řádů V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 21 / 43

Příklad (Procedury jako argumenty) (define infix (lambda (x operace y) (operace x y))) (infix 10 + 20) = 30 (infix 10 - (infix 2 + 5)) = 3 (infix 10 (lambda (x y) x) 20) = 10 (infix 10 (lambda (x y) 66) 20) = 66 (infix 10 (lambda (x) 66) 20) = CHYBA! (infix 10 20 30) = CHYBA! V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 22 / 43

Příklad (Procedury jako návratové hodnoty) (define curry+ (lambda (c) (lambda (x) (+ x c)))) (define f (curry+ 10)) f = #<PROCEDURE...> (f 20) = 30 (jak vypadají prostředí) role symbolů: v těle f je x vázaný a c volný obecný princip rozkladu zvaný currying (H. Curry) lze aplikovat na procedury jiné než + analogicky pro tři a více argumentů V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 23 / 43

Procedury (ve Scheme) funkce (matematické) Procedury ve Scheme (speciální elementy jazyka) mají vstupní argumenty, po aplikaci produkují výstupní hodnoty Matematické funkce (zobrazení, více v kursu Úvod do informatiky) zobrazení z množin A 1,..., A n do množiny B je relace f A 1 A n B, pro kterou platí: pro každé a 1 A 1,..., a n A n existuje právě jedno b B tak, že a 1,..., a n, b f. označujeme f : A 1 A n B f(a 1,..., a n ) = b místo a 1,..., a n, b f Různé pojmy: některé procedury se nechovají jako zobrazení, některá zobrazení mohou být reprezentována procedurami, některá zobrazení nemohou být reprezentována procedurami. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 24 / 43

Příklad (Procedury, které se nechovají jako matematické funkce) Nekončící série aplikací: (define f (lambda (x) (x x)) (f f) = Aplikace procedury vracející pro stejné argumenty různé hodnoty: (random 5) = 3 (random 5) = 2 (random 5) = 1 (random 5) = 3. (define f (lambda (x) (random 5))) (f 10) = 2 (f 10) = 3. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 25 / 43

Matematické funkce reprezentovatelné procedurami Příklad Funkce f : R R dané předpisy f(x) = x 2, f(x) = x + 1, f(x) = x,... 2 lze reprezentovat procedurami vzniklými vyhodnocením: (lambda (x) (* x x)) (lambda (x) (/ (+ x 1) 2)) (lambda (x) (if (>= x 0) x (- x))). V informatice (a matematice) běžná praxe: funkce (procedury) se vyjadřují pomocí jiných funkcí (procedur) (např. posunutím, škálováním,... ) funkce (procedury) lze skládat,... V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 26 / 43

Funkce vzniklé posunem f po osách x a y Definice (Funkce vzniklé posunutím) Mějme funkci f : R R. Pak pro každé k R, zavedeme funkci f X,k : R R a f Y,k : R R tak, že položíme f X,k (x) = f(x k), f Y,k (x) = f(x) + k. 4 4 x 2 + 1 x 2 (x 1) 2 x 2 3 2 1 3 2 1 1 2 3 4 1 2 3 4 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 27 / 43

Příklad (Vyjádření ve Scheme) (define x-shift (lambda (f k) (lambda (x) (f (- x k))))) (define y-shift (lambda (f k) (lambda (x) (+ k (f x))))) (x-shift na2 1) = druhá mocnina posunutá o 1 na ose x (y-shift na2 1) = druhá mocnina posunutá o 1 na ose y ((x-shift na2 1) 1) = 0 ((x-shift na2 1) 2) = 1 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 28 / 43

Příklad (Procedura generující polynomické funkce) Funkce f : R R daná kde a R a n R. f(x) = a x n, Odpovídající procedura: (define make-poly-f (lambda (a n) (lambda (x) (* a (expt x n))))) 4 3.5x x 2 x (make-poly-f 3.5 1) = f(x) = 3.5x (make-poly-f 1 2) = f(x) = x 2 (make-poly-f 1 1) = f(x) = x (make-poly-f 1 1/2) = f(x) = x (make-poly-f 1 0) = f(x) = 1 3 2 1 1 2 3 4 x 1 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 29 / 43

Příklad (Složení dvou funkcí / procedur) Mějme funkce f : X Y a g : Y Z. Pak složenou funkcí (f g): X Z nazveme funkci, jejíž hodnota je definovaná předpisem (f g)(x) = g ( f(x) ) pro každé x X. Vlastnosti operace skládání: Ve Scheme: f (g h) = (f g) h, (define compose2 (lambda (f g) (lambda (x) (g (f x))))) asociativita, ι f = f ι = f, neutralita vzhledem k ι(x) = x. V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 30 / 43

Příklad (Skládání procedur příklady) (define f na2) (define g (make-poly-f 1/2 1)) (define f*g (compose2 f g)) (define g*f (compose2 g f)) 4 f f g g f 3 2 1 1 2 3 4 g f*g = (f g)(x) = 1 2 x2 g*f = (g f)(x) = ( ) x 2 2 V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 31 / 43

Funkcionální přístup Výhodné: chápat procedury jako funkce snadné ladění (debugging / odbroukování) výsledky aplikace závisejí pouze na argumentech procedur (idealizace; pozor na symboly, které se vyskytují jako volné!) Definice (element prvního řádu) Element prvního řádu je každý element jazyka, pro který platí: 1 element může být pojmenován, 2 element může být předán proceduře jako argument, 3 element může vzniknout aplikací (voláním) procedury, 4 element může být obsažen v hierarchických datových strukturách. Kouzlo Scheme: vše je (může být) element prvního řádu. (!!) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 32 / 43

Lexikální a dynamický rozsah platnosti Lexikální rozsah platnosti (symbolů / proměnných) vazby symbolů v těle procedury, jejichž vazby nejsou nalezeny v lokálním prostředí se hledají v prostředí vzniku procedury používá: většina programovacích jazyků včetně Scheme, C, Pascal,... plusy: strukturu prostředí lze vyčíst z programu někdy se nazývá: statický rozsah platnosti Dynamický rozsah platnosti (symbolů / proměnných) vazby symbolů v těle procedury, jejichž vazby nejsou nalezeny v lokálním prostředí se hledají v prostředí aplikace procedury používá: prakticky nikdo (FoxPro) minusy: vazby symbolů lze vyčíst až za běhu programu / obtížné ladění V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 33 / 43

Příklad (Statický vs. dynamický rozsah platnosti) (define curry+ (lambda (c) (lambda (x) (+ x c)))) (define c 100) (define f (curry+ 10)) (f 20) =??? ((lambda (c) (f 20)) 1000) =??? V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 34 / 43

Scheme: negace pravdivostních hodnot Příklad (negace zobecněných pravdivostních hodnot) (not #t) = #f (not #f) = #t (not 0) = #f (not -12.5) = #f (not (lambda (x) (+ x 1))) = #f (not (<= 1 2)) = #f (not (> 1 3)) = #t Procedura not je definovatelná: (define not (lambda (x) (if x #f #t))) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 35 / 43

Scheme: vytváření podmínek pomocí konjunkce Příklad (konjunkce zobecněných pravdivostních hodnot) (and (= 0 0) (odd? 1) (even? 2)) = #t (and (= 0 0) (odd? 1) (even? 2) 666) = 666 (and 1 #t 3 #t 4) = 4 (and 10) = 10 (and +) = procedura sčítání (and) = #t (and (= 0 0) (odd? 2) (even? 2)) = #f (and 1 2 #f 3 4 5) = #f Pozor: and ve Scheme je speciální forma (!!) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 36 / 43

Definovatelnost and pomocí if (and test 1 test n ) lze nahradit vnořenými if-výrazy: (if test 1 (if test 2 (if (if test n 1 test n #f)... #f) #f) #f) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 37 / 43

Scheme: vytváření podmínek pomocí disjunkce Příklad (konjunkce zobecněných pravdivostních hodnot) (or (even? 1) (= 1 2) (odd? 1)) = #t (or (= 1 2) (= 3 4) 666) = 666 (or 1 #f 2 #f 3 4) = 1 (or (+ 10 20)) = 30 (or) = #f (or #f) = #f (or #f (= 1 2) #f) = #f Pozor: or ve Scheme je speciální forma (!!) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 38 / 43

Definovatelnost or pomocí if (or test 1 test n ) lze (zatím bez újmy) nahradit vnořenými if-výrazy: (if test 1 test 1 (if test 2 test 2 (if (if test n test n #f) ))) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 39 / 43

Příklad (příklady použití and a or) (define within? (lambda (x a b) (and (>= x a) (<= x b)))) (define overlap? (lambda (a b c d) (or (within? a c d) (within? b c d) (within? c a b) (within? d a b)))) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 40 / 43

Definice (Speciální forma cond) Speciální forma cond se používá ve tvaru: (cond ( test 1 důsledek 1 ) ( test 2 důsledek 2 ) Aplikace cond probíhá:. ( test n důsledek n ) (else náhradník )), kde n 0 a náhradník je nepovinný cond vyhodnocuje (v aktuálním prostředí) výrazy test 1,..., test n do toho okamžiku, až narazí na první test i, který se vyhodnotil na pravdu vyhodnocování dalších test i+1,..., test n se neprovádí a výsledkem je hodnota vzniklá vyhodnocením výrazu důsledek i v aktuálním prostředí jinak: vyhodnotí se náhradník nebo je hodnota nedfinovaná V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 41 / 43

Příklad (Použití speciální formy cond) Funkce signum: 1 pokud x < 0, sgn x = 0 pokud x = 0, 1 pokud x > 0. Implementace ve Scheme: (define sgn (lambda (x) (cond ((= x 0) 0) ((> x 0) 1) (else -1)))) V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 42 / 43

Vztah cond a if (cond ( test 1 důsledek 1 ) ( test 2 důsledek 2 ). ( test n důsledek n ) (else náhradník )) = (if test 1 důsledek 1 (if test 2 důsledek 2 (if (if test n důsledek n náhradník ) ))) if pomocí cond ještě jednodušší... V. Vychodil (KI, UP Olomouc) Vytváření abstrakcí pomocí procedur Přednáška 2 43 / 43