Základní kurs neprocedurálního programování pro studenty informatiky.
Můžete si vybrat kteroukoli paralelku, není však rozumné je střídat
můj seminář rozvržen pátek 9:00 S10
na semináře se můžete přihlašovat pomocí SISu, bude ale omezena maximální velikost skupiny
Ukázalo se však, že současné provedení SISu není použitelné (vypadá to tak, že v první týdnu se můžete zapsat jen na své cvičení a od druhého týdna na kterékoli).
Proto vyhlašuji toto pravidlo:
Každý student má právo chodit na cvičení s kroužkem, do které byl zařazen. Musí ho uplatnit - alespoň emailem cvičícímu v druhém týdnu výuky.
Od třetího týdne výuky může cvičící dovolit i "přespolním", aby chodili na jeho cvičení, pokud ale počet účastníků nepřesáhne 20 (tato konstanta může být v případě nutnosti o málo zvýšena).
Smyslem je, aby vnevznikaly ani moc malé ani moc velké skupiny.
Pravidlo není samoúčelné a pokud bude v konkrétním případě v rozporu se zdravým rozumem, může být porušeno
Semináře začnou druhý týden výuky.
Obsah a cíle předmětu
Úkolem předmětu je seznámit studenty s ideami neprocedurálního programování
a vybavit je základními programovacími technikami logického a funkcionálního programování.
Přednáška má tři hlavní části:
- První část přednášky je věnována programování v jazyce Prolog.
V Prologu se také vytvářejí a ladí zápočtové úlohy.
- V druhé (velmi krátké) části přednášky se seznámíme se základy funkcionálního programování na bázi jazyka LISP.
V seminářích (jednom nebo dvou) se přesvědčíte, že řadu obratů, které jste si osvojili v Prologu,
velmi snadno přenesete do programování v LISPu.
Cílem této části je připravit půdu pro třetí část přednášky, LISP se u zkoušky nevyžaduje.
- Poslední část přednášky je věnována výkladu funkcionálního programování na bázi jazyka Haskell.
Nepůjdeme do teoterických detailů jazyka, ale soustředíme se spíše na praktické programování v něm.
Podmínky pro získání zápočtu
Student může získat zápočet za splnění dvou požadavků :
- Aktivní účast na seminářích a průběžné znalosti během semestru.
- Vytvoření a odladění zápočtového programu v Prologu.
K zápočtovému programu je potřeba vytvořit smysluplnou dokumentaci.
Součástí předávaného programu musí být i zkušební ladící data. Jejich volba je součástí toho, co se na programu hodnotí.
Získání zápočtu je podmínkou připuštění ke zkoušce.
Vzhledem k množství studentů nebude umožněno se ke zkoušce přihlásit dokud nebudete mít zápočet. Není to však prakticky žádné omezení. Jazyk Prolog se úplně probere na 5-7 prvních přednáškách.
Podmínky pro udělení zápočtu upřesňuje a kontroluje vedoucí semináře, na který student chodí.
Při přebírání zápočtového programu se zpravidla vhodným způsobem přesvědčí zda student program vytvořil sám
(např. může požadovat provedení drobných změn v programu v reálném čase).
Pokud student (kombinovaného) studia nemůže semináře navštěvovat,
dohodne si začátkem semestru náhradní podmínky udělení zápočtu s přednášejícím.
Literatura:
Základní literatura (bude ještě doplněna):
-
Rudolf Kryl: Úvod do programovacího jazyka Prolog
učební text - ke stažení z WWW stránek přednášejícího aktuální verze 3.03
ve formátu pdf nebo zip.
Text byl původně napsán pro čtenáře s o poznání menší programátorskou erudicí, než má většina z Vás.
Proto by mělo jít o "nenáročné čtení před usnutím". Text pokrývá přibližně první polovinu látky z Prologu.
Obsahuje řadu jednoduchých programů.
Budu vděčný za připomínky a opravy chyb - posílejte je na můj mail a v subjectu uveďte název textu a číslo verze, ke které se připomínky vztahují.
-
Přehled předdefinovaných forem ve vykládaném dialektu LISPu
Ke stažení ve formátu pdf
-
ke stažení z www.haskell.org
Poměrně čtivý základní text o programovacím jazyku Haskell. Pokrývá vše z jazyka, co probereme.
Některé partie vynecháme, půjdeme však podstatně dál v programátorské obtížnosti úloh.
Na dané adrese můžete získat úplný přehled o problematice jazyka Haskell.
Doplňková literatura (není nutná)
-
P.Jirků a kol. : Programování v jazyku Prolog
SNTL 1991
Pěkná knížka v češtině. Neobsahuje mnoho těžších příkladů, věnuje se však dost podrobně souvislostem s logikou.
-
Bratko I.: PROLOG Programming for Artificial Intelligence
Addison-Wesley, Reading, Massachussets, 1986 ISBN 0-201-14224-4
Stále velmi pěkná knížka. První díl obsahuje výklad Prologu (náš přístup k výkladu je do značné míry poplatný přístupu této knihy),
druhý obsahuje výklad některých základních partií umělé inteligence pomocí programů v Prologu.
-
Harold Abelson, Gerald Jay Sussman, Julie Sussman : Structure and Interpretation of Computer Programs
Mc Graw-Hill Book Company 1985 ISBN 0-07-000-422-6
Výklad principů programování na bázi jazyka XSCHEME (dialekt jazyka LISP). Kniha byla používána v základnídním kursu programování na MIT.
My použijeme tohoto jazyka i příkladů z této knihy k velmi zběžnému seznámení s principy LISPu.
-
Ivan Kalaš : Iné programovanie - stretnutie s jazykom Lisp
Alfa 1992
Krásná kniha s množství originálních příkladů. Uživaný dialekt LISPu se poněkud liší od toho, se kterým budeme pracovat na přednášce my.
Překladač prologu SWI
K ladění zápočtových programů a experimentům v Prologu doporučuji překladač
SWI Prolog. Jde o volně stažitelný výborný překladač,
který je k dispozici pro všechny platformy. Obecně lze experimenty s jazykem vřele doporučit,
možná však je dobré počkat až z přednášky a seminářů ovládnete základy jazyka. Na třetí nebo na čtvrté přednášce
si o práci s tímto překladačem řekneme více.
Informace o zkoušce
Nutnou podmínkou připuštění ke zkoušce je předchozí získání zápočtu.
Ke zkoušce se studenti přihlašují v SISu.
Ke zkoušce se můžete přihlásit jen když již máte zápočet udělen (t.j. zapsán v SISu).
Pokud je volná kapacita může zkoušku skládat i ten, kdo nebyl přihlášen.
V den a v hodinu uvedenou v systému SIS se píše písemná část zkoušky. Po jejím zkoušení bude vypsán rozpis podle, kterého budou studenti skládat část ústní. Z pravidla to bude týž den odpoledne nebo druhý den. Pokud bude termín plně obsazen, může se ústní zkouška i v některém z dalších dnů.
Je žádoucí absolvovat první (a v optimálním případě i poslední) termín do prázdnin. V září budu zkoušet, ale nemusí se Vám podařit abslvovat tři pokusy (a pokud se většina bude chovat nerozumně, pak třeba ani dva).
Požadavky ke zkoušce
Budou upřesněny
Zkouška má písemnou a ústní část, větší váhu má část písemná.
Písemná část
se skládá ze dvou částí:
Technická - čas 90-120 minut (bude ještě upřesněno)
Bude obsahovat (algoritmicky) jednoduché úlohy na programování v Prologu a Haskellu.
Programátorská - 90 minut
Úkolem bude vyřešit v Haskellu středně obtížnou úlohu, požaduje se volba vhodných datových struktur, rozumného algoritmu a vytvoření odpovídajícího kódu v Haskellu.
Složitost zvoleného algoritmu nemusí být optimální, ale nesmí být neúnosně velká.
Haskell je pro tuto část předepsán proto, že naprostá většina studentů řeší zápočtovou úlohu v Prologu.
Součástí řešení úloh v písemné části nemusí být vstup a výstup, ale "jen" algorimická část řešení.
U všech funkcí v Haskellu je napsat jejich typovou specifikaci.
Není nutné znát předdefinované funkce v Haskellu, ale pokud je budete používat je nutné je naprogramovat,
Je nutné (alespoň pasivně) znát základní konstrukce pro definování typů, funkcí a tříd v Haskellu,
abyste byli schopni odpovídat na otázky typu "co dělá tato funkce" resp. " je daná definice dobře?" a pod.
V obou částech písemné práce se požadují taková řešení, která vycházení z principů neprocedurálního programování, za správná nebudou uznána taková, která jsou založena tom, jak tyto principy obejít.
Ústní část zkoušky se skládá
- ze společné (zkoušející a zkoušený) opravy písemné části a diskuse nad vytvořenými programy
- ze zodpovězení otázek z některého z dále uvedených témat
Témata pro ústní zkoušku - mohou se ještě změnit :
- PROLOG
- Tvar programu v Prologu a jeho interpretace
- Deklarativní a operační sémantika programu v Prologu
- Operátor řezu
- Negace
- Edinbugrský model vstupu a výstupu.
- Definování a použití operátorů
- Predikáty pro řízení databáze (assert,...)
- Predikáty grupování termů (bagof, setof) a jejich užití
- Neúplně definované datové struktury, rozdílové seznamy
- Efektivita programů v Prologu
- HASKELL
- Typy v Haskellu, typová specifikace funkce
- Sémantika "mečování" parametrů: proměnné, datové konsruktory, as patterns ( @s ), žolíky ( _ ), lazy-parametry ( ˜x ), aritmetické parametry.
- Lazy vyhodnocování, "nekonečné" termy, funkce v Haskellu nejsou striktní.
- Lambda abstrakce.
- Třídy, podtřídy, instance.
- Moduly, abstraktní typy dat
- Pole v Haskellu.
- Principy I-O operací, monáda IO
- Pojem monády, příklady konkrétních monád.