Paradigmata programování II Korutiny a nedeterminismus

Podobné dokumenty
PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, 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 INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

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

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

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

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

Paradigmata programování 1

Paradigmata programování 1

Přednáška 3. Rekurze 1

1. Od Scheme k Lispu

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

Paradigmata programování 1

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

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

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

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

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

Paradigmata programování 2

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

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

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

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

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

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

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

KTE / ZPE Informační technologie

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.

Optimalizace & soft omezení: algoritmy

awk programovatelný filtr

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

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

Algoritmy a datové struktury

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

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

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

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.

Operační systémy Linux, Mac OS X a jejich srovná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]

Generování vnitřní reprezentace programu

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

Abstraktní datové typy

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

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

14. Složitější konstrukce

1. Programování proti rozhraní

Program a životní cyklus programu

Struktura programu v době běhu

Rekurzivní algoritmy

LISP Definice funkcí

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

5 Rekurze a zásobník. Rekurzivní volání metody

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

Programovani v Maplu Procedura

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

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

Binární vyhledávací stromy II

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

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

Základní datové struktury

Programování v C++ 1, 1. cvičení

Objektově orientované programování

Programování v Pythonu

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

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

Dynamické datové struktury I.

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Úvod do programovacích jazyků (Java)

Implementace LL(1) překladů

Programovací jazyk Pascal

NPRG030 Programování I, 2017/18 1 / :22:16

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

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

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

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

Jazyk C# (seminář 6)

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

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

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

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

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Standardní algoritmy vyhledávací.

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Abstraktní třídy, polymorfní struktury

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

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

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

Analýza Realizace případů užití

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Regulární výrazy. Vzory

Grafové algoritmy. Programovací techniky

Paradigmata programování 1

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

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Transkript:

Paradigmata programování II Korutiny a nedeterminismus Vilém Vychodil Katedra informatiky, Univerzita Palackého v Olomouci 27. dubna 2006 Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 1 / 47

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 vybaveny `break' (define-macro while (lambda (condition. body) (let ((loop-name (gensym))) `(call/cc (lambda (break) (let,loop-name () (if,condition (begin,@body (,loop-name))))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 3 / 47

(let ((i 0) (j 0)) (while (< i 10) (set! j (+ j i)) (set! i (+ i 1)) (if (> i 5) (break))) (list i j)) (let ((n 0) (i 10)) (while (>= i 0) (set! i (- i 1)) (let ((j i)) (while (>= j 0) (set! n (+ n j)) (break)))) n) = 45 Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 5 / 47

;; while vybaveny `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))))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 7 / 47

; priklad pouziti: (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)) = (6 12) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 9 / 47

;; while vybaveny `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))))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 11 / 47

;; priklad pouziti: (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)) = (20 190) ;; pro continue misto `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)) = (10 45) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 13 / 47

(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)))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 15 / 47

;; makro realizujici cyklus typu `REPEAT-UNTIL' ;; jiz mame udelane, pro zopakovani (define-macro repeat (lambda args (letrec ((but-last ; viz prednasku 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))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 17 / 47

;; makro obohacene o `break', `continue' a `redo' (define-macro repeat (lambda args (letrec ; vazby jako na predchozim 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))))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 19 / 47

Iterátory (opáčko) iterátor pro danou datovou strukturu postupně vrací její prvky ;; Pomocne definice: ;; identifikator ukonceni iterace (define *end-of-iteration* (lambda () #f)) ;; implementace chyboveho hlaseni ;; predikat indikujici konec iterace (define finished? (lambda (elem) (eq? elem *end-of-iteration*))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 21 / 47

(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))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 23 / 47

; priklad pouziti: (define p (generate-iterator '(a b c d e))) (p) = a (p) = b (p) = c (p) = d (p) = e (p) = #<procedura> (indikator konce) (eq? (p) *end-of-iteration*) = #t Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 25 / 47

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 '())))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 27 / 47

. (lambda () (call/cc (lambda (f) (set! return f) (start))))))) ;; POZNAMKA: uz neni potreba *end-of-iteration* ;; prohledavani je ukonceno () Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 29 / 47

;; priklad pouziti (define p (generate-depth-iterator '(a (b (c (d)) e)))) (define q (generate-depth-iterator '(((a b) ((c d))) e))) (p) = a (q) = a (p) = b (q) = b (p) = c (q) = c (p) = d (q) = d (p) = e (q) = e (p) = () (q) = () Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 31 / 47

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, 293 298, 1984. ;; makro na vytvareni 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))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 33 / 47

;; priklad: bez pouziti resume se chova ;; jako,,normalni procedura'' (define c (coroutine (x) (+ x 1))) (c 10) = 11 ; priklad: dve korutiny, jedna prepne na druhou (define d (coroutine () (display "VOLANA D") (newline) (resume c 10))) (d) = 11 (+ vypise `VOLANA d') (d) =...,,nic'' (d 10) = 10 (d 'blah) = blah Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 35 / 47

Iterátor pomocí korutin ;; identifikator ukonceni iterace + predikat (JIZ MAME) (define *end-of-iteration* (lambda () #f)) (define finished? (lambda (elem) (eq? elem *end-of-iteration*))) ;; iterator: korutina volajici dalsi 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)))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 37 / 47

;; k tomu abychom mohli pouzivat iterator potrebujeme ;; vytvorit dalsi korutinu (zde se jmenuje,,user'', ;; v kodu iteratoru 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)) ;; mohli bychom zjednodusit makrem,,with-iterator'' Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 39 / 47

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.Braffort, D. Hirschberg (Eds.): Computer Programming and Formal Systems. North-Holland, 1967. (amb) = ERROR: Tree Exhausted (amb 1 2 3 4) = 1 (if (amb #f #t) 'blah (amb)) = blah (let ((x (amb 1 2 3 4))) (if (odd? x) (amb) x)) = 2 Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 41 / 47

Nedeterminismus ; AMB-FAIL (pomocna procedura, vyznam bude jasny dale) ; bez parametru: slouzi k vyvolani navratu (backtracking) ; s jednim parametrem: nastavi hodnotu aktualniho navratu ; na dany parametr (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) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 43 / 47

;; amb (ambiguous) operator (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))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 45 / 47

;; odvozeny konstrukt: assert (define assert (lambda (elem) (if (not elem) (amb)))) ; priklad pouziti assert (spolu s amb) (let ((x (amb 1 2 3 4 5))) (assert (odd? x)) x) ;; priklady pouziti `amb' a `assert' viz colors.scm Vilém Vychodil (UP Olomouc) PP II, Př. 9: Korutiny, nedeterminismus 27. dubna 2006 47 / 47