Cvičení z Neprocedurálního programování
V letním semestru 2021/2022 vedu cvičení z předmětu Neprocedurální programování [NPRG005] každý čtvrtek od 9:00 v SU2.
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ň 45 bodů z každého jazyku (Prolog, Haskell)
Pozor, že pro přihlášení ke zkoušce 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 15. 5. 23:59:59.
- Hotový zápočťák musí být odevzdán emailem do neděle 26. 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 z ReCodExu 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í (17. 2.) – Prolog jako databáze faktů, prohledávání do hloubky
- 2. cvičení (24. 2.) – Složené termy, unifikace, seznamy; byl zadán 1. úkol
- 3. cvičení (3. 3.) – Procvičování seznamů, akumulátory, aritmetika
- 4. cvičení (10. 3.) – Řezy, třídění, higher-order funkce; byl zadán 2. úkol
- 5. cvičení (17. 3.) – Rozdílové seznamy, stromy, DFS a iterativní prohlubování
- 6. cvičení (24. 3.) – Parsování pomocí DCG, lambda kalkul; byl zadán 3.úkol
- 7. cvičení (31. 3.) – Úvod do Haskellu, částečná aplikace, základní typy, součtové typy
- 8. cvičení (7. 4.) – Algebraické datové typy, parametrické typy; byl zadán 4. úkol
- 9. cvičení (14. 4.) – Líné vyhodnocování, nekonečné seznamy, list comprehension
- 10. cvičení (21. 4.) – Maybe, foldr, foldl, eliminace typů; byl zadán 5. úkol
- 11. cvičení (28. 4.) – Tečka a dolar, typové třídy
Eq
,Ord
,Show
,Semigroup
,Monoid
- 12. cvičení (5. 5.) – Funktory, monády,
do
-notace; byl zadán 6. úkol - 13. cvičení (12. 5.) – Stavové výpočty, vstup a výstup, monadický parser; byl zadán 7. úkol
- 14. cvičení (19. 5.) – Curry-Howardova korespondence, hromadné 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 | 21 | 32 | 27 | 80 | 18 | 21 | 27 | 21 | 87 | 167 | |||
Dvou-třetiňák | 14 | 21.5 | 18 | 53.5 | 12 | 14 | 18 | 14 | 58 | OK | 111.5 | ||
Mohy | 4 | 20 | 32 | 52 | 18 | 21 | 27 | 21 | 87 | 3 | OK | 146 | |
Dia | 3 | 21 | 25 | 46 | 18 | 21 | 11 | 50 | 1 | OK | 100 | ||
ᴇ ᴄᴏʀᴘ | 8.25 | 21 | 21 | 12 | 12 | 3 | 44.25 | ||||||
rose | 12.5 | 21 | 32 | 22 | 75 | 18 | 21 | 26 | 65 | 13 | OK | 165.5 | |
Kyberšutr | 5 | 21 | 32 | 20 | 73 | 18 | 20.75 | 25 | 63.75 | 4 | OK | 145.75 | |
Ender | 10 | 21 | 32 | 53 | 18 | 21 | 27 | 21 | 87 | 5 | OK | 155 | |
tlapik | 1 | 21 | 32 | 27 | 80 | 18 | 21 | 27 | 66 | 5 | OK | 152 | |
invoker | 0.5 | 21 | 32 | 53 | 18 | 21 | 21 | 60 | 1 | OK | 114.5 | ||
pheeck | 13.5 | 21 | 32 | 27 | 80 | 18 | 21 | 27 | 21 | 87 | 7 | OK | 187.5 |
sillyboyblue | 0.5 | 21 | 32 | 53 | 18 | 27 | 45 | 3 | OK | 101.5 | |||
Richard | 0.5 | 21 | 32 | 53 | 17 | 20.5 | 12 | 49.5 | 1 | OK | 104 | ||
hynky | 6 | 21 | 31 | 52 | 18 | 21 | 27 | 66 | 4 | OK | 128 | ||
FM | 1 | 21 | 32 | 53 | 18 | 20.5 | 11 | 49.5 | 7 | OK | 110.5 | ||
lul | 0.75 | 21 | 30.5 | 27 | 78.5 | 18 | 21 | 27 | 66 | 1 | OK | 146.25 | |
woq | 8 | 21 | 32 | 53 | 18 | 21 | 17 | 56 | OK | 117 | |||
Procyon | 1.5 | 21 | 21 | 18 | 18 | 1 | 41.5 | ||||||
Saril | 7.5 | 21 | 32 | 23 | 76 | 18 | 21 | 26 | 21 | 86 | 1 | 170.5 | |
oisho | 21 | 32 | 53 | 18 | 21 | 39 | 1 | 93 | |||||
dz | 0.25 | 21 | 32 | 53 | 18 | 20.5 | 17 | 55.5 | 1 | OK | 109.75 | ||
krevetka | 21 | 31 | 52 | 17 | 19 | 22.5 | 58.5 | 3 | OK | 113.5 | |||
qwer | 19 | 12 | 27 | 58 | 18 | 27 | 45 | OK | 103 |
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; pozor, že jde velmi pomalu a neobsahuje moc cvičení
- Learn Haskell by building a blog generator je nová online kniha, která čtenáře učí Haskell tvorbou statického generátoru pro blog; obzvlášť vhodná pokud se chcete naučit Haskell prakticky
- 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í: