PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

Podobné dokumenty
Paradigmata programování II Korutiny a nedeterminismus

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ

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

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

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

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

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

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Paradigmata programování 1

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

Paradigmata programování 1

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Paradigmata programování 1

Přednáška 3. Rekurze 1

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

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

1. Od Scheme k Lispu

Základní stavební prvky algoritmu

Paradigmata programování 2

awk programovatelný filtr

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

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

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Operační systémy. Cvičení 4: Programování v C pod Unixem

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Algoritmizace a programování

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Úvod do programování - Java. Cvičení č.4

LISP Definice funkcí

Algoritmizace a programování

Programování v Pythonu

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

1. Programování proti rozhraní

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

Základní datové struktury

PSK3-9. Základy skriptování. Hlavička

Soft Computing (SFC) 2014/2015 Demonstrace u ení sít RCE, Java aplikace

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Optimalizace & soft omezení: algoritmy

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Databázovéa informačnísystémy NÁVRH IMPLEMENTACE 2 KONZISTENCE DATABÁZE

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

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.

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi

Operační systémy Linux, Mac OS X a jejich srovnání

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

KTE / ZPE Informační technologie

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Abstraktní datové typy

Generování vnitřní reprezentace programu

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

6. Příkazy a řídící struktury v Javě

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Struktura programu v době běhu

Spojová implementace lineárních datových struktur

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Program a životní cyklus programu

14. Složitější konstrukce

Rekurzivní algoritmy

Dynamické datové struktury I.

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Paradigmata programování 1

Heuristické řešení problémů. Seminář APS Tomáš Müller

Sazba zdrojových kód. Jakub Kadl ík

Stru né pokyny. D kujeme vám, že jste si k uspokojení svých pot eb v oblasti p enosných po íta vybrali notebook Acer.

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Konceptuální modelování

Programovací jazyk Pascal

Datové struktury. alg12 1

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

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Programovací software Oblast režimů Oblast nástrojů Složka aplikací pro různé funkce: Oblast tlačítek Tlačítko Loading (Načítání)

Funkcionální programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Programovani v Maplu Procedura

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

O makrech, která umí aritmetiku s velkými čísly. Macros Which Handle Arithmetics with Big Numbers. Jan Šustek KMa PřF OU. Brejlov

Tematická oblast: Programování 2 (VY_32_INOVACE_08_2_PR) Anotace: Využití ve výuce: Použité zdroje:

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Derivování sloºené funkce

Grafové algoritmy. Programovací techniky

Algoritmy a datové struktury

Regulární výrazy. Vzory

PB161 Programování v jazyce C++ Přednáška 3

Transkript:

KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 1 / 31

