Paradigmata programování 1



Podobné dokumenty
Paradigmata programování 1

Aritmetika s didaktikou I.

Číselné soustavy Ing. M. Kotlíková, Ing. A. Netrvalová Strana 1 (celkem 7) Číselné soustavy

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

1.3.1 Kruhový pohyb. Předpoklady: 1105

(pracovní verze textu určená pro studenty)

( ) Kreslení grafů funkcí metodou dělení definičního oboru I. Předpoklady: 2401, 2208

Paradigmata programování 1

{ } Kombinace II. Předpoklady: =. Vypiš všechny dvoučlenné kombinace sestavené z těchto pěti prvků. Urči počet kombinací pomocí vzorce.

2.8.9 Parametrické rovnice a nerovnice s absolutní hodnotou

9.2.5 Sčítání pravděpodobností I

Semestrální práce NÁVRH ÚZKOPÁSMOVÉHO ZESILOVAČE. Daniel Tureček zadání číslo 18 cvičení: sudý týden 14:30

Rozvrhování zaměstnanců

Nerovnice s absolutní hodnotou

2.7.2 Mocninné funkce se záporným celým mocnitelem

1.1.1 Kvadratické rovnice (dosazení do vzorce) I

Paradigmata programování II Přednáška 6: Líné vyhodnocování, proudy a kešované vyhodnocování

Paradigmata programování 1

3.2.4 Podobnost trojúhelníků II

3. Ve zbylé množině hledat prvky, které ve srovnání nikdy nejsou napravo (nevedou do nich šipky). Dát do třetí

KIV/ZI Základy informatiky. MS Excel maticové funkce a souhrny

( ) Neúplné kvadratické rovnice. Předpoklady:

Paradigmata programování 1

(a) = (a) = 0. x (a) > 0 a 2 ( pak funkce má v bodě a ostré lokální maximum, resp. ostré lokální minimum. Pokud je. x 2 (a) 2 y (a) f.

Kvadratické rovnice pro učební obory

Kvantové počítače algoritmy (RSA a faktorizace čísla)

Svobodná chebská škola, základní škola a gymnázium s.r.o. Zlomky sčítání a odčítání. Dušan Astaloš. samostatná práce, případně skupinová práce

Kapitola 7: Integrál. 1/14

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

1. Programování, typy programovacích jazyků, historie.

Jakub Kákona,

Úpravy skříní a čelních ploch pro úchopovou lištou

Geometrické vektory. Martina Šimůnková. Katedra aplikované matematiky. 9. března 2008

Lisp 7-1. opakování destruktivních změn seznamů

Diferenciální počet funkcí jedné proměnné

( ) ( ) ( ) 2 ( ) Rovnice s neznámou pod odmocninou II. Předpoklady: 2715

AUTORKA Barbora Sýkorová

E-ZAK. metody hodnocení nabídek. verze dokumentu: QCM, s.r.o.

Př. 3: Dláždíme čtverec 12 x 12. a) dlaždice 2 x 3 12 je dělitelné 2 i 3 čtverec 12 x 12 můžeme vydláždit dlaždicemi 2 x 3.

Nyní jste jedním z oněch kouzelníků CÍL: Cílem hry je zničit soupeřovy HERNÍ KOMPONENTY:

Využití EduBase ve výuce 2

M - Rovnice - lineární a s absolutní hodnotou

Matice a maticová algebra, soustavy lineárních rovnic, kořeny polynomu a soustava nelin.rovnic

Kvadratické rovnice pro studijní obory

PRAVDĚPODOBNOST A STATISTIKA OPAKOVÁNÍ, pro rozpoznávání

Zvyšování kvality výuky technických oborů

Dopravní úloha. Jiří Neubauer. Katedra ekonometrie FEM UO Brno

Lineární algebra. Vektorové prostory

Vzdělávací oblast: Matematika a její aplikace. Obor vzdělávací oblasti: Seminář z matematiky. Ročník: 7. Poznámky

Paradigmata programování II Korutiny a nedeterminismus

= musíme dát pozor na: jmenovatel 2a, zda je a = 0 výraz pod odmocninou, zda je > 0, < 0, = 0 (pak je jediný kořen)

IMPORT A EXPORT MODULŮ V PROSTŘEDÍ MOODLE

Řešení: ( x = (1 + 2t, 2 5t, 2 + 3t, t); X = [1, 2, 2, 0] + t(2, 5, 3, 1), přímka v E 4 ; (1, 2, 2, 0), 0, 9 )

