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

Rozměr: px
Začít zobrazení ze stránky:

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

Transkript

1 Paradigmata programování II Přednáška 6: Líné vyhodnocování, proudy a kešované vyhodnocování Vilém Vychodil Katedra informatiky, Univerzita Palackého v Olomouci 22. března 2007 Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

2 Přísliby a líné vyhodnocování Základní myšlenka místo vyhodnocení daného výrazu pracujeme s příslibem jeho budoucího vyhodnocení příslib = nový typ elementu (element prvního řádu) Co je potřeba k tomu, aby to fungovalo: 1 k dispozici je spec. forma (nejčastěji zvaná delay), která pro daný výraz vrací příslib jeho vyhodnocení 2 k dispozici je procedura (nejčastěji zvaná force), která pro daný příslib aktivuje výpočet a vrátí hodnotu vzniklou vyhodnocením přislíbeného výrazu Líné vyhodnocování: vyhodnocování založené na příslibech někdy se nazývá «call by need» Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

3 ;; priklad zamysleneho pouziti (delay (+ 1 2)) = #<promise> (define p (delay (map - '( )))) p = #<promise> (promise? p) = #t (force p) = ( ) Poznámky: delay nemůže být z principu procedura, protože chceme, aby se přislíbený výraz vyhodnotil až při aktivaci pomocí force při líném vyhodnocování dochází k propagaci chyb (chyba se projeví na jiném místě než kde vznikla ) (define p (delay blah)) probehne bez problemu p = #<promise>. (force p) = CHYBA (`blah' not bound) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

4 pomocí příslibů je možné odložit časově složitý výpočet na později a aktivovat jej, až je skutečně potřeba jej provést ;; modelovy casove narocny vypocet: (define fib (lambda (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))) ;; priklad pouziti (define p (delay (fib 30))). (force p) probehne okamzite aktivace vypoctu (prodleva) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

5 Při použití příslibů vyvstávají otázky spojené s vedlejším efektem. ;; prislib vyrazu, ktery ma vedlejsi efekt (define p (let ((i 0)) (delay (begin (set! i (+ i 1)) i)))) ;; dvoji aktivace vypoctu (force p) = 1 (force p) =??? Možnosti: 1 druhá aktivace (force p) vrací 1 2 druhá aktivace (force p) vrací 2, třetí vrací 3,... Ukážeme, jak implementovat líné vyhodnocování umožňující obě varianty. Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

6 Implementace příslibů a líného vyhodnocování přísliby lze plně implementovat pomocí procedur vyšších řádů, maker a vedlejších efektů Základní myšlenka: při vytváření procedur (vyhodnocováním λ-výrazů) nedochází k vyhodnocování těla nově vznikajících procedur k vyhodnocování těla procedur dochází až při jejich aplikaci nabízí se tedy: vytvořit přísliby pomocí procedur ;; vysvetlujici priklad (lambda () (+ 1 2)) (define p (lambda () (+ 1 2))) (p) #<procedure> nas prislib aktivace Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