Cykly vybavené break, continue a redo break... p eru²ení cyklu a návrat s danou hodnotou continue... provedení dal²í iterace (p esko ení zbytku t la) redo... skok na za átek t la cyklu (bez testu podmínky) ;; while vybavený break (define-macro while (lambda (condition. body) (let ((loop-name (gensym))) `(call/cc (lambda (break) (let,loop-name () (if,condition (begin,@body (,loop-name))))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 2 / 31

(let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1)) (if (> i 5) (break))) (list i j)) Z=) (6 15) (let ((n 0) (i 10)) (while (>= i 0) (set! i (- i 1)) (let ((j i)) (while (>= j 0) (set! n (+ n j)) (break)))) n) Z=) 45 (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 3 / 31

;; while vybavený break a continue (define-macro while (lambda (condition. body) (let ((loop-name (gensym))) `(call/cc (lambda (break) (let,loop-name () (if,condition (begin (call/cc (lambda (continue),@body)) (,loop-name))))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 4 / 31

P íklad pouºití: (let ((i 0) (j 0)) (while (< i 10) (if (<= i 2) (begin (set! i (+ i 1)) (continue))) (set! j (+ j i)) (set! i (+ i 1)) (if (> i 5) (break))) (list i j)) Z=) (6 12) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 5 / 31

;; while vybavený break, continue a redo (PERL) (define-macro while (lambda (condition. body) (let ((loop-name (gensym))) `(call/cc (lambda (break) (let,loop-name () (if,condition (begin (call/cc (lambda (continue) (let ((redo #f)) (call/cc (lambda (f) (set! redo f))),@body))) (,loop-name))))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 6 / 31

P íklad pouºití: (let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1)) (if (and (>= i 10) (< i 20)) (redo))) (list i j)) Z=) (20 190) Pro continue místo redo bychom dostali: (let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1)) (if (and (>= i 10) (< i 20)) (continue))) (list i j)) Z=) (10 45) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 7 / 31

(define-macro do (lambda (binding condition. body) (let ((loop-name (gensym))) `(call/cc (lambda (break) (letrec ((,loop-name (lambda,(map car binding) (if,(car condition) (begin,@(cdr condition)) (begin (call/cc (lambda (continue) (let ((redo #f)) (call/cc (lambda (f) (set! redo f))),@body))) (,loop-name,@(map caddr binding))))))) (,loop-name,@(map cadr binding)))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 8 / 31

Makro realizující cyklus typu repeat until (jiº jsme implementovali v p edchozích lekcích) (define-macro repeat (lambda args (letrec ((but-last ; viz p edná²ku 4 (split-args (but-last args)) (body (car split-args)) (limits (cdr split-args)) (loop-name (gensym))) `(let,loop-name (),@body (cond,@(map (lambda (conds) `(,(car conds) (begin,@(cdr conds)))) (cdr limits)) (else (,loop-name))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 9 / 31

Makro obohacené o break, continue a redo (define-macro repeat (lambda args (letrec ; vazby jako na p edchozím slajdu `(call/cc (lambda (break) (let,loop-name () (call/cc (lambda (continue) (let ((redo #f)) (call/cc (lambda (f) (set! redo f))),@body))) (cond,@(map (lambda (conds) `(,(car conds) (begin,@(cdr conds)))) (cdr limits)) (else (,loop-name))))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 10 / 31

Iterátory (opakování) iterátor pro danou datovou strukturu postupn vrací její prvky Pomocné denice: ;; identikátor ukon ení iterace (define *end-of-iteration* (lambda () #f)) ;; implementace chybového hlá²ení ;; predikát indikující konec iterace (define finished? (lambda (elem) (eq? elem *end-of-iteration*))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 11 / 31

(define generate-iterator (lambda (l) (letrec ((return #f) (start (lambda () (let loop ((l l)) (if (null? l) (return *end-of-iteration*) (begin (call/cc (lambda (new-start) (set! start new-start) (return (car l)))) (loop (cdr l)))))))) (lambda () (call/cc (lambda (f) (set! return f) (start))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 12 / 31

P íklad pouºití: (define p (generate-iterator '(a b c d e))) (p) Z=) a (p) Z=) b (p) Z=) c (p) Z=) d (p) Z=) e (p) Z=) #<procedura> (indikátor konce) (eq? (p) *end-of-iteration*) Z=) #t (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 13 / 31

P íklad: Hloubkový iterátor (define generate-depth-iterator (lambda (l) (letrec ((return #f) (start (lambda () (let loop ((l l)) (cond ((null? l) 'nejaka-hodnota) ((pair? l) (begin (loop (car l)) (loop (cdr l)))) (else (call/cc (lambda (new-start) (set! start new-start) (return l)))))) (return '())))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 14 / 31

. (lambda () (call/cc (lambda (f) (set! return f) (start))))))) Poznámka: uº není pot eba *end-of-iteration* prohledávání je ukon eno () (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 15 / 31

P íklad pouºití: (define p (generate-depth-iterator '(a (b (c (d)) e)))) (define q (generate-depth-iterator '(((a b) ((c d))) e))) (p) Z=) a (q) Z=) a (p) Z=) b (q) Z=) b (p) Z=) c (q) Z=) c (p) Z=) d (q) Z=) d (p) Z=) e (q) Z=) e (p) Z=) () (q) Z=) () (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 16 / 31

Korutiny korutiny... reprezentují podprogramy, které se vzájemn p epínají C. T. Haynes, D. P. Friedman, M. Wand. Continuations and Coroutines. In: Conf. ACM Symp. LISP and Functional Programming, 293298, 1984. ;; makro na vytvá ení korutin (define-macro coroutine (lambda (arg. body) `(letrec ((state (lambda,arg,@body)) (resume (lambda (c. elems) (call/cc (lambda (f) (set! state f) (apply c elems)))))) (lambda elems (apply state elems))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 17 / 31

P íklad: bez pouºití resume se chová jako normální procedura (define c (coroutine (x) (+ x 1))) (c 10) Z=) 11 P íklad: dv korutiny, jedna p epne na druhou (define d (coroutine () (display "VOLANA D") (newline) (resume c 10))) (d) Z=) 11 a vypí²e VOLANA d) (d) Z=) nic (d 10) Z=) 10 (d 'blah) Z=) blah (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 18 / 31

Iterátor pomocí korutin ;; identikátor ukon ení iterace a predikát (jiº máme implementované) (define *end-of-iteration* (lambda () #f)) (define finished? (lambda (elem) (eq? elem *end-of-iteration*))) ;; iterátor: korutina volající dal²í korutinu (caller) (define generate-iterator (lambda (l) (coroutine (caller) (let loop ((l l)) (if (null? l) (resume caller *end-of-iteration*) (begin (resume caller (car l)) (loop (cdr l)))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 19 / 31

K tomu abychom mohli pouºívat iterátor pot ebujeme vytvo it dal²í korutinu (zde se jmenuje user, v kódu iterátoru to je caller). (letrec ((iterator (generate-iterator '(a b c d e))) (user (coroutine () (let iter () (let ((v (resume iterator user))) (if (not (finished? v)) (begin (display v) (newline) (iter)))))))) (user)) P edchozí bychom mohli zjednodu²it makrem with-iterator. (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 20 / 31

Nedeterminismus nedeterministický operátor amb, vrací jeden z vyhodnoc. argument, p itom mu jde o to najít aspo jedno e²ení (operátor nedeterministicky konverguje k e²ení, pokud existuje) J. McCarthy. A Basis for a Mathematical Theory of Computation. In: P. Braort, D. Hirschberg (Eds.): Computer Programming and Formal Systems. North-Holland, 1967. (amb) Z=) Error: Tree Exhausted (amb 1 2 3 4) Z=) 1 (if (amb #f #t) 'blah (amb)) Z=) blah (let ((x (amb 1 2 3 4))) (if (odd? x) (amb) x)) Z=) 2 (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 21 / 31

Nedeterminismus amb-fail, pomocná procedura, její ú el bude jasný dále bez argumentu: slouºí k vyvoláni návratu (backtracking) 1 argument: nastaví hodnotu aktuálního návratu na danou hodnotu (define amb-fail (let ((failure #f)) (lambda args (if (null? args) failure (set! failure (if (procedure? (car args)) (car args) (lambda () (error "AMB: Tree Exhausted")))))))) ;; inicializace amb-fail (amb-fail #f) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 22 / 31

O co tady jde? (amb-fail #f) (amb-fail) Z=) h(); (error...); Pi (amb-fail odd?) (amb-fail) Z=) primitivní procedura odd? (amb-fail (lambda (x) (amb-fail odd?) x)) ((amb-fail) 10) Z=) 10 ((amb-fail) 10) Z=) #f ((amb-fail) 11) Z=) #t (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 23 / 31

(amb-fail #f) (let ((prev-fail (amb-fail))) (call/cc (lambda (exit) (call/cc (lambda (next) (amb-fail (lambda () (amb-fail prev-fail) (next))) (exit 1))) (prev-fail)))) Z=) 1 ((amb-fail)) Z=) CHYBA: AMB: Tree Exhausted (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 24 / 31

(amb-fail #f) (let ((prev-fail (amb-fail))) (call/cc (lambda (exit) (call/cc (lambda (next) (amb-fail (lambda () (amb-fail prev-fail) (next))) (exit 1))) (call/cc (lambda (next) (amb-fail (lambda () (amb-fail prev-fail) (next))) (exit 2))) (prev-fail))))) Z=) 1 ((amb-fail)) Z=) 2 ((amb-fail)) Z=) CHYBA: AMB: Tree Exhausted (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 25 / 31

next! (excaper (lambda (2) (let ((prev-fail (amb-fail))) (call/cc (lambda (exit) 2 (call/cc (lambda (next) (amb-fail (lambda () (amb-fail prev-fail) (next))) (exit 2))) (prev-fail)))))) exit! (excaper (lambda (2) (let ((prev-fail (amb-fail))) 2))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 26 / 31

failure (v P)! h(); (amb-fail prev-fail) (next); P x i Tedy procedura p i aplikaci uloºí p edchozí fail ve vazb na failure v P, aktivuje next pokra ování dal²ím prvkem. (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 27 / 31

;; amb (ambiguous) operátor (define-macro amb (lambda elems (let ((previous-fail (gensym))) `(let ((,previous-fail (amb-fail))) (call/cc (lambda (exit),@(map (lambda (elem) `(call/cc (lambda (next) (amb-fail (lambda () (amb-fail,previous-fail) (next))) (exit,elem)))) elems) (,previous-fail))))))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 28 / 31

(let ((elem (amb 1 2 3))) elem) Z=) 1 (let ((elem (amb 1 2 3 15 4))) (if (< elem 10) 'xxx) elem) Z=) 1 (let ((elem (amb 1 2 3 15 4))) (if (< elem 10) (amb)) elem) Z=) 15 PROBOHA PROƒ? (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 29 / 31

next! (excaper (lambda (2) (let ((elem (let ((prev-fail (amb-fail))) (call/cc (lambda (exit) 2 (call/cc (lambda (next) (amb-fail (lambda () (amb-fail prev-fail) (next))) (exit 2))) (prev-fail)))))) (if (< elem 10) (amb)) elem))) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 30 / 31

;; odvozený konstrukt: assert (define assert (lambda (elem) (if (not elem) (amb)))) P íklad pouºití assert (spolu s amb) (let ((x (amb 1 2 3 4 5))) (assert (odd? x)) x) (KI, UP Olomouc) PP 2, Lekce 9 Korutiny, nedeterminismus 31 / 31