STEREOMETRIE. Vzdálenost bodu od přímky. Mgr. Jakub Němec. VY_32_INOVACE_M3r0113

Tvorba trendové funkce a extrapolace pro roční časové řady

Soustavy lineárních rovnic

Úloha č. 6 Stanovení průběhu koncentrace příměsí polovodičů

4.6.6 Složený sériový RLC obvod střídavého proudu

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Zákonitosti, vztahy a práce s daty

DUM 11 téma: Nástroje pro transformaci obrázku

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE. 1 Zaměření a vyrovnání rovinné sítě

Jakub Juránek Určete počet kvádru, jejichž velikosti hran jsou přirozená čísla nejvýše rovná deseti. Kolik je v tomto počtu krychlí?

Cenový a hodnotový počet 2

Dualita v úlohách LP Ekonomická interpretace duální úlohy. Jiří Neubauer. Katedra ekonometrie FEM UO Brno

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

Startovní úloha Samostatná práce

Paradigmata programování II Přednáška 2: Mutace

Název: VY_32_INOVACE_PG3309 Booleovské objekty ve 3DS Max - sčítání a odčítání objektů

SPOLEHLIVOST KONSTRUKCÍ & TEORIE SPOLEHLIVOSTI část 2: Statistika a pravděpodobnost

Programování 4. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Zvyšování kvality výuky technických oborů

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

DUM téma: KALK Výrobek sestavy

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

CERTIFIKOVANÉ TESTOVÁNÍ (CT) Výběrové šetření výsledků žáků 2014

2.7.1 Mocninné funkce s přirozeným mocnitelem

MS WORD 2007 Styly a automatické vytvoření obsahu

když n < 100, n N, pak r(n) = n,

Vztah mezi dvěma čísly, které se rovnají, se nazývá rovnost, jako například : ( 2) 3 = 8 4 = 2 ; 16 = 4 ; 1 = 1 a podobně. 2

Definice z = f(x,y) vázané podmínkou g(x,y) = 0 jsou z geometrického hlediska lokálními extrémy prostorové křivky k, Obr Obr. 6.2.

Google Apps. pošta 2. verze 2012

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

Funkce rostoucí, funkce klesající I

ALGEBRA LINEÁRNÍ, KVADRATICKÉ ROVNICE

Profilová část maturitní zkoušky 2015/2016

Isingův model. H s J s s h s

10. Polynomy a racionálně lomenné funkce

Pingpongový míček. Petr Školník, Michal Menkina. TECHNICKÁ UNIVERZITA V LIBERCI Fakulta mechatroniky, informatiky a mezioborových studií

4. Výčtem prvků f: {[2,0],[3,1],[4,2],[5,3]}

2.6.4 Lineární lomené funkce s absolutní hodnotou

Rovnice s neznámou pod odmocninou a parametrem

Veřejné licence pro počítačové programy

Plán předmětu Název předmětu: Školní rok: Ročník: Semestr: Typ předmětu: Rozsah předmětu: Počet kreditů: Přednášející: Cvičící: Cíl předmětu

Rostislav Horčík. 13. října 2006

16. února 2015, Brno Připravil: David Procházka

INŽENÝRSKÁ MATEMATIKA LOKÁLNÍ EXTRÉMY

Popis a funkce klávesnice Gama originální anglický manuál je nedílnou součástí tohoto českého překladu


UŽITÍ DERIVACÍ, PRŮBĚH FUNKCE

Transkript:

Paradigmata programování 1 Akumulace Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 7 V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 1 / 33

Přednáška 7: Přehled 1 Akumulace pomocí foldr metody akumulace obcházející problémy s apply, foldr jako prostředek abstrakce, efektivní implementace vybraných procedur, zobecňování procedur dvou argumentů na procedury libovolně mnoha argumentů, monoidální operace a vliv na akumulaci. 2 Akumulace pomocí foldl varianty akumulace pracující zleva, implementace variant foldl pomocí foldr. 3 Motivace pro další přednášku: výpočet faktoriálu, výpočet prvků Fibonacciho posloupnosti. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 2 / 33

Opakování: Zpracování seznamů Mapování procedura map konstruuje nový seznam modifikací prvků výchozího seznamu (více seznamů) modifikace prováděna dodanou procedurou Explicitní aplikace procedura apply aplikuje danou proceduru se seznamem argumentů využití: agregace (akumulace) prvků seznamu do (jedné) hodnoty Filtrace procedura filter, odvozená pomocí apply a append konstruuje nový seznam obsahující pouze prvky splňující vlastnost vlastnost je vyjádřena předanou procedurou V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 3 / 33

