Paradigmata programování 1



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

Paradigmata programování 1

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

Paradigmata programování 1

Paradigmata programování 1

1. Od Scheme k Lispu

Paradigmata programování 2

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

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

Přednáška 3. Rekurze 1

PARADIGMATA PROGRAMOVÁNÍ 2A VEDLEJŠÍ EFEKT

Jazyk Scheme: jeho syntax a sémantika

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

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

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

Paradigmata programování II Korutiny a nedeterminismus

PARADIGMATA PROGRAMOVÁNÍ 2 KORUTINY, NEDETERMINISMUS

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA I

PARADIGMATA PROGRAMOVÁNÍ 2A MAKRA III

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

PARADIGMATA PROGRAMOVÁNÍ 2A MUTACE

Matematika 1 MA1. 2 Determinant. 3 Adjungovaná matice. 4 Cramerovo pravidlo. 11. přednáška ( ) Matematika 1 1 / 29

prof. RNDr. Čestmír Burdík DrCs. prof. Ing. Edita Pelantová CSc. BI-ZMA ZS 2009/2010

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

Základní pojmy teorie množin Vektorové prostory

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

Funkcionální programování úvod

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

1 Báze a dimenze vektorového prostoru 1

6. blok část C Množinové operátory

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

LISP Definice funkcí

Jazyk C# (seminář 5)

Úvod do informatiky. Miroslav Kolařík. Zpracováno dle učebního textu R. Bělohlávka: Úvod do informatiky, KMI UPOL, Olomouc 2008.

Fuzzy množiny, Fuzzy inference system. Libor Žák

Matematická morfologie

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

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

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

Paradigmata programování 1

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

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

Lokální definice (1) plocha-kruhu

Matematická logika. Miroslav Kolařík

Databáze I. Přednáška 6

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

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

Programovací jazyk Haskell

Zadání semestrálního projektu Algoritmy II. letní semestr 2017/2018

DEFINICE Z LINEÁRNÍ ALGEBRY

Programovací í jazyk Haskell

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

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Algoritmizace a programování

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Paradigmata programování 1

Základní datové struktury III: Stromy, haldy

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

Úvod do programovacích jazyků (Java)

5 Orientované grafy, Toky v sítích

3 Množiny, Relace a Funkce

Množiny, relace, zobrazení

Matematická analýza 1

Kapitola 1. Relace. podle definice podmnožinou každé množiny. 1 Neříkáme už ale, co to je objekt. V tom právě spočívá intuitivnost našeho přístupu.

Množinu všech matic typu m n nad tělesem T budeme označovat M m n (T ), množinu všech čtvercových matic stupně n nad T pak M n (T ).

Bakalářská matematika I

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Kartografické modelování. II Mapová algebra obecné základy a lokální funkce

PRG036 Technologie XML

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

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

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

Úvod do informatiky. Miroslav Kolařík

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Úvod do programovacích jazyků (Java)

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

Zavedení a vlastnosti reálných čísel

Modely vyhledávání informací 4 podle technologie. 1) Booleovský model. George Boole Aplikace booleovské logiky

Úvod do logiky (presentace 2) Naivní teorie množin, relace a funkce

Matematika I (KMI/PMATE)

Modulární aritmetika, Malá Fermatova věta.

Pojem relace patří mezi pojmy, které prostupují všemi částmi matematiky.

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

MĚŘENÍ A ANALÝZA ELEKTROAKUSTICKÝCH SOUSTAV NA MODELECH. Petr Kopecký ČVUT, Fakulta elektrotechnická, Katedra Radioelektroniky

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

Matematika (KMI/PMATE)

Pojem binární relace patří mezi nejzákladnější matematické pojmy. Binární relace

UDL 2004/2005 Cvičení č.6 řešení Strana 1/5

Matice. Předpokládejme, že A = (a ij ) je matice typu m n: diagonálou jsou rovny nule.

Číselné vyjádření hodnoty. Kolik váží hrouda zlata?

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

Lineární algebra Operace s vektory a maticemi

Diskrétní matematika. DiM /01, zimní semestr 2017/2018

Základní datové struktury

NPRG030 Programování I, 2018/19 1 / :25:37

Úvod do informatiky. Miroslav Kolařík

Programování v Pythonu

RELACE, OPERACE. Relace