7 Implementace příslibů a líného vyhodnocování jednodušší verze při každé aktivaci příslibu je přislíbený výraz vždy vyhodnocen vytvoříme makro freeze ( zmraz ) a proceduru thaw ( roztaj ) ;; specialni forma ``freeze'' (define-macro freeze (lambda exprs `(lambda () (begin,@exprs)))) ;; procedura ``thaw'' (define thaw (lambda (promise) (promise))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

8 ;; priklad vytvoreni prislibu (define p (let ((x 10)) (freeze (display "Hodnota: ") (display x) (newline) (set! x (+ x 1)) (list x (* x x))))) ;; prikladu aktivace prislibu (thaw p) = (11 121) (thaw p) = (12 144) (thaw p) = (13 169) ;; prisliby lze samozrejme pouzivat jako soucast ;; slozitejsich vyrazu: (reverse (thaw p)) = (225 14) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

9 Implementace příslibů a líného vyhodnocování složitější verze při první aktivaci příslibu je výsledek vyhodnocení přislíbeného výraz zapamatován (uvnitř příslibu) a při každé další aktivaci příslibu je vrácena zapamatovaná hodnota případné vedlejší efekty se projeví jen při první aktivaci vytvoříme makro delay a proceduru force ;; nejdriv priklad pouziti: (define p (let ((x 10)) (delay (set! x (+ x 1)) (list x (* x x))))) (force p) = (11 121) (force p) = (11 121) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

10 Implementace příslibů a líného vyhodnocování ;; specialni forma ``delay'' (define-macro delay (lambda exprs `(let ((result (lambda () (begin,@exprs))) (evaluated? #f)) (lambda () (begin (if (not evaluated?) (begin (set! evaluated? #t) (set! result (result)))) result))))) ;; procedura ``force'' (totez co ``thaw'') (define force thaw) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

11 Proudy (angl. Streams) proudy jsou nejčastěji používanou aplikací líného vyhodnocování neformálně: proudy jsou líně vyhodnocované seznamy konstruktor cons-stream a selektory stream-car a stream-cdr ;; konstruktor proudu (je makro!) (define-macro cons-stream (lambda (a b) `(cons,a (delay,b)))) ;; selektor stream-car (vrat prvni prvek proudu) (define stream-car car) ;; selektor stream-cdr (vrat proud bez prvniho prvku) (define stream-cdr (lambda (stream) (force (cdr stream)))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

12 Definice proudů prázdný seznam je proud; každý tečkový pár (e. p), kde e je libovolný element a p je příslib proudu, je proud. ;; je stream prazdny? (define stream-null? null?) ;; predikat stream? (podle definice) (define stream? (lambda (elem) (or (null? elem) (and (pair? elem) (and (promise? (cdr elem)) (stream? (force (cdr elem)))))))) předchozí predikát stream? má nevýhodu: používá force (!) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

13 ;; slabsi verze predikatu stream? ;; pazdy par, jehoz 2. prvek je prislib nebo () je stream (define stream? (lambda (elem) (or (null? elem) (and (pair? elem) (or (promise? (cdr elem)) (null? (cdr elem))))))) Pomocné procedury: ;; zobraz stream, nanejvys vsak n prvnich prvku (define display-stream (lambda (stream. n) ;; odvozene selektory (define stream-caar (lambda (x). (define stream-cddddr (lambda (x) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

14 Procedury pro práci s proudy ;; delka streamu (define stream-length (lambda (stream) (if (stream-null? stream) 0 (+ 1 (stream-length (stream-cdr stream)))))) ;; mapovani pres streamy (mapovani pres jeden stream) (define stream-map2 (lambda (f stream) (if (stream-null? stream) '() (cons-stream (f (stream-car stream)) (stream-map f (stream-cdr stream)))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

15 Procedury pro práci s proudy ;; mapovani pres streamy (obecna verze) (define stream-map (lambda (f. streams) (if (stream-null? (car streams)) '() (cons-stream (apply f (map stream-car streams)) (apply stream-map f (map stream-cdr streams)))))) ;; konvertuj seznam na stream (define list->stream (lambda (list) (foldr (lambda (x y) (cons-stream x y)) '() list))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

16 Procedury pro práci s proudy ;; vytvor konecny stream danych prvku (define stream (lambda args (list->stream args))) Příklady použití předchozích procedur: (define s (stream )) s = (1. #<promise>) (display-stream s) = #<stream ( )> (display-stream s 2) = #<stream (1 2)> (stream-length s) = 4 (display-stream (stream-map - s) 2) = #<stream (-1-2)> (display-stream (stream-map + s s s)) = #<stream ( )> Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

17 Všimněte si při práci s proudy mají jednotlivé procedury jinou odezvu výpočet je řízen daty, dochází k propagaci chyb ;; vysledek je vracen okamzite (define fs (stream-map fib (stream ))) fs = (1. #<promise>) ;; pristup ke dalsim prvkum se bude postupne zpomalovat ;; ukazka propagace chyb v proudech (define s (stream 'blah 6 7)) (define r (stream-map - s)) r = (-1. #<promise>) (display-stream r 4) = ( ) (display-stream r 6) = ( CHYBA Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

18 Úskalí ;; zdanlive funkcni verze `foldr' pro streamy (define stream-foldr (lambda (f nil. streams) (if (stream-null? (car streams)) nil (apply f `(,@(map stream-car streams),(apply stream-foldr f nil (map stream-cdr streams))))))) ;; nasledujici se nechova prirozene (stream-foldr (lambda (x y) (cons-stream (- x) y)) '() (stream 'blah 4)) = CHYBA: nelze aplikovat `-' na symbol `blah' Čekali bychom, že chyba se projeví až při pokusu přistoupit ke 4. prvku výsledného proudu Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

19 Nová verze stream-foldr proceduře f bude předáván místo druhého argumentu jeho příslib procedura sama rozhodne, jak bude s příslibem nakládat ;; procedura stream-folder (define stream-foldr (lambda (f nil. streams) (if (stream-null? (car streams)) nil (apply f `(,@(map stream-car streams),(delay (apply stream-foldr f nil (map stream-cdr streams)))))))) (stream-foldr (lambda (x y) (cons-stream (- x) (force y))) '() (stream 'blah 4)) = (-1. #<promise>) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

20 Další (užitečné) odvozené procedury ;; konverze streamu na seznam (define stream->list (lambda (stream) (stream-foldr (lambda (x y) (cons x (force y))) '() stream))) ;; filtrace prvku streamu podle vlastnosti (define stream-filter (lambda (prop? stream) (stream-foldr (lambda (x y) (if (prop? x) (cons-stream x (force y)) (force y))) '() stream))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

21 Nekonečné proudy a jejich implicitní definice Příklad (proud jedniček) ;; rekurzivni procedura,,bez limitni podminky'' (define ones-proc (lambda () (cons-stream 1 (ones-proc)))) ;; nekonecny proud vytvoreny volanim ones-proc (define ones (ones-proc)) ;; predchozi s pouzitim pojmenovaneho ``let'' (define ones (let proc () (cons-stream 1 (proc)))) ;; implicitni definice proudu (define ones (cons-stream 1 ones)) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

22 Nekonečné proudy a jejich implicitní definice Příklad (proud přirozených čísel) ;; rekurzivni procedura,,bez limitni podminky'' (define naturals-proc (lambda (i) (cons-stream i (naturals-proc (+ i 1))))) ;; nekonecny proud vytvoreny volanim ones-proc (define naturals (naturals-proc 1)) ;; predchozi s pouzitim pojmenovaneho ``let'' (define naturals (let iter ((i 1)) (cons-stream i (iter (+ i 1))))) ;; implicitni definice proudu (define naturals (cons-stream 1 (stream-map + ones naturals))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

23 Nekonečné proudy Nekonečný proud neformálně: potenciálně nekonečná lineární datová struktura potenciálně nekonečná znamená: opakovaným použitím stream-cdr se nedostaneme na jejich konec v každém okamžiku průchodu nekonečným proudem máme vždy k dispozici aktuální prvek a příslib pokračování proudu lze se na něj dívat jako na nekonečnou posloupnost elementů (e i ) i=0, to jest e 0, e 1, e 2,..., e n 1, e n, e n+1,... v praxi se konstruuje rekurzivní procedurou bez limitní podmínky ;; proud hodnot (2 i ) i=0 (define pow2 (let next ((last 1)) (cons-stream last (next (* 2 last))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

24 Nekonečné proudy Formálně lze zavést jako limity prefixových generátorů Seznam r je prefix seznamu t, pokud lze t vyjádřit jako spojení r s nějakým seznamem l (v tomto pořadí). Množinu seznamů S nazveme prefixový generátor, pokud 1 pro každé n N, systém S obsahuje seznam délky n; 2 pro každé dva s, t S platí: buď s je prefix t, nebo t je prefix s. Nekonečný proud (příslušný prefixovému generátoru S) je element reprezentující posloupnost (e i ) i=0, kde e i je element nacházející se na i-té pozici libovolného seznamu s S majícího alespoň i + 1 prvků. Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

25 Implicitní definice nekonečného proudu definice proudu, která v sobě používá proud, který sama definuje následující prvky proudu jsou přímo zavedeny pomocí předchozích prvků proudu bez vytváření pomocné rekurzivní procedury (bez limitní podmínky) ;; nekonecny proud (define pow2 (let next ((last 1)) (cons-stream last (next (* 2 last ))))) ;; implicitni definice predchoziho (define pow2 (cons-stream 1 (stream-map (lambda (x) (* 2 x)) pow2))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

26 Ukázky implicitních definic proudů ;; proud faktorialu (define fak-stream (cons-stream 1 (stream-map * fak-stream (stream-cdr naturals)))) ;; proud Fibonacciho cisel (define fib-stream (cons-stream 1 (cons-stream 1 (stream-map + fib-stream (stream-cdr fib-stream))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

27 Konstruktor nekonečných proudů nekonečné proudy lze vytvářet procedurou build-stream analogická proceduře build-list, ale nemá limitní podmínku (není potřeba předávat délku vytvářeného streamu ) ;; konstruktor `build-stream' (define build-stream (lambda (f) (let proc ((i 0)) (cons-stream (f i) (proc (+ i 1)))))) ;; priklady (define ones (build-stream (lambda (i) 1))) (define naturals (build-stream (lambda (i) (+ i 1)))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

28 Příklady manipulace s nekonečnými proudy ;; vytvareni nekonecnych proudu z nekonecnych proudu ;; aplikaci po sobe jdoucich funkci na kazdy prvek (define expand-stream (lambda (stream. modifiers) (let next ((pending modifiers)) (if (null? pending) (apply expand-stream (stream-cdr stream) modifiers) (cons-stream ((car pending) (stream-car stream)) (next (cdr pending))))))) ;; priklady pouziti: (expand-stream ones - +) = proud: (expand-stream ones + -) = proud: (expand-stream naturals + -) = proud: Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

29 Příklady manipulace s nekonečnými proudy ;; vytvoreni proudu celych cisel (define integers (build-stream (lambda (i) (if (= i 0) 0 ((if (even? i) + -) (quotient (+ i 1) 2)))))) ;; nebo pouzitim streamu prirozenych a expand-stream (define integers (cons-stream 0 (expand-stream naturals - +))) ;; v obou pripadech dostavame integers = proud: Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

30 Příklady (nesprávné) manipulace s nekonečnými proudy ;; nasledujici ma smysl pouze pokud je `s1' konecny: (define stream-append2 (lambda (s1 s2) (stream-foldr (lambda (x y) (cons-stream x (force y))) s2 s1))) ;; druhy stream se neuplatni, protoze prvni je nekonecny (stream-append ones (stream-map - ones)) ;; nasledujici bude cyklit (stream-length ones) počítat délku (nekončeného) streamu je nesmysl neexistuje algoritmus (a nikdy existovat nebude), který by pro daný stream rozhodl, zda-li je konečný či nikoliv Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

31 Proud racionálních čísel můžeme vytvořit i proud všech racionálních čísel využijeme faktu, že všechna kladná racionální čísla jsou zapsána v následující tabulce (každé dokonce nekonečně mnoho krát) a toho, že tabulku můžeme projít po položkách v diagonálním směru POZNÁMKA: proud všech reálných čísel nelze vytvořit (!) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

32 Proud racionálních čísel ;; stream paru (1. 1) (2. 1) (1. 2) (3. 1) (define pairs (let next ((sum 2) (a 1) (b 1)) (cons-stream (cons a b) (if (= a 1) (next (+ sum 1) sum 1) (next sum (- a 1) (+ b 1)))))) ;; stream zlomku 1/1 2/1 1/2 3/1 2/2 1/3 (define fractions (stream-map (lambda (x) (/ (car x) (cdr x))) pairs)) kladná racionální čísla: zbývá odstranit opakující se čísla z fractions (například 1/1 je totéž jako 2/2, a podobně) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

33 Proud racionálních čísel ;; proud kladnych racionalnich cisel ;; stejna cisla jsou odstranena filtraci (define positive-rationals (let next ((f-stream fractions)) (cons-stream (stream-car f-stream) (next (stream-filter (lambda (x) (not (= x (stream-car f-stream)))) f-stream))))) ;; a konecne: stream vsech racionalnich cisel ;; /2 1/ /3 1/ /2 3/2 (define rationals (cons-stream 0 (expand-stream positive-rationals - +))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

34 Kdy použít proudy? Kdy použít proudy místo seznamů? 1 když potřebujeme řídit průběh výpočtu pomocí dat 2 když není dopředu známa velikost dat, která chceme zpracovávat, nebo není možné odhadnout, kolik dat budeme muset zpracovat, než najdeme řešení (nějakého) problému Příklad: pokud se budeme pokoušet najít ve velkém souboru sekvenci nějakých znaků odpovídající danému vzoru, pak nemá smysl natahovat celý vstupní soubor do paměti, což může být dlouhá operace (nebo i neproveditelná operace), protože hledaný řetězec může být třeba někde na začátku souboru. Typické použití proudů: řízení vstupně/výstupních operací práce se soubory používá mnoho PJ (například C++) my ukážeme implementaci V/V operací ve Scheme Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

35 Vstupně/výstupní operace ve Scheme Scheme používá při manipulaci se soubory tzv. porty port lze chápat jako identifikátor otevřeného souboru pro detaily viz specifikaci R5RS ;; priklad ukladani dat do souboru (define p (open-output-file "soubor.txt")) (display "Ahoj svete!" p) (newline p) (display (map - '( )) p) (newline p) (close-output-port p) ;; priklad nacitani dat ze souboru (define p (open-input-file "soubor.txt")) (display (read p)) (display (read p)) (display (read p)) (close-input-port p) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

36 Jednoduché vstupní proudy ;; vytvor stream ctenim vyrazu z vstupniho portu (define input-port->stream (lambda (reader port) (let iter () (let ((elem (reader port))) (if (eof-object? elem) (begin (close-input-port port) '()) (cons-stream elem (iter))))))) ;; vytvori stream otevrenim souboru (define file->stream (lambda (reader file-name) (input-port->stream reader (open-input-file file-name)))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

37 Zvýšení výpočetní efektivity pomocí proudů predikát equal-fringe? je pro dva seznamy pravdivý p. k. oba seznamy mají stejné atomické prvky pokud je projdeme zleva-doprava ;; primocare reseni, ktere je neefektivni (define equal-fringe? (lambda (s1 s2) (define flatten ; pomocna proc.: linearizace seznamu (lambda (l) (cond ((null? l) '()) ((list? (car l)) (append (flatten (car l)) (flatten (cdr l)))) (else (cons (car l) (flatten (cdr l))))))) (equal? (flatten s1) (flatten s2)))) ;; priklad pouziti: (equal-fringe? '(a (b (c)) () d) '(a b c (d))) = #t (equal-fringe? '(a (b (c)) () d) '(a b c (e))) = #f Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

38 Zvýšení výpočetní efektivity pomocí proudů V čem spočívá neefektivita předchozího řešení? 1 během výpočtu se konstruují lineární seznamy, které se potom použijí pouze jednorázově 2 predikát se nechová přirozeně. Pokud máme dva seznamy ve tvaru (a a (b, pak je okamžitě jasné, že výsledek pro ně by měl být #f, ale předchozí procedura je oba nejprve celé linearizuje Odstraníme problém č. 2: vstupní seznamy budeme linearizovat do proudu (to jest výsledkem linearizace seznamu bude proud atomů) okamžitě budeme mít k dispozici nejlevější atom ostatní prvky linearizovaného seznamu se budou hledat až když přistoupíme k dalšímu prvku proudu vytvoříme predikát na test shody dvou konečných proudů Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

39 Zvýšení výpočetní efektivity pomocí proudů ;; kazdy prislib je roven pouze sam sobe: (define d (delay 1)) (equal? d d) = #t (equal? (delay 1) (delay 1)) = #f ;; tim padem: (equal? (stream 'a 'b 'c) (stream 'a 'b 'c)) = #f ;; proto zavadime predikat shodnosti dvou streamu: (define stream-equal? (lambda (s1 s2) (or (and (null? s1) (null? s2)) (and (equal? (stream-car s1) (stream-car s2)) (stream-equal? (stream-cdr s1) (stream-cdr s2)))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

40 Zvýšení výpočetní efektivity pomocí proudů ;; temer dokonala verze equal-fringe? (define equal-fringe? (lambda (s1 s2) ;; pomocna definice: linearizace seznamu (define flatten (lambda (l) (cond ((null? l) '()) ((list? (car l)) (stream-append2 (flatten (car l)) (flatten (cdr l)))) (else (cons-stream (car l) (flatten (cdr l))))))) ;; jsou linearni seznamy totozne? (stream-equal? (flatten s1) (flatten s2)))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

41 Zvýšení výpočetní efektivity pomocí proudů Předchozí řešení má jeden malý problém ;; priklad na kterem nas predikat selhava (define a '(a)) (set-cdr! a a) (define b '((b))) (set-cdr! b b) (equal-fringe? a b) = (cyklí) ;; ODSTRANENI PROBLEMU (rozmyslete si proc): ;; misto procedury stream-append2 vytvorime makro (define-macro stream-append2 (lambda (s1 s2) `(let proc ((s,s1)) (if (stream-null? s),s2 (cons-stream (stream-car s) (proc (stream-cdr s))))))) nový pohled: makro = procedura s líně vyhodnocenými argumenty Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

42 Vyhodnocovací proces s vyrovnávací pamětí ;; modelovy program (define fib (lambda (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))) Výhody a nevýhody předchozího kódu: výhoda: je čistě napsaný (vznikl přepisem definice fib. čísla) nevýhoda: je neefektivní dochází ke zbytečnému opakování výpočtů Otázka: Jak zachovat čitelnost kódu, ale zvýšit efektivitu výpočetního procesu? Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

43 Vyhodnocovací proces s vyrovnávací pamětí ;; iterativni verze pocedury ;; predstavuje zrychleni na ukor citelnosti kodu (define fib (lambda (n) (let iter ((a 1) (b 1) (n n)) (if (<= n 1) a (iter b (+ a b) (- n 1)))))) Lepší řešení: zachováme původní kód procedury proceduru zabalíme do další procedury (memoize), která bude mít svou vnitřní vyrovnávací paměť do které bude ukládat výsledky aplikace výchozí procedury odstraníme tak problém opakovaného provádění stejných výpočtů Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

44 Vytvoříme procedury empty-assoc a assoc! pro správu paměti ;; prazdna pamet (define empty-assoc (lambda () (cons (cons #f #f) '()))) ;; destruktivne zarad novy zaznam/modifikuj existujici (define assoc! (lambda (assoc key val) (let iter ((as assoc)) (cond ((null? as) (set-cdr! assoc (cons (cons key val) (cdr assoc)))) ((equal? (caar as) key) (set-cdr! (car as) val)) (else (iter (cdr as))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

45 ;; priklad zarazeni novych zaznamu: (define a (empty-assoc)) a = ((#f. #f)) (assoc! a 'ahoj 10) a = ((#f. #f) (ahoj. 10)) (assoc! a 'blah 20) a = ((#f. #f) (blah. 20) (ahoj. 10)) (assoc! a 'ahoj 30) a = ((#f. #f) (blah. 20) (ahoj. 30)) ;; vyhledavani lze provest pomoci klasickeho assoc (assoc 'blah a) = (blah. 20) (assoc #f a) = (#f. #f) Poznámka: pár (#f. #f) je vždy přítomen kvůli mutaci Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

46 Vyhodnocovací proces s vyrovnávací pamětí procedura memoize vytvoří obálku nad danou procedurou (provede memoizaci dané procedury) každá memoizovaná procedura má vlastní paměť pro úschovu výsledků při volání memoizované procedury s již dříve použitými argumenty je výsledná hodnota vyhledána v paměti (define memoize (lambda (f) (let ((memory (empty-assoc))) (lambda called-with-args (let ((found (assoc called-with-args memory))) (if found (cdr found) (let ((result (apply f called-with-args))) (assoc! memory called-with-args result) result))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

47 ;; fibonacciho cisla urychlena pomoci memoize (define fib (memoize (lambda (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2))))))) ;; POZOR: tohle by nefungovalo: (define fib (lambda (n) puvodni pomaly fib (define fast-fib (memoize fib)) (fast-fib 32) bude ve skutecnosti pomaly ve fast-fib se rekurzivně volá původní procedura bez cache při (fast-fib 32) je zapamatován pouze výsledek pro 32 nevede ke kýženému zrychlení výpočtu Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

48 ;; procedury s kesi se chovaji jinak nez,,klasicke'' ;; v pripade pouziti vedlejsiho efektu (let ((cntr 0)) (define modify (lambda (x) (set! cntr (+ 1 cntr)))) (modify #f) (modify #f) cntr) = 2 (let ((cntr 0)) (define modify (memoize (lambda (x) (set! cntr (+ 1 cntr))))) (modify #f) (modify #f) cntr) = 1 Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

49 ;; vylepsena verze: pri preplneni pameti se pamet vysype (define make-memoize (lambda limit (lambda (f) (let ((memory (empty-assoc)) (memory-size 0)) (lambda called-with-args (let ((found (assoc called-with-args memory))) (if found (cdr found) (let ((result (apply f called-with-args))) (if (and (not (null? limit)) (> memory-size (car limit))) (begin (set! memory-size 0) (set! memory (empty-assoc)))) (assoc! memory called-with-args result) (set! memory-size (+ memory-size 1)) result)))))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

50 ;; urychlene fib. s pameti o peti bunkach (define fib ((make-memoize 5) (lambda (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2))))))) Srovnání počtu aktivací vnitřní procedury při dané velikosti paměti během výpočtu (fib 32) velikost paměti počet aktivací Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

51 Makro pro vytváření procedur s keší ;; globalni,,konstanta'' udavajici velikost pameti (define *max-memory* 1000) ;; makro kappa (define-macro kappa (lambda (args. body) `((make-memoize *max-memory*) (lambda,args,@body)))) ;; priklad pouziti: (define fib (kappa (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))) Vilém Vychodil (UP Olomouc) PP II, Př. 6: Lazy, Streams, Cache 22. března / 101

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

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ Slajdy vytvořili Vilém Vychodil a Jan Konečný (KI, UP Olomouc) PP 2, Lekce

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Explicitní aplikace a vyhodnocování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 6 V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška

Více

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

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY VÝVOJ TOHOTO UČEBNÍHO MATERIÁLU JE SPOLUFINANCOVÁN EVROPSKÝM

Více

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

Paradigmata programování II Přednáška 2: Mutace Paradigmata programování II Přednáška 2: Mutace Vilém Vychodil Katedra informatiky, Univerzita Palackého v Olomouci 22. února 2007 Vilém Vychodil (UP Olomouc) PP II, Př. 2: Mutace 22. února 2007 1 / 85

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Kvazikvotování a manipulace se symbolickými výrazy Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 11 V. Vychodil (KI, UP Olomouc) Kvazikvotování, manipulace se

Více

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

Paradigmata programování II Přednáška 1: Vedlejší efekt Paradigmata programování II Přednáška 1: Vedlejší efekt Vilém Vychodil Katedra informatiky, Univerzita Palackého v Olomouci 15. února 2007 Vilém Vychodil (UP Olomouc) PP II, Př. 1: Vedlejší efekt 15. února

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Tečkové páry, symbolická data a kvotování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 4 V. Vychodil (KI, UP Olomouc) Tečkové páry, symbolická data a kvotování

Více

Paradigmata programování II Korutiny a nedeterminismus

Paradigmata programování II Korutiny a nedeterminismus 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

Více

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT KATEDRA INFORMATIKY, P RÍRODOV EDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT Slajdy vytvoril Vilém Vychodil Jan Konecný (KI, UP Olomouc) PP 2A, Lekce 1 Vedlejší

Více

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE Slajdy vytvo ili Vilém Vychodil a Jan Kone ný Jan Kone ný (KI, UP Olomouc) PP 2A, Lekce 2 Mutace

Více

Paradigmata programování 2

Paradigmata programování 2 Paradigmata programování 2 6. cvičení Radek Janoštík Univerzita Palackého v Olomouci 18.3.2019 Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 1 / 11 Vedlejší efekt

Více

1. Od Scheme k Lispu

1. Od Scheme k Lispu KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI www.inf.upol.cz Michal Krupka krupka.inf.upol.cz michal.krupka@upol.cz 7. listopadu, 77 46 Olomouc Paradigmata programování poznámky k přednášce. Od

Více

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS 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

Více

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

PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 AKTUÁLNÍ POKRAƒOVÁNÍ Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2, Lekce 8 Aktuální

Více

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2A, Lekce 5 Makra III 1

Více

Přednáška 3. Rekurze 1

Přednáška 3. Rekurze 1 Paradigmata programování 1 Přednáška 3. Rekurze 1 Michal Krupka KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Obsah 1 Příklady 2 Rekurzivní procedury a rekurzivní výpočetní proces 3 Další příklady

Více

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

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 Hanojská věž Stavový prostor 1. množina stavů S = {s} 2. množina přechodů mezi stavy (operátorů) Φ = {φ} s k = φ ki (s i ) zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah

Více

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 3. CVIČENÍ 2011 Jan Janoušek MI-FLP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Page 1 of 6 Cviceni 3 Obsah seznamy, cons-buňka, car, cdr, first,

Více

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I KATEDRA INFORMATIKY, P ÍRODOV DECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I Slajdy vytvo ili Vilém Vychodil a Jan Kone ný (KI, UP Olomouc) PP 2A, Lekce 3 Makra I 1 / 35

Více

Funkcionální programování úvod

Funkcionální programování úvod Funkcionální programování úvod Imperativní jazyky založeny na von Neumann architektuře primárním kriteriem je efektivita Modelem je Turingův stroj Základní konstrukcí je příkaz Příkazy mění stavový prostor

Více

Paradigmata programování 1

Paradigmata programování 1 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

Více

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

(pracovní verze textu určená pro studenty) KATEDRA INFORMATIKY PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO CVIČENÍ Z PARADIGMAT PROGRAMOVÁNÍ I Lekce 7: Akumulace Učební materiál k přednášce 16. listopadu 2006 (pracovní verze textu určená pro studenty)

Více

Základní datové struktury

Základní datové struktury Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013

Více

Lokální definice (1) plocha-kruhu

Lokální definice (1) plocha-kruhu Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu

Více

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]

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] Hanojská věž zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah je lepší? (co je lepší tah?) P. Berka, 2012 1/21 Stavový prostor 1. množina stavů S = {s} 2. množina přechodů

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Jazyk C# (seminář 5)

Jazyk C# (seminář 5) Jazyk C# (seminář 5) Pavel Procházka KMI 23. října 2014 Přetěžování metod motivace Představme si, že máme metodu, která uvnitř dělá prakticky to samé, ale liší se pouze parametry V C# můžeme více metod

Více

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. CVIČENÍ 2011 Jan Janoušek MI-FLP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Page 1 of 5 Lekce 5 Obsah sekvence, sequencep, subseq, reverse,

Více

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD 9 - Map/filter/reduce OMO Ing. David Kadleček, PhD kadlecd@fel.cvut.cz, david.kadlecek@cz.ibm.com 1 Map/filter/reduce v Java Map/filter/reduce v Java = Java 1.8 streams API Funkcionální přístup (řetězíme

Více

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá: SII - Informatika Způsob vyhodnocení: Při vyhodnocení budou za nesprávné odpovědi strhnuty body. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá: a) sekundární klíč b)

Více

VISUAL BASIC. Práce se soubory

VISUAL BASIC. Práce se soubory VISUAL BASIC Práce se soubory Práce se soubory 1/2 2 Vstupní data pro programy bývají uloženy do souborů Vstupy pro výpočet, nastavení vzhledu aplikace Výsledky práce programu je potřeba uchovat uložit

Více

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

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

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci Základy programovaní 4 (Java) Stream API Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/ZP4JV 5. listopad, 2014 1 / 10 Stream API Java 8 nový přístup k práci s kolekcemi

Více

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

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel

Více

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)

Více

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu

Více

Binární soubory (datové, typované)

Binární soubory (datové, typované) Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i

Více

LISP Definice funkcí

LISP Definice funkcí LISP Definice funkcí (DEFUN jméno-fce (argumenty) tělo-fce ) Přiřadí jménu-fce lambda výraz definovaný tělem-fce, tj. (LAMBDA (argumenty) tělo-fce). Vytvoří funkční vazbu symbolu jméno-fce Struktura symbolu:

Více

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

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

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

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Lineární spojový seznam (úvod do dynamických datových struktur)

Lineární spojový seznam (úvod do dynamických datových struktur) Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky

Více

O datových typech a jejich kontrole

O datových typech a jejich kontrole .. O datových typech a jejich kontrole Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Typová kontrola Programovací techniky O datových typech

Více

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Práce se soubory. Úvod do programování 2 Tomáš Kühr Práce se soubory Úvod do programování 2 Tomáš Kühr Soubory z pohledu C u Soubor chápeme jako posloupnost bytů uložených na disku u Datový proud (anglicky stream) u Ještě obecnější přístup u Sjednocuje

Více

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.

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. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Práce s binárními soubory. Základy programování 2 Tomáš Kühr Práce s binárními soubory Základy programování 2 Tomáš Kühr Binární soubory Mohou mít libovolnou strukturu Data jsou uložena ve stejné podobě jako v paměti za běhu programu Výhody: Pro uložení je potřeba

Více

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

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

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 Denotační sémantika programovacího jazyka doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 Obsah přednášky Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup

Více

Časová a prostorová složitost algoritmů

Časová a prostorová složitost algoritmů .. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Logické programování

Logické programování 30. října 2012 Osnova Principy logického programování 1 Principy logického programování 2 3 1 Principy logického programování 2 3 Paradigmata programování Strukturované programování Procedurální programování

Více

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

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr Funkce pokročilé možnosti Úvod do programování 2 Tomáš Kühr Funkce co už víme u Nebo alespoň máme vědět... J u Co je to funkce? u Co jsou to parametry funkce? u Co je to deklarace a definice funkce? K

Více

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

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12. Rekurze doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Rekurze 161 / 344 Osnova přednášky

Více

Práce se soubory. Základy programování 2 Tomáš Kühr

Práce se soubory. Základy programování 2 Tomáš Kühr Práce se soubory Základy programování 2 Tomáš Kühr Soubory z pohledu C Soubor zjednodušeně chápeme jako posloupnost bytů uložených někde na disku Datový proud (anglicky stream) Ještě obecnější přístup

Více

Sdílení dat mezi podprogramy

Sdílení dat mezi podprogramy Sdílení dat mezi podprogramy Datové objekty mohou být mezi podprogramy sdíleny pomocí ne-lokálních referenčních prostředí, která jsou vytvářena na základě æ explicitních modifikací (formální parametry

Více

Jazyk Scheme: jeho syntax a sémantika

Jazyk Scheme: jeho syntax a sémantika Jazyk Scheme: jeho syntax a sémantika Vilém Vychodil, vilemvychodil@upolcz Syntaxe Scheme program v jazyku Scheme = konečná posloupnost symbolických výrazů symbolický výraz(s-výraz/ symbolic expression/

Více

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace Programování: základní konstrukce, příklady, aplikace IB111 Programování a algoritmizace 2011 Připomenutí z minule, ze cvičení proměnné, výrazy, operace řízení výpočtu: if, for, while funkce příklady:

Více

Aplikace. vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin

Aplikace. vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin Aplikace Aplikace se liší tím, k jakému účelu jsou tvořeny. To má vliv na to, jakou mají strukturu i na to, jak pracné je je vyvinout. Bylo vypozorováno, že aplikace je možné rozdělit do skupin s podobnou

Více

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy Uživatelem definované typy Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 Definice uživatelského typu data Color = Red Green Blue Color typový konstruktor Red / Green / Blue datové konstruktory

Více

Rekurzivní algoritmy

Rekurzivní algoritmy Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS

Více

Prohledávání do šířky = algoritmus vlny

Prohledávání do šířky = algoritmus vlny Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé

Více

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 8 1 Základy algoritmizace 8. Rekurze doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Jiří Vokřínek,

Více

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

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5 Obsah Obsah 1 Řídicí struktury 1 2 Podmínka 1 2.1 Podmínka typu case......................... 2 3 Příkaz skoku 3 4 Cykly 4 4.1 Cyklus s podmínkou na začátku................... 4 4.2 Cyklus s podmínkou

Více

Programování v Pythonu

Programování v Pythonu ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P íprava studijního programu Informatika je podporována projektem nancovaným z Evropského sociálního fondu a rozpo tu hlavního

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada IB015 Neimperativní programování Časová složitost, Typové třídy, Moduly Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 07 str. 2/37 Časová složitost Časová složitost algoritmu IB015

Více

Programování v Pythonu

Programování v Pythonu ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P íprava studijního programu Informatika je podporována projektem nancovaným z Evropského sociálního fondu a rozpo tu hlavního

Více

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků

Více

Lineární datové struktury

Lineární datové struktury Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové

Více

Implementace LL(1) překladů

Implementace LL(1) překladů Překladače, přednáška č. 6 Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 30. října 2007 Postup Programujeme syntaktickou analýzu: 1 Navrhneme vhodnou LL(1) gramatiku

Více

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

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21. Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky

Více

map, multimap - Asociativní pole v C++.

map, multimap - Asociativní pole v C++. map, multimap - Asociativní pole v C++. Jedná se o asociativní pole. V asociativním poli jsou uloženy hodnoty ve tvaru (klíč,hodnota), kde klíč je vlastně "index" prvku. Klíčem může být libovolný objekt,

Více

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

Spojová implementace lineárních datových struktur Spojová implementace lineárních datových struktur doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB

Více

Programování v Pythonu

Programování v Pythonu ƒeské vysoké u ení technické v Praze FIT Programování v Pythonu Ji í Znamená ek P íprava studijního programu Informatika je podporována projektem nancovaným z Evropského sociálního fondu a rozpo tu hlavního

Více

Operátory ROLLUP a CUBE

Operátory ROLLUP a CUBE Operátory ROLLUP a CUBE Dotazovací jazyky, 2009 Marek Polák Martin Chytil Osnova přednášky o Analýza dat o Agregační funkce o GROUP BY a jeho problémy o Speciální hodnotový typ ALL o Operátor CUBE o Operátor

Více

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

Paradigmata programování 1 poznámky k přednášce. 3. Rekurze 1 KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI www.inf.upol.cz Michal Krupka krupka.inf.upol.cz michal.krupka@upol.cz 17. listopadu 12, 771 46 Olomouc Paradigmata programování 1 poznámky k přednášce

Více

Struktura programu v době běhu

Struktura programu v době běhu Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů

Více

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model Databázové systémy Tomáš Skopal - relační model * relační kalkuly Osnova přednášky relační kalkuly doménový n-ticový Relační kalkuly využití aparátu predikátové logiky 1. řádu pro dotazování rozšíření

Více

Assembler - 5.část. poslední změna této stránky: Zpět

Assembler - 5.část. poslední změna této stránky: Zpět 1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají

Více

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ě

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ě Metody přidělování paměti 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ě Důležitá hlediska jazykových konstrukcí: Dynamické typy Dynamické

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Programovací jazyk Haskell

Programovací jazyk Haskell Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, D 403 59 732 3252 Historie září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace jazyka Haskell

Více

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012 Přednáška Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012 Příprava studijního programu Informatika je podporována projektem financovaným z Evropského

Více

PODPROGRAMY PROCEDURY A FUNKCE

PODPROGRAMY PROCEDURY A FUNKCE PODPROGRAMY PROCEDURY A FUNKCE Programy bez podprogramů Příklady: a) Napište program, který na obrazovku nakreslí čáru složenou ze znaků pomlčka. program Cara; b) Napište program, který na obrazovku nakreslí

Více

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace. Popis ovládání 1. Úvod Tento popis má za úkol seznámit uživatele se základními principy ovládání aplikace. Ovládání je možné pomocí myši, ale všechny činnosti jsou dosažitelné také pomocí klávesnice. 2.

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

Úvod do informatiky. Miroslav Kolařík

Úvod do informatiky. Miroslav Kolařík Úvod do informatiky přednáška desátá Miroslav Kolařík Zpracováno dle R. Bělohlávek, V. Vychodil: Diskrétní matematika 2, http://phoenix.inf.upol.cz/esf/ucebni/dm2.pdf P. Martinek: Základy teoretické informatiky,

Více

Programovací í jazyk Haskell

Programovací í jazyk Haskell Historie Programovací í jazyk Haskell doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace

Více

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Funkce, podmíněný příkaz if-else, příkaz cyklu for Funkce, podmíněný příkaz if-else, příkaz cyklu for Definice funkce Funkce je pojmenovaná část programu, kterou lze dále zavolat v jiné části programu. V Pythonu je definována klíčovým slovem def. Za tímto

Více

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

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 Úvod do Prologu 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 Warren (Warren Abstract Machine) implementace

Více

Připravil: David Procházka. Vertex Buffer Objects

Připravil: David Procházka. Vertex Buffer Objects 30. září 2013, Brno Připravil: David Procházka Vertex Buffer Objects Počítačová grafika 2 Obsah přednášky Strana 2 / 22 Obsah přednášky 1 Obsah přednášky 2 Vertex Buffer Objects 3 Příklady 4 Shrnutí Obsah

Více

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA) Předmět: Algoritmizace praktické aplikace (3ALGA) Vytvořil: Jan Brzeska Zadání: Vytvoření funkcí na stromech (reprezentace stromu směrníky). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4.

Více

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

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

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Algoritmy a datové struktury

Algoritmy a datové struktury Algoritmy a datové struktury Stromy 1 / 32 Obsah přednášky Pole a seznamy Stromy Procházení stromů Binární stromy Procházení BS Binární vyhledávací stromy 2 / 32 Pole Hledání v poli metodou půlení intervalu

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová

Více

Programujeme v softwaru Statistica

Programujeme v softwaru Statistica Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.

Více