Akumulace a nevýhody apply Co je akumulace? vytvoření jedné hodnoty (elementu) pomocí více hodnot (elementů) ze seznamu procedura postupně akumuluje prvky seznamu do hodnoty Akumulace pomocí apply: výhody: snadné použití (už známe) nevýhody: (obvykle) nutné použít procedury s libovolně mnoha argumenty (apply +, (apply append, (apply map proc Nový přístup k akumulaci: procedura dvou argumentů, postupné aplikace např. (+ 1 (+ 2 (+ 3 4))) místo (+ 1 2 3 4) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 4 / 33

Příklad (Motivace pro akumulaci) (1 2 3 4) seznam hodnot (cons 1 (cons 2 (cons 3 (cons 4 '())))) = (1 2 3 4) (+ 1 (+ 2 (+ 3 4))) (+ 1 (+ 2 (+ 3 (+ 4 0)))) využití neutrálního prvku (* 1 (* 2 (* 3 (* 4 1)))) (list 1 (list 2 (list 3 (list 4 'blah)))) Společné a rozdílné rysy: stejný styl nabalování (vnořené seznamy) různé aplikované procedury: cons, +, *, list různý způsob terminace v nejvnitřnější aplikaci: '(), 0, 1, 'blah V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 5 / 33

Příklad (Akumulace s procedurou dvou argumentů) (define y+1 (lambda (x y) (+ y 1))) (y+1 'a 0) = 1 (y+1 'a (y+1 'b 0)) = 2 (y+1 'a (y+1 'b (y+1 'c 0))) = 3 (y+1 'a (y+1 'b (y+1 'c (y+1 'd 0)))) = 4 Schematický průběh výpočtu: (y+1 'a (y+1 'b (y+1 'c (y+1 'd 0)))) (y+1 'a (y+1 'b (y+1 'c 1))) (y+1 'a (y+1 'b 2)) (y+1 'a 3) 4 V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 6 / 33

Společný tvar výrazů při akumulaci Příklady (cons 1 (cons 2 (cons 3 (cons 4 '())))) (+ 1 (+ 2 (+ 3 (+ 4 0)))) (* 1 (* 2 (* 3 (* 4 1)))) (y+1 1 (y+1 2 (y+1 3 (y+1 4 0)))) mají společný tvar: ( procedura 1 ( procedura 2 ( procedura 3 ( procedura 4 terminátor )))), kde: procedura je procedura (aspoň) dvou argumentů, terminátor je libovolný element. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 7 / 33

Definice (procedura foldr angl. fold right) Procedura foldr se používá se třemi argumenty ve tvaru: (foldr proc term seznam ), kde argument proc je procedura dvou argumentů, argument term je libovolný element zvaný terminátor, argument seznam je libovolný seznam elementů. Její aplikace je ekvivalentní provedení: ( proc e 1 ( proc e 2 ( proc ( proc e n term ) ))) pro seznam ve tvaru ( e 1 e 2 e n ). v R5RS není přítomna jako primitivní procedura; v našem interpretu ano na foldr se lze dívat jako na prostředek abstrakce V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 8 / 33

Příklad (Předchozí příklady pomocí foldr) Předchozí příklady: (cons 1 (cons 2 (cons 3 (cons 4 '())))) = (1 2 3 4) (+ 1 (+ 2 (+ 3 (+ 4 0)))) = 10 (* 1 (* 2 (* 3 (* 4 1)))) = 24 (y+1 1 (y+1 2 (y+1 3 (y+1 4 0)))) = 4 Zobecnění pomocí foldr: (define s '(1 2 3 4)) (foldr cons '() s) = (1 2 3 4) (foldr + 0 s) = 10 (foldr * 1 s) = 24 (foldr y+1 0 s) = 4. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 9 / 33

Příklad (Další ukázky použití foldr) Vliv terminátoru na tvar konstruovaného seznamu: (define s '(1 2 3 4)) (foldr cons 'base s) = (1 2 3 4. base) (foldr cons '() s) = (1 2 3 4) (foldr list 'base s) = (1 (2 (3 (4 base)))) (foldr list '() s) = (1 (2 (3 (4 ())))) Mezní případ pro prázdný seznam: (foldr list '() '()) = () (foldr list 'base '()) = base (foldr list 666 '()) = 666 V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 10 / 33

Poznámky o činnosti foldr (foldr proc term seznam ) = ( proc e 1 ( proc e 2 ( proc ( proc e n term ) ))) Význam argumentů foldr: 1 terminátor term hodnota, kterou foldr vrací pro prázdný seznam výsledek zabalení prázdného seznamu pomocí foldr je term 2 argumenty akumulační procedury proc : první argument = průběžný prvek x seznamu, druhý argument = výsledek zabalení hodnot následující v seznamu za x Kdy použít foldr? když je potřeba zpracovat prvky seznamu jeden po druhém, když je výhodné postupně zpracovávat prvky od konce seznamu. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 11 / 33

Intermezzo: Připomenutí pojmů z teorie složitosti Časová složitost algoritmu v nejhorším případě: zobrazení T : N N T (n) = počet elementárních kroků potřebných pro provedení výpočtu podle daného algoritmu pro vstupní data délky n a to v nejhorším možném případě (největší trvání délky výpočtu, ze všech možných vstupů délky n) v naší terminologii: provedení výpočtu algoritmu = aplikace procedury Co je (pro nás) elementárním krokem? při práci se seznamy: provedení cons, car, cdr (mírné zjednodušení), vytvoření lokálního prostředí při aplikaci procedury, aritmetické operace: +, *,... (velké zjednodušení) racionální čísla ve Scheme operace nad nimi neprobíhají v konstantním čase toto zjednodušení přijímáme kvůli snazší analýze je bez újmy, v PP se neorientujeme se na numerické výpočty viz kurs Algoritmická matematika V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 12 / 33

Příklad (Délka seznamu efektivně: procedura length) (define length (lambda (l) (apply + (map (lambda (x) 1) l)))) = (define length (lambda (l) (foldr (lambda (x y) (+ 1 y)) 0 l))) Časová složitost: 1 T (n) = 3n (nebo 4n, záleží na míře zjednodušení) 2 T (n) = n (nebo 2n, záleží na míře zjednodušení) Složitost jsme stanovili za předpokladu, že +, map a foldr pracují v lineárním čase v závislosti na počtu sčítanců / délce seznamu (zjednodušení, ale ne velké). Diskuse: je + stejně náročné jako cons? V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 13 / 33

Příklad (Zřetězení dvou seznamů efektivně: procedura append2) (define append2 (lambda (l1 l2) (let ((len1 (length l1)) (len2 (length l2))) = (build-list (+ len1 len2) (lambda (i) (if (< i len1) (define append2 (lambda (l1 l2) (foldr cons l2 l1))) (list-ref l1 i) (list-ref l2 (- i len1)))))))) Časová složitost: n(n + 3) + m(m + 3) 1 T (n) = n(n + 3) protože kroků pro seznamy délek m a n, 2 2 T (n) = 2n, kde n je délka prvního seznamu, výrazně efektivnější (!!). Stejné zjednodušující předpoklady jako pro předchozí případ. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 14 / 33

Příklad (Zřetězení seznamů: procedura append) S využitím předchozího: (define append2 (lambda (l1 l2) (foldr cons l2 l1))) Obecný append s libovolně mnoha argumenty: (define append (lambda lists (foldr append2 '() lists))) elegantní použití foldr, časová složitost: T (n) = n, kde n je délka zřetězení všech seznamů mírné zhoršení v případě dvou seznamů daň za eleganci (navíc není nijak dramatické), lze napravit dodatečným rozlišením případů v těle append. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 15 / 33

Příklad (Mapování přes jeden seznam efektivně: procedura map1) (define map1 (lambda (f l) (build-list = (length l) (lambda (i) (f (list-ref l i)))))) (define map1 (lambda (f l) (foldr (lambda (x y) (cons (f x) y)) '() l))) Časová složitost: 1 T (n) = n(n + 3 + 2t f), 2 2 T (n) = n(2 + t f ), kde člen t f vyjadřuje časovou složitost aplikace f na prvek seznamu (pro stanovení celkové složitosti nutno počítat se složitostí aplikace f). Zde záleží na: struktuře seznamu l a složitosti f. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 16 / 33

Příklad (Filtrování efektivně: procedura filter) (define filter (lambda (f l) (apply append (map (lambda (x) = (if (f x) (list x) '())) l)))) (define filter (lambda (f l) (foldr (lambda (x y) (if (f x) (cons x y) y)) '() l))) Časová složitost: 1 T (n) = n + n(3 + t f ) (lineární), 2 T (n) = n(2 + t f ) (lineární, ale efektivnější), kde člen t f vyjadřuje časovou složitost aplikace predikátu f na prvek seznamu. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 17 / 33

Definice (procedura foldr pro obecně mnoho seznamů) Proceduru foldr lze použít s více seznamy ve tvaru: (foldr proc term seznam 1 seznam 2 seznam k ), argument proc je procedura k + 1 argumentů, argument term je libovolný element zvaný terminátor, každý seznam i je seznam elementů stejné délky. Její aplikace je ekvivalentní provedení: ( proc e 1,1 e 2,1 e k,1 ( proc e 1,2 e 2,2 e k,2 ( proc ( proc e 1,n e 2,n e k,n term ) ))) pro každý seznam i ve tvaru ( e i,1 e i,1 e i,1 ). V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 18 / 33

Příklad (Obecná verze map pomocí foldr, pomocná procedura) Cíl: Vytvořit obecnou verzi map pomocí foldr. Přináší s sebou: explicitní aplikaci foldr související problém: separace posledního prvku seznamu. Pomocná procedura separate-last-argument: (define separate-last-argument (lambda (l) (foldr (lambda (x y) (if (not y) (cons '() x) (cons (cons x (car y)) (cdr y)))) #f l))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 19 / 33

Příklad (Obecná verze map pomocí foldr) Výsledné řešení: (define map (lambda (f. lists) (apply foldr (lambda args (let ((separation (separate-last-argument args))) (cons (apply f (car separation)) (cdr separation)))) '() lists))) T (k, n) = kn + n(3 + t f + k) = n(3 + 2k + t f ) řádově nejlepší řešení, prakticky ale ukážeme efektivnější (další přednášky) neefektivita spočívá v nasazení separate-last-argument V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 20 / 33

Intermezzo: Monoidální operace Definice (monoidální zobrazení) Zobrazení f : A A A nazveme monoidální, pokud jsou splněny tyto podmínky: 1 existuje e A takový, že pro každý a A platí f(a, e) = f(e, a) = a, 2 pro každé a, b, c A platí, že f(a, f(b, c)) = f(f(a, b), c). Terminologie: zobrazení f : A A A je binární operace na množině A výsledek operace : A A A pro hodnoty a, b A značíme a b místo (a, b) Důsledek monoidální operace (odvozený pojem) Binární operace na A je monoidální operace, pokud 1 je asociativní (a (b c) = (a b) c pro každé a, b, c A), 2 má neutrální prvek (existuje e A tak, že a e = e a = a pro každý a A). V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 21 / 33

Příklad (Příklady monoidálních operací) Příklady z matematiky: + (sčítání čísel) na R je monoidální (neutrální prvek je 0) (násobení čísel) na R je monoidální (neutrální prvek je 1) (průnik množin) na 2 X je monoidální (neutrální prvek je X) (sjednocení množin) na 2 X je monoidální (neutrální prvek je )... mnoho dalších (např. sčítání polynomů / matic, apod.) Příklady z informatiky: všechny předchozí,... (omezené na čísla / množiny reprezentovatelné v počítači) append na množině všech seznamů je monoidální (neutrální prvek je prázdný seznam)... mnoho dalších (viz kurs Formální jazyky a automaty) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 22 / 33

Monoidální operace a foldr Proč jsou monoidální operace důležité? důsledek asociativity: závorkování nemá význam důsledek neutralita: operace mají přirozený význam i bez argumentů Rozšíření monoidální operace na libovolně mnoho argumentů: a 1 a 2 a n a 1 a 2 a n = a 1 a 2 a n e a 1 a 2 a n = (a 1 (a 2 (a n e) )) Poslední uvedený koresponduje se (foldr e seznam ), kde seznam obsahuje prvky a 1,..., a n. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 23 / 33

Příklad (Příklady rozšíření operací na libovolné argumenty) Rozšíření sčítání dvou argumentů: (define add2 (lambda (x y) (+ x y))) (define add (lambda args (foldr add2 0 args))) Rozšíření sjednocení množin: (define union2 (set-operation (lambda (x A B) předchozí přednáška (or (in? x A) (in? x B))))) (define union (lambda sets (foldr union2 '() sets))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 24 / 33

Příklad (Problém s neexistencí neutrálního prvku I) Pokud je operace asociativní, ale nemá neutrální prvek: 1 zobecníme operaci pro 1 argumentů (např. primitivní procedura min), 2 dodáme nový neutrální prvek uměle. První typ řešení: (define min2 (lambda (x y) (if (<= x y) x y))) (define min (lambda numbers (foldr min2 (car numbers) (cdr numbers)))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 25 / 33

Příklad (Problém s neexistencí neutrálního prvku II) Druhý typ řešení: (define +infty '+infty) přidaný neutrální prvek (define <= (let ((<= <=)) (lambda (x y) (or (equal? y +infty) (and (not (equal? x +infty)) (<= x y)))))) (define min (lambda numbers (foldr min2 +infty numbers))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 26 / 33

Procedury genuine-foldl a foldl Zabalení zleva doprava pomocí foldr: (foldr proc term seznam ) = ( proc e 1 ( proc e 2 ( proc ( proc e n term ) ))) Dvě možnosti zabalení zprava doleva : Procedura foldl: (foldl proc term seznam ) = ( proc e n ( proc e n 1 ( proc ( proc e 1 term ) ))) Procedura genuine-foldl: (genuine-foldl proc term seznam ) = ( proc ( proc ( proc ( proc term e 1 ) e 2 ) ) e n ) Pro monoidální operace platí: foldr = genuine-foldl (!!) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 27 / 33

Příklad (Rozdíly mezi foldr, foldl a genuine-foldl) Rozdíly v akumulaci: (define proc (lambda (x y) (list #f x y))) (define s '(a b c d)) (foldr proc 'x s) = (#f a (#f b (#f c (#f d x)))) (foldl proc 'x s) = (#f d (#f c (#f b (#f a x)))) (genuine-foldl proc 'x s) = (#f (#f (#f (#f x a) b) c) d) Použití pro obrácení seznamu: (define reverse (lambda (l) (foldl cons '() l))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 28 / 33

Příklad (Implementace foldl pomocí foldr) (foldl proc term seznam ) = ( proc e n ( proc e n 1 ( proc ( proc e 1 term ) ))) (define foldl (lambda (f term l) (foldr f term (reverse l)))) Příklad (Implementace genuine-foldl pomocí foldr) (genuine-foldl proc term seznam ) = ( proc ( proc ( proc ( proc term e 1 ) e 2 ) ) e n ) (define genuine-foldl (lambda (f term l) (foldr (lambda (x y) (f y x)) term (reverse l)))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 29 / 33

Příklad (Složení funkcí: procedura compose) Připomeňme: Složení zobrazení f : X X a g : X X (v tomto pořadí) je zobrazení (f g): X X definované Vlastnosti operace skládání: (f g)(x) = g ( f(x) ) pro každé x X. f (g h) = (f g) h, asociativita, ι f = f ι = f, neutralita vzhledem k ι(x) = x. (define compose (lambda functions (foldl (lambda (f g) (lambda (x) (f (g x)))) (lambda (x) x) functions))) Jak vypadají prostředí? V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 30 / 33

Poznámka: rozšíření na libovolně mnoho seznamů (foldr proc term seznam 1 seznam 2 seznam k ) (genuine-foldr proc term seznam 1 seznam 2 seznam k ) Implementace: (define genuine-foldl (lambda (f term. lists) (apply foldr (lambda args (apply f (reverse args))) term (map reverse lists)))) (define foldl (lambda (f term. lists) (apply foldr f term (map reverse lists)))) V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 31 / 33

Příklad (Výpočet faktoriálu pomocí foldr) Faktoriál: n! = 1 2 n } {{ } n činitelů pro n 0 Poznámka: mezní případ je 0! = 1. Lze počítat pomocí foldr: (define fac (lambda (n) (foldr * 1 (build-list n (lambda (x) (+ x 1)))))) lze rovněž pomocí apply, neefektivní, protože konstruujeme seznam činitelů, řešení není programátorsky elegantní. V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 32 / 33

Příklad (Výpočet prvků Fibonacciho posloupnosti pomocí foldr) Fibonacciho posloupnost: n: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... F (n): 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610... Lze počítat pomocí foldr: (define fib (lambda (n) (cadr (foldr (lambda (x last) (list (apply + last) (car last))) '(1 0) (build-list n (lambda (x) #f)))))) Příští přednáška: uvidíme efektivní a elegantní řešení V. Vychodil (KI, UP Olomouc) Akumulace Přednáška 7 33 / 33