Stromy, haldy, prioritní fronty

Stručný návod k programu Octave

Transkript:

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 6 1 / 33

Přednáška 6: Přehled 1 Explicitní aplikace procedur: Apply je dostupné prostřednictvím procedury apply, provádění operací se seznamy využívající apply, uživatelsky definované procedury s nepovinnými a libovolnými argumenty. 2 Explicitní vyhodnocování elementů: prostředí jako element prvního řádu, Eval (součást REPL) je dostupné prostřednictvím procedury eval, data = program se vším všudy, využití a záludnosti eval. 3 Praktické příklady použití: množiny reprezentované seznamy hodnot (bez duplicit), binární relace (mezi množinami) reprezentované jako seznamy párů. V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 2 / 33

Opakování Páry a seznamy tečkový pár: agreguje dvě hodnoty (car, cdr, cons) prázdný seznam: () speciální element jazyka seznamy: definované (rekurzivně) každý element, který je buď prázdný seznam, nebo pár vytvořený aplikací cons na libovolný element a seznam (v tomto pořadí). (cons 1 (cons 'x (cons 3 '()))) =. 1. x. 3 () Operace se seznamy (zatím známe): konstruktory: cons, list, build-list (procedura vyššího řádu), selektory: car, cdr, list-ref další operace: append, reverse mapování: map (procedura vyššího řádu) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 3 / 33

Aplikace (uživatelsky definovaných procedur), Př. 2 3 Mějme proceduru F ve tvaru ( param 1 param 2 param n ); výraz 1, výraz 2,..., výraz m ; P Apply[F ; E 1,..., E m ] = aplikace procedury F na argumenty E 1,..., E m je hodnota (element), která je získána následovně: pokud m n, končíme chybou (špatný počet argumentů), jinak: je vytvořeno nové lokální prostředí P l předek prostředí P l je nastaven na P v P l se zavedou vazby param n E i v P l se postupně vyhodnotí výraz 1, výraz 2,..., výraz m Apply[F ; E 1,..., E m ] je potom výsledkem vyhodnocení výraz m V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 4 / 33

Implicitní explicitní aplikace Rozeznáváme dva typy aplikací 1 implicitní doposud aplikace procedur, která je důsledkem vyhodnocování seznamů probíhá implicitně (je zahrnut, ale není přímo vyjádřen) 2 explicitní dnes nové aplikace procedur, která probíhá na naši žádost probíhá explicitně (žádost o aplikaci je přímo vyjádřená) Jak a kdy použít explicitní aplikaci? Lze použít pomocí procedury apply, uvidíme dále. Používá se v případě, kdy máme seznam argumentů k dispozici (jako data). V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 5 / 33

Příklad (Motivační příklad pro apply) Sečtení všech čísel v seznamu: s = seznam čísel (+ (car s) (cadr s) (caddr s) ) co když neznáme délku? (+ s) = CHYBA: argument pro + není číslo Řešení: (apply + s) Význam: vyžádáme hodnotu Apply[F ; E 1,..., E n ], kde F je procedura sčítání prvky seznamu navázaného na s jsou E 1,..., E n V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 6 / 33

Definice (primitivní procedura apply) Primitivní procedura apply se používá s argumenty ve tvaru: (apply procedura arg 1 arg 2 arg n seznam ), kde argument procedura je procedura, arg 1,..., arg n jsou nepovinné argumenty, a mohou být vynechány, argument seznam je seznam a musí být uveden. Aplikace probíhá následovně: 1 Je sestaven seznam argumentů: arg 1 je první prvek sestaveného seznamu, arg 2 je druhý prvek sestaveného seznamu,. arg n je n-tý prvek sestaveného seznamu, zbylé prvky jsou doplněny ze seznamu seznam. 2 procedura je aplikována s argumenty ze sestaveného seznamu. V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 7 / 33

