Cvičení z Neprocedurálního programování
V letním semestru 2020/2021 vedu cvičení z předmětu Neprocedurální programování [NPRG005] každý čtvrtek od 9:00 (v SU2 dá-li situace, jinak online).
Počítejte s možností, že se cvičení při lepší situaci může přepnout do prezenční formy!
Na dálková cvičení budeme používat Zoom, odkaz dostanete emailem na adresu, kterou máte nastavenou v SISu týden před začátkem semestru. Pokud odkaz nemáte, napište mi email!
Máte-li nějaký dotaz, či chcete-li si domluvit konzultaci, napište mi prosím email na adresu jiribenes+neproc@kam.mff.cuni.cz.
Podmínky zápočtu
Na získání zápočtu je potřeba:
- zápočtový program
- alespoň 100 bodů z úkolů, alespoň 50 bodů z každého jazyku (Prolog, Haskell)
Pozor, že na zkoušku je doporučeno mít hotový zápočet, tedy je vhodné mít všechno vyřešené včas!
Zápočtový program
Součástí požadavků na zápočet je i vytvoření zápočtového programu.
Není potřeba, aby byl program přehnaně obsáhlý – stačí ukázat, že chápete logické/funkcionální programování a dokážete jej vhodně aplikovat. Stačí řádově sto řádků hezkého a efektivního kódu.
Prolog je obzvláště vhodný na umělou inteligenci a řešení hlavolamů. Haskell je vhodný hlavně na parsery, formátovače, překladače, interpretery, programy zpracovající data a tak podobně. Dá se v něm ale naprogramovat skoro vše kromě low-level programů.
Má oblíbená témata souvisí s programovacími jazyky — parsery, malé homemade programovací jazyky, type checkery, statické analyzátory (prográmky, které řeknou něco chytrého o kódu), interpretery, maličkaté virtuální stroje a tak podobně. Sepsal jsem seznam zajímavých témat pro inspiraci zde.
Deadliny
- Téma zápočťáku musí být odesláno emailem do neděle 16. 5. 23:59:59.
- Hotový zápočťák musí být odevzdán emailem do neděle 20. 6. 23:59:59.
Individuálně se dá domluvit posunutí deadlinu, ale pouze před tím, než na daný deadline doopravdy dojde! Varuji ale, že může dojít k udělení zápočtu třeba i s dvou- až tří-týdenním zpožděním!
Domácí úkoly
Na konci zhruba každého druhého cvičení bude zadán domácí úkol. Bude možné získat aspoň 160 bodů za domácí úkoly celkem a aspoň 80 bodů z každého jazyku celkem. Každý úkol lze řešit dva týdny od cvičení, na kterém byl úkol zadán.
Řešení domácích úkolů mi posílejte emailem na adresu jiribenes+neproc@kam.mff.cuni.cz.
K prvnímu úkolu mi napište i přezdívku (zapsatelnou Unicodem), abych mohl na stránce zveřejnit počet získaných bodů.
Bonusové body
Za aktivitu a bonusové úkoly půjdou získat bonusové body, které se přičítají k bodům z úkolů.
Co se dělalo na cvičení
- 1. cvičení (4. 3.) – Prolog jako databáze faktů, prohledávání do hloubky
- 2. cvičení (11. 3.) – Složené termy, unifikace, seznamy, zadán 1. úkol
- 3. cvičení (18. 3.) – Procvičování seznamů v Prologu, akumulátory, aritmetika
- 4. cvičení (25. 3.) – Řezy všech druhů, třídění, higher-order funkce, zadán 2. úkol
- 5. cvičení (1. 4.) – Rozdílové seznamy, stromy, DFS a iterativní prohlubování
- 6. cvičení (8. 4.) – DCG pro JSON a aritmetické výrazy, lambda kalkul, zadán 3. úkol
- 7. cvičení (15. 4.) – Úvod do Haskellu, částečná aplikace, úvod do typů
- 8. cvičení (22. 4.) – Algebraické datové typy, seznamy, parametrické typy, zadán 4. úkol
- 9. cvičení (29. 4.) – Líné vyhodnocování, nekonečné seznamy, foldy
- 10. cvičení (6. 5.) – Další foldy, Maybe, typové třídy Eq, Show, Num, zadán 5. úkol
- 11. cvičení (13. 5.) – Typové třídy Semigroup, Monoid a Functor, druhy
- 12. cvičení (20. 5. - 22. 5.) – Monády, do-notace, stavové výpočty, zadán 6. úkol
- 13. cvičení (27. 5.) – IO monáda, monadický parser, o víkendu byl zadán 7. úkol
- 14. cvičení (3. 6.) – Curry-Howardova korespondence, opakování
Tabulka s body
Pokud nejste v tabulce, nemám vaši přezdívku.Přezdívka | Bonus | Domácí úkoly | Zápočťák | Celkem | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Prolog | Haskell | |||||||||||
1 | 2 | 3 | ∑ | 4 | 5 | 6 | 7 | ∑ | ||||
Alonzo Church | 25 | 30 | 25 | 80 | 15 | 21 | 30 | 15 | 81 | OK | 161 | |
Dvou-třetiňák | 16.75 | 20 | 16.75 | 53.5 | 10 | 14 | 20 | 10 | 54 | 107.5 | ||
brot | 25 | 25 | 30 | 25 | 80 | 15 | 21 | 30 | 66 | OK | 171 | |
Reni | 10 | 25 | 20 | 25 | 70 | 15 | 27 | 42 | OK | 132 | ||
Miska | 35 | 25 | 24 | 25 | 74 | 15 | 19 | 34 | OK | 178 | ||
Mopiru | 1 | 25 | 30 | 55 | 15 | 21 | 30 | 66 | OK | 122 | ||
Matus | 8 | 25 | 30 | 55 | 15 | 21 | 27.5 | 63.5 | OK | 126.5 | ||
bug | 4.5 | 25 | 30 | 20 | 75 | 15 | 21 | 30 | 66 | OK | 145.5 | |
Yongaron | 8 | 25 | 30 | 25 | 80 | 15 | 21 | 30 | 66 | OK | 154 | |
Čupera | 5 | 25 | 28 | 53 | 15 | 21 | 14 | 50 | OK | 108 | ||
Railgun | 12 | 25 | 30 | 25 | 80 | 15 | 21 | 30 | 66 | OK | 158 | |
﷽ | 5 | 25 | 30 | 25 | 80 | 21 | 30 | 51 | OK | 136 | ||
tlapik | 3 | 25 | 29 | 54 | 15 | 21 | 30 | 66 | 123 | |||
Marky | 0.5 | 25 | 30 | 55 | 15 | 21 | 20 | 56 | 111.5 | |||
Lidl | 3 | 25 | 30 | 25 | 80 | 15 | 21 | 30 | 66 | OK | 149 | |
diskretak | 15 | 21 | 23 | 44 | 12 | 16 | 15 | 43 | 117 | |||
Vojta_024 | 3 | 28 | 25 | 53 | 15 | 12 | 21.5 | 48.5 | 107.5 | |||
MaF | 6 | 25 | 25 | 50 | 15 | 21 | 30 | 66 | OK | 122 | ||
Anička | 3.5 | 20 | 28 | 48 | 15 | 20 | 13.75 | 48.75 | OK | 103.75 |
Užitečné odkazy
- Prolog
- SWI-Prolog je nejpoužívanější Prologové prostředí s použitelným IDEčkem
- Learn Prolog Now je hezká kniha bohatě pokrývající celý Prolog
- A Practo-Theoretical Introduction to Logic Programming je hezký článek porovnávající Prolog a SQL
- 99 Prologových problémů s řešeními mohou sloužit jako dobrá cvičení, pokud si chcete Prolog pocvičit sami
- Style guide pro Prolog, abyste věděli, jak kód formátovat a jak psát komentáře
- Haskell
- GHCup je nejjednodušší způsob jak si nainstalovat Haskell lokálně
- Hoogle je úžasný vyhledávač funkcí dle jejich názvů a typů
- Haskell Language Server je takové IDE pro Haskell – hezky to funguje s Vimem, či s Visual Studio Code
- Learn You A Haskell for Great Good je hezká, barvená kniha popisující základy Haskellu
- Real World Haskell je starší kniha o tom, jak se Haskell reálně používá
- Záznamy z kurzu Haskellu od prof. Huttona jsou velmi kvalitním úvodem do funkcionálního programování
- Záznamy z pokročilého kurzu Haskellu od prof. Huttona jsou pokračování výše uvedeného zaměřené na monády a další pokročilejší featury jazyka
- Navazující předmět Programování v Haskellu má hezké slajdy s detailnějšími informacemi o Haskellu
- Jiná cvičení:
- Obecné:
- Lambdulus je hezké prostředí pro hrátky s lambda kalkulem
- Na cvičení používáme editor Icing, který je napsaný v Haskellu
- Jak nastavit Zoom Virtual Background, abyste vypadali cool při cvičení ;)
- Exercism.io je platforma, kde můžete řešit praktičtější úkoly v různých jazycích (podporují právě i Haskell) s tím, že vám nějaký mentor váš kód zkritizuje