1. cvičení 23.2.2010
- O Prologu (miniopakování z přednášky)
- Syntaxe: jednoduché a složené termy, proměnné, atomy, čísla, řetězce, struktury, seznam
- Program v Prologu: klauzule, fakta, pravidla, procedury, komentáře
- Práce s interpretem Prologu: načtení souboru do paměti pomocí consult('mujprogram.pl'), halt (konec práce), ?- (prompt), listing
- Mechanismus kladení dotazů, operátory ',' a ';'
- Anonymní proměnná, "vstupní"/"výstupní" argumenty
- ?-rodic(adam,marie). % Je marie dítětem adama? (oba argumenty jsou vstupní)
?-rodic(adam,Dite). % Kdo jsou děti adama? (první argument je vstupní, druhý výstupní)
?-rodic(X,adam). % Kdo jsou rodiče adama? (první argument je výstupní, druhý vstupní)
?-rodic(Rodic,Dite). % Vypiš všechny dvojice rodič + dítě (oba argumenty jsou výstupní) - Backtracking: jak se vyhodnocují dotazy (na příkladech)
- Jednoduché predikáty o rodinných vztazích
- popis databáze rodinných vztahů pomoci predikátů manz1(On,Ona), rodic(Rodic,Dite), muz(On), zena(Ona)
- rodic(Rodic,Dite) s fintou:
- fakta pouze pro otce:
rodic(petr,emma).
rodic(adam,petr).
... - pravidlo pro matky
rodic(Matka,Dite):- rodic(X,Dite),manz1(X,Matka). - manz(X,Y) symetricky (finta, aby se odpověď necyklila)
- a) manz(X,Y):- manz1(X,Y); manz1(Y,X).
- b) ekvivalentně
manz(X,Y):- manz1(X,Y).
manz(X,Y):- manz1(Y,X). - další predikáty o rodinných vztazích - např. bratr(Bratr,Koho), teta(Teta,Koho), dedecekzotcovystrany(Dedecek,Pravnouce)
- varianty pravidel vhodné pro různé dotazy z hlediska efektivity
- Na rozmyšlenou: tchan(Tchan,Koho), snacha(Snacha,Koho), prastryc(Prastryc,Koho) a podobně
- Obarveni mapy čtyřmi barvami
- je dána následující mapa: (na cvičení mohla být trochu jiná mapa)
- pro tuto mapu jsme definovali predikát obarvi(A,B,C,D,E), kde A,...,E jsou barvy (cervena, modra, bila, cerna) a sousedni staty nesmi byt obarveny stejně
- dvě různá řešení (jde to i bez negace)
- Modelování aritmetiky
- reprezentace přirozených čísel pomocí termů 0, s(0), s(s(0)),...
natural(0). % nula je přirozené číslo
natural(s(X)) :- natural(X). % n+1 je přirozené číslo, je-li n přirozené číslo
- lze použít pro test, zda je term přirozené číslo:
?-natural(s(pepik)).
false.
?-natural(s(s(0))).
true. - lze použít i pro generování přirozených číel:
?-natural(X).
X = 0;
X = s(0);
X = s(s(0));
...
2. cvičení 2.3.2010
- K organizaci cvičení
- Zkouškové písemky - na 8.cvičení Prolog, na 13.cvičení Haskell, více informací u přednášejících
- Zápis do grupíku - Už je možný zápis do grupíku. Prosím studenty, kteří jsou na seznamu přihlášených a budou ode mě chtít zápočet, aby se do grupíku zapsali. Část z Vás jsem už do skupiny přiřadila, ale někteří se mi v SISu nezobrazují, tak to prosím zkuste sami. Zatím je kapacita nastavena na 25 studentů, až se zaplní, ještě ji zvýším. Kdybyste měli s přihlášením do grupíku problém, zkusíme to vyřešit na příštím cvičení.
- Modelování aritmetiky pomocí termů - pokračování
- Řešení domácího úkolu - even(X), odd(X), lt(X,Y), leq(X,Y) - různá řešení, nejčastější chyby.
- Mechanismus vyhodnocení dotazu - procvičení na variantách procedury leq/2.
- Na rozmyšlenou: Je možné modifikovat leq/2 tak, aby volání leq(-X,-Y) vrátilo v konečném počtu kroků libovolnou dvojici přirozených čísel menších než n?
- add(X,Y,Z) - Z je součet přirozených čísel X a Y, různá řešení
- mul(X,Y,Z) - Z je součin přirozených čísel X a Y
- pow(X,Y,Z) - Z = X^Y
- Na rozmyšlenou: Vyzkoušejte si, pro které typy dotazů se budou procedury add/3, mul/3 a pow/3 chovat správně. Kdy se výpočet zacyklí? Zkuste různá pořadí termů v pravidlech (např. u mul/3) a všimněte si změn v odpovědích.
- Cesta v orientovaném acyklickém grafu
- Popis grafu fakty hrana(Od,Do)
- Rekurzivni predikát cesta(Od,Do) - různé varianty procedury a nebezpečí zacyklení
- Unifikační algoritmus - zopakování
- Hrátky s unifikací
- Uvažujeme následující program:
g(t(A,_),t(A,_)).
f(h(X,_),X). - Jaké budou odpovědi interpretu Prologu na následující dotazy?
?- g(X,Y).
X = t(_023,_024) , Y = t(_023,_025)
?- g(t(X,Y),Z).
X = _ , Y = _ , Z = t(X,_026)
?- g(t(a,b),Z).
Z = t(a,_027)
?- f(X,Y).
X = h(Y,_028) , Y = _
?- f(X,c).
X = h(c,_029)
?- f(X,X).
Error 7, System Stack Full, Trying vars/2
- Jednoduché predikáty pro práci se seznamy:
- prvek(X,S), je_seznam(S)
- sudy(S), lichy(S) - uspěje, je-li S seznam sudé délky / liché délky
- pridejnazacatek(Seznam,Prvek,VyslednySeznam), pridejnakonec(Seznam,Prvek,VyslednySeznam), smazprvni(Seznam,VyslednySeznam), smazposledni(Seznam,VyslednySeznam)
- Testík
3. cvičení 9.3.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- Modelování přirozených čísel pomocí termů 0, s(0), s(s(0)),...
- modulo - mod(+X,+Y,?Z), faktoriál - fact(+X,?F), Fibonacci - fib(+X,?F)
- Na rozmyšlenou: predikát pro celočíselné dělení div(+X,+Y,?Z)
- Rodina - mladsisestra/2, starsibratr/2, nejmladsisestra/2, nejstarsibratr/2 - různá řešení
- Na rozmyšlenou: další predikáty: sestry(Ci, Sestry), starsibratri(Ci,Bratri) apod.
- Cesta v orientovaném acyklickém grafu (rozšíření příkladu z minule) - cesta(+Od,+Do,-Cesta)
- Další predikáty pro práci se seznamy
- smaz(Seznam,Prvek,VyslSeznam) - smaže první výskyt prvku v seznamu, různé varianty (uspět/selhat, pokud prvek v seznamu není)
- smazvsechny(Seznam,Prvek,VyslSeznam) - smaže všechny výskyty prvku v seznamu
- spolecne(Seznam1,Seznam2,Spolecne) - společné prvky dvou seznamů, různé varianty (pomocí predikátu smaz)
- prefix(Seznam,Prefix), suffix(Seznam,Suffix)
- usek(Seznam, Usek) - pomoci prefixu a suffixu
- podseznam(+S,?PodS) - seznam PodS je podseznamem seznamu S (ve smyslu podmnožiny). Predikát postupně generuje všechny podseznamy seznamu. Například pro S=[a,b,c,d] generuje podseznamy [a,b,c,d], [b,c,d], [c,d], [d],[], [a,c,d], [a,d] atd.
- prostredni(S,X) - X je prostředním prvkem seznamu S.
- Řešení v kvadratickém čase (pomocí predikátu smazposledni)
- Řešení trikem v lineárním čase:
prostredni(+S,-X):- prostredni(+S,+S,-X).
prostredni([_],[X|_],X).
prostredni([_,_],[X|_],X).
prostredni([_,_|T1],[_|T2],X):- prostredni(T1,T2,X).
4. cvičení 16.3.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- Další predikáty pro práci se seznamy
- spoj(S1,S2,S) - seznam S je konkatenací seznamů S1 a S2
- reversespoj(S1,S2,S) - seznam S je konkatenací obráceného seznamu S1 a seznamu S2. Řešení pomocí akumulátoru.
- reverse(?S,?OS) - seznam OS vznikne otočením seznamu S. Různá řešení - elegantně pomocí reversespoj/3.
- palindrom(S) - slovo reprezentované jako seznam S, které se čte stejně popředu i pozpátku. Pomocí reverse.
- levarotace(+S,?LR), pravarotace(+S,?PR) - rotace seznamu o jeden prvek. Například, je-li S=[a,b,c,d], bude LR = [b,c,d,a] a PR = [d,a,b,c]. Různá řešení - elegantně pomocí reverse/2
- Matice
- Matice reprezentujeme jako seznamy řádků.
- Na rozmyšlenou:
prvekMatice(+M,?X) - X je prvkem matice M.
ctvercova(+M) - matice M je čtvercová.
obdelnikova(+M) - matice M je obdélníková. - transpozice(+M,-TM)- převod matice na transponovanou matici. Řešení pomocí prvnisloupec(+Matice,-PrvniSloupec,-Zbytek).
- diagonala(+M,-D) - D je hlavní diagonála matice M. Pouze myšlenka, zbylo na rozmyšlenou.
- Návody k domácím úlohám.
5. cvičení 23.3.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- pecka/3
- rotaceR/2, rotaceL/2, diagonala/2
- Matice - hrátky se spirálou:
- rozbal(+M,-S) - Bylo za domácí úkol. Do seznamu S vkládá prvky matice M tak, jak leží na spirále. Různá řešení - 4 predikáty, pomocí otočení o 90 stupňů,...
- zabal(+M,+N,+S,-Mat) - Inverzni predikat k predikatu rozbal/2. Prvky seznamu S posklada po spirale do matice Mat tvaru MxN. Řešení přímo nebo pomocí inverzní operace.
zabal(+M,+N,+Vektor,-Matice):-generujMatici(M,N,MP), rozbal(MP,VP), Vektor=VP, Matice=MP.
- Aritmetika v Prologu
- Úvod do aritmetiky - operátor is, relační operátory
- min(+X,+Y,?Min) - Min je minimum čísel X a Y
- minseznam(+S,?Min) - Min je minimální prvek seznamu S. Různá řešení - rekurzivně / iterativně za využití akumulátoru.
- minsort(+T,-ST) - T je seznam, ST je setříděný seznam T metodou přímého výběru minima. Řešení pomocí minseznam/2 a vhodného delete/3.
- kombinace(+S1,+K,-S) - Postupně backtrackingem ze seznamu S1 generuje všechny K-prvkové kombinace (podmnožiny) prvků.
- variace(+S1,+K,-S) - Postupně ze seznamu S1 generuje všechny K-prvkové variace prvků.
- vyber(+S1,+N,-S) - Vybere ze seznamu (kladných čísel) S1 prvky se součtem N do seznamu S. Funguje opakovaně díky backtrackingu. Našli jsme různá řešení.
- Některé standardní predikáty
- atom(X). X je atom
atomic(X). X je atom nebo číslo
compound(X). X je struktura
number(X). X je číslo
var(X). X je nekonkretizovaná proměnná
nonvar(X). - Sčítání, kde libovolný argument může být proměnná
scit(A, B, C) :- number(A), number(B), C is A + B.
scit(A, B, C) :- number(A), var(B), number(C), B is C - A.
scit(A, B, C) :- var(A), number(B), number(C), A is C - B. - Součtové seznamy
- Pro jaké operace se tato datová struktura hodí?
- Základní operace nad součtovými seznamy: přidej prvek na začátek, přidej prvek na konec, smazání prvku ze začátku, smazání prvku z konce, otočení, převod mezi obyčejným a součtovým seznamem
- Rozdílové seznamy - příště.
- Návody k domácím úlohám.
6. cvičení 30.3.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- nextperm/2, perminv/2, invperm/2, permcyk/2, cykperm/2, rotaceL/2, rotaceR/2
- kazdynty/3
- Rozdílové seznamy
- Popis. Pro jaké operace se tato datová struktura hodí?
- append(A-B,B-C,A-C) - vysvětlení, jak to vlastně funguje.
- quicksort(+Seznam,-RozdilovySeznam) - další využití rozdílového seznamu pro snížení časové složitosti. Bylo na přednášce.
- Operátor řezu !
- Rozdíl mezi =, ==, =:=, \=, \==, =\=
- Máme program p(1). p(2):-!. p(3). Jak bude vypadat odpověř programu na následující dotazy?
?-p(X).
?-p(X),p(Y).
?-p(X),!,p(Y).
?-p(X).
X=1;X=2
?-p(X),p(Y).
X=Y=1;
X=1,Y=2;
X=2,Y=1;
X=Y=2
?-p(X),!,p(Y).
X=Y=1;
X=1,Y=2 - Negace v Prologu pomocí operátoru řezu:
ruzne(X,Y):- X = Y,!,fail.
ruzne(_,_).
not(X):- call(X),!,fail.
not(X).
- Na rozmyšlenou: V čem spočívá problém s negací v Prologu? Není zde jistá souvislost s problémem zastavení Turingova stroje?
- Modelování if-then-else v Prologu pomocí operátoru řezu (if b then c else d):
a(X):-b(X),!,d(X).
a(X):-c(X).
- Konečný a nekonečný cyklus.
- Na rozmyšlenou: Zkuste v Prologu modelovat forcyklus.
- Práce se vstupem a výstupem
- Interakce programu s uživatelem.
- Další užitečné predikáty pro práci se seznamy
- substituce(+X,+S,+Y,-T) - Za každý prvek X v seznamu S substituuj prvek Y. Výsledek je seznam T. Různá řešení - využití operátoru řezu.
- Unární aritmetika
- [] reprezentuje 0, [1] reprezentuje 1, [1,1,1,1,1] reprezentuje 5, atd.
- soucet(+X,+Y,-S) - Sčítání v unární aritmetice pomocí konkatenace seznamů.
- soucin(+X,+Y,-S) - Násobení v unární aritmetice. Různá řešení. Hezký trik:
nasob(A,B,C):-substituce(1,A,B,S),multijoin2(S,C). - Na rozmyšlenou: predikáty pro odčítání a dělení v unární aritmetice.
- Operátor =..
- Přístup k parametrům struktury, konstrukce struktury z parametrů.
- Term =.. Seznam % Seznam = [Funktor|Argumenty]
- maplist(+Predikát,+Seznam,-Výsledek) Aplikuje Predikát/2 na každý prvek seznamu Seznam. Výsledek je výsledný seznam.
- Netihli jsme, zbylo na rozmyšlenou Definujte predikát substituce(+Term, +Co, +Cim, -VyslTerm), který provede v termu Term substituci všech podtermů Co za termy Cim. Výsledný term je VyslTerm.
7. cvičení 6.4.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- vyhodnot/3, splnitelna/1, mnozina/3
- substituce/4
- Povídání o zápočtových programech
- Podmínky, termíny.
- Různé návrhy témat. Náčrt témat navrhnutých na cvičení.
- Další zdroje možných témat: Hric, Dvořák, Barták.
- Návody k domácím úlohám.
- Operátory, které sesbírají všechny termy s nějakou vlastností
- bagof(+Term,+Cíl,-Seznam) Seznam je seznam všech instancí Termu, které splňují Cíl.
- setof(+Term,+Cíl,-Seznam) Totéž, ale Seznam je uspořádaný, bez duplicit.
- findall(+Term,+Cíl,-Seznam)
Shromáždí všechna řešení bez ohledu na volné proměnné,vždy uspěje.
hrana(a,b).
hrana(a,c).
hrana(a,d).
hrana(b,c).
?-bagof(X,trida(X,c),S). % odkud vede hrana do c?
X=_,S=[a,b].
?- bagof(op(c,X),hrana(X,c),S). % mohu vytvářet strukturu
X=_,S = [op(c,a),op(c,b)]
?- bagof(X,hrana(X,a),S). % Nesplnění cíle - neúspěch.
no
?-bagof(X,hrana(X,Y),S). % odkud vede hrana?
X = _ , Y = b ,S = [a] ;
X = _ , Y = c ,S = [a,b] ;
X = _ , Y = d , S = [a] ;
?- findall(X,hrana(X,Y),S). % odkud vede hrana?
X = _ , Y = _ , S = [a,a,b,a]
- Stromy
- Různé reprezentace. Binární stromy (z přednášky). Binární vyhledávací stromy.
- Reprezentace obecného stromu pomocí binárního.
- Vrstevnatý výpis stromu.
8. cvičení 13.4.2010
- Operátor name
- name(?Atom,?Seznam) Převod atomu na řetězec a nebo zpět. Řetězec v Prologu je reprezentován jako seznam ASCII kódů písmen.
- spoj_termy(+T1, +T2, -T) Spojení termů a(a1,...,aN), b(b1,...,bM) -> ab(a1,...aN,b1,...,bM).
- Stromy
- Vrstevnatý výpis binárního stromu.
- Vrstevnatý výpis obecného stromu.
- Dokonale vyvážený binarní vyhledávací strom.
- postav(+RostSez,-Strom) - různá řešení
- postav(+RostSez,-Strom) - efektivně bez dělení seznamů s využitím akumulátoru - postav(+N,+RostSez,-Strom,-Zbytek)
- Reprezentace binárního vyhledávacího stromu seznamem seznamů. Uzel je seznam [H,L,P]. List je seznam [H,_,_]. Definovali jsme predikát insert(+X,+Strom,-VyslednyStrom).
- Definice stromu pomocí binárních operátorů (např. T=(a+b)-(c+(d*e))). Prvky jsou uloženy v listech stromu. Definovali jsme predikát member(+X,+Strom).
- Na rozmyšlenou: Výpis stromu (definovaného pomocí binárních operátorů) do seznamu. Různá řešení, využití akumulátoru místo zřetězení.
- Adventure hry
- Vajíčka, slepice, liška
- Stavový prostor
- Dynamické predikáty, assert, retract
9. cvičení 13.4.2010
- Řešení úloh z domácího úkolu a úloh z dněšního testíku
- mobily - ekvivalelntni
- cesta v grafu
- Lisp - SCHEME
- Syntaxe LISPu. Základní formy ve SCHEME. Definice funkcí.
- Definovali jsme jednoduché funkce:
- Výpočet faktroriálu.
- Výpočet n-tého fibonacciho čísla. Více variant.
- Výpočet délky seznamu.
- Konkatenace dvou seznamů.
- Na rozmyšlenou: Otočení seznamu pomocí akumulátoru.
- Definovali jsme funkci (map f s), která má jako parametry funkci f (f je funkce s jedním parametrem) a seznam s. Funkce map aplikuje funkci f na každý prvek seznamu s a vrátí výsledný seznam.
( define (map f s) ( if (null? s) nil ( cons (f ( car s)) (map f (cdr s))))) - Definovali jsme funkci (app f g s), která má jako parametry seznam s, funkci g (g je funkce s jedním parametrem) a funkci f (f je funkce se dvěma parametry). Funkce app aplikuje funkci g na poslední prvek seznamu s a funkci f rekurzivně na další prvek seznamu a zbytek ("to, co přišlo z rekurze"). Například pro seznam (list 1 2) funkce app spočte ( f 1 (g 2)), pro seznam (list 1 2 3 4) funkce app spočte ( f 1 ( f 2 ( f 3 (g 4)))). ( define (app f g s) ( if (null? (cdr s)) ( g (car s) ) ( f (car s) ( app f g (cdr s) ))))
- Inkrementace všech prvků seznamu pomocí funkce map.
- Výpočet délky seznamu, součinu prvků v seznamu a minimálního prvku seznamu pomocí funkce app.
- Binární stromy v LISPu:
( define (tree V L R) (list V L R)) ( define (emptyT) nil) ( define (value s) (car s)) ( define (left s) (cadr s)) ( define (right s) (caddr s)) - Na rozmyšlenou (nestihli jsme): Binární vyhledávací stromy - základní operace (zde snažší než v Prologu)
- Na rozmyšlenou Závěsný prostorový mobil (bylo za domácí úkol v Prologu, zde by bylo snažší).
10. cvičení 27.4.2010
- Rozbor řešení úloh z domácího úkolu a testíku
- appTree, insertSort
- cesta v grafu - nevhodné použití řezu
- HASKELL - úvod
- Práce s interpretem.
- Definice funkcí (včetně typové signatury), funkce více proměnných, curryfikace, lambda funkce a anonymní proměnné. Základní definované typy.
- Jednoduché funkce - součet pětkrát jinak. Výpočet faktoriálu.
- Funkce vs. operátory. Prefixový a infixový zápis. Základní definované aritmetické a relační operátory. Booleovské operace. Definice vlastního operátoru na příkladu (&&).
- Základní vzory (patterns) na jednoduchých příkladech - stráže, let, where, if, case, @, chybové hlášky (definice vlastních)
- Jednoduché funkce - signum třikrát jinak, výpočet největšího společného dělitele, krácení čísel,...
- Seznamy vs. ntice. Standardně definovné funkce pro práci se seznamy: ++, !!, head, tail, null, length, fst, snd...
- Definovali jsme některé základní funkce nad seznamy - head, length, take (vezme prvních n prvků seznamu), map, lshift, takeMap.
11. cvičení 4.5.2010
- Rozbor řešení úloh z testíku
- Definovali jsme standartní funkci takeWhile, která je obdobou while cyklu (dokud prvky splňují podmínku, dávej je do výsledného seznamu).
takeWhile :: (a -> Bool) -> [a] -> [a] - Pomocí takeWhile jsme definovali funkci kladny, která vrátí kladný prefix seznamu.
kladny :: [Int] -> [Int]
kladny = takeWhile (>0)
- Definovali jsme standartní funkci filter, která vloží do výsledného seznamu jen ty prvky původního seznamu, které splňují podmínku.
filter :: (a -> Bool) -> [a] -> [a] - Pomocí filter jsme definovali funkci kladny1, která vrátí všechny kladné prvky seznamu.
kladny1 :: [Int] -> [Int]
kladny1 = filter (>0)
- Seznamy - pokračování
- Standardní funkce nad seznamy v souboru standard.pre (Prelude.hs): head, tail, null, length, ++, !!, take, map, drop (viz. minule)
- Pomocí filter jsme definovali třídící funkci quicksort.
qsort :: [Int] -> [Int]
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ x: qsort (filter (>= x) xs)
- Definovali jsme standartní funkci zip, která má na vstupu dva seznamy a vloží do výsledného seznamu dvojice prvků (zbytek delšího ze seznamů zahodí).
zip :: [a] -> [b] -> [(a,b)] - Rozsahy, generování (nekonečných) seznamů.
- Nekonečné seznamy - nekonečný seznam nul, nekoněčný seznam přirozených čísel pětkrát jinak, mocniny,...
- Kartézský součin seznamů - rozdíl mezi [(x,y) | (x,y) <- zip s t ] a [(x,y) | x <-s, y <-t ]
- Kartézský součin přirozených čísel - generování po diagonálách
- Pomocí zip jsme definovali Fibonacciho posloupnost.
fibon :: [Integer]
fibon = 0:1: [x+y | (x,y) <- zip fibon (tail fibon) ] - Definovali jsme standartní funkci zipWith, která funguje jako zip, ale aplikuje funkci na výslednou dvojici.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] - Pomocí zipWith jsme definovali funkci soucetVektoru, která sečte dva celočíselné seznamy.
soucetVektoru :: [Integer] -> [Integer] -> [Integer]
soucetVektoru = zipWith (+) - Definovali jsme standartní funkci flip, která prohodí parametry funkce.
flip :: (a -> b -> c) -> b -> a -> c
flip f y x = f x y
> zipWith (flip' div) [2,2..] [10,8,6,4,2]
[5,4,3,2,1] - Standardní funkce foldl a foldr - definice zbyla na rozmyšlenou.
- Pomocí funkcí foldl/foldr jsme definovali funkce pro součet a součin prvků seznamu, skalární součin prvků seznamu a otočení seznamu.
- Hornerovo schéma pomocí foldl.
- Na rozmyšlenou: Eratosthenovo síto pro generování prvočísel ("na jeden řádek").
- Matice jako seznamy seznamů
- Definovali jsme funkci unitMat, která vytvoří jednotkovou matici jako nekonečnou datovou strukturu. unitMat :: [[Int]]
12. cvičení 11.5.2010
- Definovali jsme funkci pro generování prvočísel. Různá řešení - Eratosthénovo síto. prvocisla :: [Integer]
- Matice jako seznamy seznamů - pokračování
- Definovali jsme funkci digMat, která vytvoří (potenciálně nekonečnou) matici s danou diagonálou. digMat :: Int -> [[Int]]
- Definovali jsme funkci vynasobSkalarem, která vynásobí matici skalárem. vynasobSkalarem :: Num a => a -> [[a]] -> [[a]] vynasobSkalarem x = map ( map (*x))
- Definovali jsme funkci soucetMatic, která sečte dvě matice stejných rozměrů. soucetMatic :: Num a => [[a]] -> [[a]] -> [[a]] soucetMatic = zipWith (zipWith (+))
- Definovali jsme funkci transponuj, která transponuje matici (pomocí zipWith). transponuj :: [[a]] -> [[a]]
- Definovali jsme funkci podmatice x1 x2 y1 y2, která z matice vybere podmatici s danými souřadnicemi levého horního a pravého dolního rohu (pomocí map, take a drop).
- Nekonečná posloupnost
- Definovali jsme funkci posl, která vytvoří nekonečnou upořádanou posloupnost se členy 2^i*3^j*5^k pro přirozená čísla i,j,k. posl ::[Int] Různé varianty pomocí merge.
- Na rozmyšlenou: Zobecnění pro seznam čísel.
- Třídy typů
- Základní třídy typů a operace na nich (na příkladech)
- Definice vlastních typů a tříd (na příkladech).
13. cvičení 18.5.2010
- Mocninné řady - zadání
- Různá řešení.
- Třídy typů - pokračování
- Definice vlastních tříd jako instancí typů (na příkladech).
- Definovali jsme datový typ Zlomek jako instanci třídy Eq.
- Pole v Haskellu.
- Fibonacciho posloupnost.
- Malá násobilka.
- Dva větší příklady na dynamické programování - kostičky a mřížka.