Příklad (Používání apply) (apply + '()) = 0 (apply append '()) = () (apply append '((1 2 3) () (c d))) = (1 2 3 c d) (apply list '(1 2 3 4)) = (1 2 3 4) (apply cons (list 2 3)) = (2. 3) (apply min '(4 1 3 2)) = 1 (apply +) = CHYBA: Chybí seznam hodnot. (apply cons '(1 2 3 4)) = CHYBA: cons má mít dva argumenty. (apply + 1 2 3 4 '()) = 10 (apply + 1 2 3 '(4)) = 10 (apply + 1 2 '(3 4)) = 10 (apply + 1 '(2 3 4)) = 10 (apply + '(1 2 3 4)) = 10 V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 8 / 33

Příklad (Použití apply: transpozice matic reprezentovaných seznamy) Motivace: (apply map list '((a b c) (1 2 3))) = ((a 1) (b 2) (c 3)) Reprezentace matice a její transpozice: 1 5 9 1 2 3 4 A = 5 6 7 8, A T = 2 6 10 3 7 11 9 10 11 12 4 8 12 Řešení: (define transpose (lambda (matrix) (apply map list matrix))) ((1 5 9) (2 6 10) (3 7 11) (4 8 12)) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 9 / 33

Příklad (Výpočet délky seznamu: length) Pozorování: (define s '(a b c d e f g)) s = (a b c d e f g) (map (lambda (x) 1) s) = (1 1 1 1 1 1 1) (apply + (map (lambda (x) 1) s)) = 7 Zobecnění pozorování pro výpočet délky seznamu: (define length (lambda (l) (apply + (map (lambda (x) 1) l)))) je mírně neefektivní, ale není to žádná katastrofa mezní případ: (length '()) funguje korektně díky součtu nula jedniček (!!) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 10 / 33

Filtrace metoda zpracování seznamu procedura filter argumenty: funkce jednoho argumentu (podmínka) a seznam výsledek aplikace: seznam prvků z seznam splňujících podmínku Příklad (Příklady použití filter) (filter even? '(1 2 3 4 5 6)) = (2 4 6) (filter pair? '(1 (2. a) 3 (4. k))) = ((2. a) (4. k)) (filter (lambda (x) (not (pair? x))) '(1 (2. a) 3 (4. k))) = (1 3) (filter symbol? '(1 a 3 b 4 d)) = (a b d) Ouha! Procedura filter není v jazyku Scheme (standardně) implementována. V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 11 / 33

Příklad (Jak chápat filtraci?) (define s '(1 3 2 6 1 7 4 8 9 3 4)) (map (lambda (x) (if (even? x) (list x) '())) s) = (() () (2) (6) () () (4) (8) () () (4)) (apply append (map (lambda (x) (if (even? x) (list x) '())) s)) = (2 6 4 8 4) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 12 / 33

Příklad (Implementace procedury filter) Zobecnění předchozího pozorování: (define filter (lambda (f l) (apply append (map (lambda (x) (if (f x) (list x) '())) l)))) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 13 / 33

Příklad (Procedury remove a member? vytvořené pomocí filtrace) Odstranění prvků splňující podmínku: (define remove (lambda (f l) (filter (lambda (x) (not (f x))) l))) Test přítomnosti prvku v seznamu: (define member? (lambda (elem l) (not (null? (filter (lambda (x) (equal? x elem)) l))))) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 14 / 33

Příklad (Nepříliš efektivní implementace list-ref) (define list-ref (lambda (l index) (let ((indices (build-list (length l) (lambda (i) i)))) (cdar (filter (lambda (cell) (= (car cell) index)) (map cons indices l)))))) opět neefektivní konstruuje se zbytečný seznam indexů konstruuje se zbytečný seznam párů index-hodnota lepší řešení na dalších přednáškách V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 15 / 33

Definice (λ-výraz s nepovinnými a libovolnými formálními argumenty) Každý seznam ve tvaru (lambda ( param 1 param m ) výraz 1 výraz k ), nebo (lambda ( param 1 param n. zbytek ) výraz 1 výraz k ), nebo (lambda parametry výraz 1 výraz k ), kde n, k jsou kladná čísla, m je nezáporné číslo, param 1,..., param n, zbytek jsou vzájemně různé symboly, parametry je symbol, výraz 1,..., výraz k jsou libovolné výrazy tvořící tělo, se nazývá λ-výraz, přitom: m, n nazýváme počet povinných formálních argumentů, zbytek je formální argument zastupující seznam nepovinných argumentů, parametry je formální argument zastupující seznam všech argumentů. V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 16 / 33

Příklad (Porovnání čísel s danou přesností) (define approx= (lambda (x y. epsilon) (let ((epsilon (if (null? epsilon) 1/1000 (car epsilon)))) (<= (abs (- x y)) epsilon)))) (approx= 5 5.00027) = #t (approx= 5 5.01) = #f (approx= 5 5.01 1/100) = #t V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 17 / 33

Příklad (Vytvoření obecného map pomocí map1 a apply) (define map (lambda (f. lists) (let ((len (length (car lists)))) (build-list len (lambda (index) (apply f (map1 (lambda (l) (list-ref l index)) lists))))))) (map list '(a b c)) = ((a) (b) (c)) (map cons '(a b c) '(1 2 3)) = ((a. 1) (b. 2) (c. 3)) není efektivní kvůli použití list-ref V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 18 / 33

Příklad (Procedury zpracovávající libovolný počet argumentů) Součet čtverců: (define sum2 (lambda cisla (apply + (map (lambda (x) (* x x)) cisla)))) (sum2) = 0 (sum2 1) = 1 (sum2 1 2) = 5 (sum2 1 2 3) = 14 Užitečné procedury: (define first-arg (lambda list (car list))) (define second-arg (lambda list (cadr list))) (define always (lambda (x) (lambda list x))). V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 19 / 33

Explicitní vyhodnocování a eval Eval je k dispozici podobně jako Apply: primitivní procedura eval argumentem je element k vyhodnocení explicitní vyhodnocení pomocí eval probíhá v globálním prostředí používat s mírou (!!) (eval 10) = 10 (eval '+) = procedura (eval '(+ 1 2)) = 3 (eval (list + 1 2)) = 3 zajímavé,... (let ((x 10)) (eval '(+ 5 x))) = CHYBA: x nemá vazbu (let ((x 10)) (eval (list '+ 5 x))) = 15 (eval (read)) = proveď jeden cyklus REPLu (eval (list * 2 (read))) = zakomponuj vstup do výrazu a vyhodnoť V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 20 / 33

Příklad (Predikáty forall a and-proc) Řešení pomocí filtrace (pozor, apply nelze použít přímo s and): (define and-proc (lambda args (null? (remove (lambda (x) x) args)))) (define forall (lambda (f l) (apply and-proc (map f l)))) Nešťastné řešení pomocí eval: (define and-proc (lambda args (eval (cons 'and args)))) (and-proc '(if #f #t #f)) = #f (and '(if #f #t #f)) = (if #f #t #f) což je true V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 21 / 33

Prostředí jako element prvního řádu Omezení předchozího eval: Eval[E, P] versus Eval[E, P G ] je potřeba mít eval se dvěma argumenty: elementem a prostředím je potřeba zhmotnit prostředí a pracovat s ním jako s elementem jazyka Prostředky pro práci s prostředími (the-environment) vrací aktuální prostředí (speciální forma) (environment-parent prostředí ) vrací předchůdce prostředí (procedure-environment procedura ) vrací prostředí vzniku procedury (environment->list prostředí ) vrací seznam vazeb v prostředí Prostředí je element prvního řádu. (!!) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 22 / 33

Příklad (Explicitní vyhodnocování v lokálních prostředích) (let ((x 10)) (the-environment)) = lokální prostředí, kde x 10 (let ((x 10)) (eval '(* 2 x) (the-environment))) = 20 (eval '(* 2 x) (let ((x 10)) (the-environment))) = 20 (let ((x 10) (y 20)) (environment->list (the-environment))) = ((x. 10) (y. 20)) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 23 / 33

Příklad (Získání prostředí vzniku procedury a lexikálního předka) (procedure-environment (let ((x 10)) (lambda (y) (+ x y)))) = prostředí vzniku procedury, kde x 10 (environment->list (environment-parent (let* ((x 10) (y 20)) (the-environment)))) = ((x. 10)) the-environment, procedure-environment, environment->list je k dispozici (například) v interpretu Elk (embeddable Scheme) tyto procedury a formy nejsou k dispozici všude (!!) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 24 / 33

Příklad (Proč je použití eval nebezpečné?) je možné měnit (mutovat) prostředí vzniku procedur, aniž by to bylo patrné nebezpečí vzniku chyb (define aux-proc (let () (lambda (x) (+ x y)))) (aux-proc 10) = CHYBA: Symbol y nemá vazbu. (eval '(define y 20) (procedure-environment aux-proc)) y = Symbol y nemá vazbu (aux-proc 10) = 30 zdánlivě podivné V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 25 / 33

Příklad: Množiny a binární relace Konečné množiny matematické struktury: A = {a 1, a 2,..., a n }, kde n 0 (pro n = 0 je A = ) reprezentace ve Scheme seznamem hodnot (bez duplicit) Kartézský součin množin A a B (v tomto pořadí) A B = { x, y x A a y B} pro A = {a, b, c}, B = {1, 2}: A B = { a, 1, a, 2, b, 1, b, 2, c, 1, c, 2 } pro konečné A a B lze A B reprezentovat seznamem párů Binární relace (relace mezi dvěma množinami A a B, v tomto pořadí) libovolná (tj. jakákoliv) podmnožina A B značení: R A B Ukážeme: implementace operací s množinami a relacemi ve Scheme V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 26 / 33

Příklad (Základní konstruktory pro práci s množinami) (define the-empty-set '()) (define card (lambda (set) (length set))) (define make-set (lambda (prop? universe) (filter prop? universe))) (define cons-set (lambda (x set) (if (in? x set) set (cons x set)))) test přítomnosti prvku v množině V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 27 / 33

Příklad (Základní predikáty pro práci s množinami) (define in? (lambda (x set) (not (null? (filter (lambda (y) (equal? x y)) set))))) (define set? (lambda (elem) (and (list? elem) (forall (lambda (x) (= (occurrences x elem) 1)) elem)))) (define occurrences (lambda (elem l) (length (filter (lambda (x) (equal? x elem)) l)))) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 28 / 33

Příklad (Operace s množinami: průnik a sjednocení) A B = {x x A nebo x B} (sjednocení) A B = {x x A a x B} (průnik) (define union (lambda (set-a set-b) (list->set (append set-a set-b)))) třeba dodělat list->set (define intersection (lambda (set-a set-b) (make-set (lambda (x) (and (in? x set-a) (in? x set-b))) (union set-a set-b)))) Jak zobecnit? V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 29 / 33

Příklad (Vytváření obecných množinových operací) (define set-operation (lambda (prop) (lambda (set-a set-b) (filter (lambda (x) (prop x set-a set-b)) (list->set (append set-a set-b)))))) (define union (set-operation (lambda (x A B) (or (in? x A) (in? x B))))) (define intersection (set-operation (lambda (x A B) (and (in? x A) (in? x B))))) (define set-minus (set-operation (lambda (x A B) (and (in? x A) (not (in? x B)))))) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 30 / 33

Příklad (Konstruktory pro relace) (define make-tuple cons) (define cartesian-square (lambda (set) (apply append (map (lambda (x) (map (lambda (y) (make-tuple x y)) set)) set)))) (define make-relation (lambda (prop? universe) (filter (lambda (x) (prop? (car x) (cdr x))) (cartesian-square universe)))) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 31 / 33

Příklad (Vytváření seznamů reprezentující binární relace) (define u '(0 1 2 3 4 5)) (make-relation (lambda (x y) #f) u) = () (make-relation (lambda (x y) (= x y)) u) = ((0. 0) (1. 1) (2. 2) (3. 3) (4. 4) (5. 5)) (make-relation (lambda (x y) (= (+ x 1) y)) u) = ((0. 1) (1. 2) (2. 3) (3. 4) (4. 5)) (make-relation (lambda (x y) (= (modulo (+ x 1) (length u)) y)) u) = ((0. 1) (1. 2) (2. 3) (3. 4) (4. 5) (5. 0)) (make-relation (lambda (x y) (< x y)) u) = ((0. 1) (0. 2) (0. 3) (0. 4) (0. 5) (1. 2) (1. 3) (1. 4) (1. 5) (2. 3) (2. 4) (2. 5) (3. 4) (3. 5) (4. 5)) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 32 / 33

Příklad (Reprezentace relací: další problémy) Operace s relacemi: množinové operace (relace jsou množiny) již máme compose-relations kompozice (skládání) relací invert-relation inverze relace Vlastnosti binárních relací na množině: reflexive? test reflexivity relace symmetric? test symetrie relace transitive? test tranzitivity relace. Skripta (sekce 6.5, strany 161 167) V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška 6 33 / 33