PRG005 Neprocedurální programování
Co bylo na přednáškách - paralelka X úterý 17:20 S3
Hromadná konzultace k předmětu PRG005 se koná v úterý 16.ledna 2007 od 8:15 v posluchárně S9.
pokud alespoň trochu můžete, choďte raději na přednášku v pátek,
v úterý nebylo dost míst ani ke stání
Cvičení začínají druhý týden výuky
Věnujte pozornosti vyhlášce o rozdělení studentů do skupin na semináře
- přednáška 3.října
- přednáška 10.října
- přednáška 17.října
- přednáška 24.října
- přednáška 31.října
- přednáška 7.listopadu
- přednáška 14.listopadu
- přednáška 21.listopadu
- přednáška 28.listopadu
- přednáška 5.prosince
- přednáška 12.prosince
- přednáška 19.prosince
- přednáška 9.ledna
- přednáška 3.října
- O předmětu, zkoušce a zápočtech, literatura
- Neprocedurální programování, logické programování, funkcionální programování.
- Příklad programu popisujícího rodinné vztahy a práce s ním.
Dotazy, proměnné, anonymní proměnná.
Fakta, pravidla, klausule
- Definice seznamu, syntaktické konvence zápisu.
- Jednoduché predikáty pro práci se seznamy.
- prvek(Co, Ceho).
- prvníPrvek(Co, Ceho).
- posledniPrvek(Co,Ceho)
- spojování seznamu conc(Zacatek,Konec,Spojeni)
- prvek pomocí conc
- permutace(Seznam,PermutovanySeznam)
- Rozmyslet:
- sestavte predikát prostredni(Co,Ceho)
"Co je prostrední prvek seznamu Ceho"
seznam liché délky má jeden prostřední prvek, seznam sudé délky dva
nemáme k dispozici aritmetiku
- přednáška 10.října
- Syntaxe Prologu (proměnné, atomy, řetězce, struktury, klausule, fakty, pravidla, procedury, ... ).
- operátor středník
- Unifikace, příklady
- Algoritmus interpretu Prologu (unifikace + backtracking).
- Hledání prostředního prvku:
- ukousáváním zpředu a ze zadu - jen idea zkuste sami
- hledání seznamu poloviční délky a následné umazaní vhodného počtu prvků
- rozdělení seznamu na prvním a druhou polovinu pomocí současného ukousávaní dvou a jednoho prvku
ze dvou exemplářů původního seznamu
- otáčení seznamu v kvadratickém čase
- reverse-append otáčení v lineárním čase - idea akumulátoru
- matice jako seznamy řádkových seznamů
- diag(+CtvercovaMatice, -Diagonala)
- rozmyslet
- test zda matice je obdélniková
- test zda matice je čtvercová
- otáčení matice o 90 stupňů
- přednáška 17.října
- permutace(Seznam,PermutovanySeznam)
- Aritmetika, predikát is,
aritmetické relace =:= , =/= , ‹ , › , ‹= , ›=
- Jednoduché aritmetické predikáty
největší společný dělitel dvou čísel, délka seznamu
- následující permutace v lexikografickém uspořádání
- Binární stromy
prázdný strom - atom nil, neprázdný struktura - t(L,V,R), kde V je kořen, L levý a R pravý podstrom
- predikát prvekstromu(Co, Vcem)
- zviditelnění stromu pomocí indentace
- listy(+Strom, -SeznamListu) implementace s kontatenací, rozmyslet bez ní
- Binární vyhledávací stromy
- náležení prvku
- vkládání prvku - "obvyklé" vkládání prvku "do listu" nemůže posloužit pro vypouštění obecného prvku ze stromu
- vypouštění prvku ze stromu - obvyklý algoritmus
- vkládání prvku do kořene
- (nedeterministická) procedura vkládání do binárního vyhledávacího stromu,
která může být použita i pro vypouštění
- Algoritmus quicksortu, implementace se zřetězením a rozmyslet bez něho
- Deklarativní sémantika Prologu.
- Různé definice predikátu býti předkem a jejich operační sémantika
- Každá deklarativně správná procedura v čistém Prologu je parciálně správná,
tj. odpověď na dotaz dát nemusí, ale dá-li ji, je tato odpověď správná.
Ještě se k tomu vrátíme
- přednáška 24.října
- opakování
deklarativní sémantika prologovské procedury
deklarativně správná procedura je parciálně správná
- Krabičkový model výpočtu odpovědi na dotaz.
Princip ladění v Prologu, predikáty trace/0, notrace/0, spy/1, nospy/1.
- průchod stromem do hloubky a do šířky
- postav(+RostSez, +N, -T, -Zbytek)
Postavení dokonale vybalancovaného binárního vyhledávacího stromu T z prvních N prvků
rostoucího seznamu RostSez, Zbytek se zbytek seznamu
- "Smotávání" matice ze známé spirály - použití datové struktury z anonymních proměnných,
jak stejnou myšlenku použít v procedurálních jazycích
- rozdílové seznamy jako příklad neúplně definovaných datových struktur
konkatenace v konstatním čase
myšlenka převodu na běžné seznamy
- Princip možné implemenace programu Eliza (rozhovor psychoanalitika s pacientem)
- Na co se hodí Prolog
- přednáška 31.října
- přednáška 7.listopadu
- Opakování vstupy a výstupy
- Vstup a výstup znaků
- Příklady programování cyklů v Prologu
( "věčný" cyklus repeat .... fail a jeho ukončení,
"repeat until" cyklus , "for" cyklus ).
- negace
- Definice operátorů, standardní predikát op/3.
- Procedury realizující jednoduchý algoritmus
pro zjednodušování aritmetických výrazů
- Zavináčové uspořádání
- Predikáty bagof a setof, "existenční kvantifikátor ^ ", jednoduché příklady užití.
- Predikáty modifikace databáze, assert, asserta, assertz, retract, retractall.
Vhodnost resp. nevhodnost použití těchto příkazů.
Na příští přednášce začneme probírat jazyk Scheme, vytiskněte si jeho
syntaxi
- přednáška 14.listopadu
K Prologu se ještě vrátíme, vzhledem k potřebám cvičení přejdeme k Lispu
Dialekt LISPu - SCHEME
Přehled základních předdefinovaných forem je v
materiálu
- Výrazy v LISPu - prefixový způsob zápisu, vyhodnocování expanzí a redukcí.
- Forma define
- Podmínky: formy cond a if, nil jako false.
- Příklady: efektivní umocňování, faktoriál, odmocnina newtonovou metodou.
- Lokální define v Scheme - není přiš obvyklá.
- Funkce jako parametry - motivační příklad.
- Formy lambda a let, lokalita ve formě let.
- Dvojice : formy cons, car, cdr.
- "Alternativní" implementace forem cons, car a cdr "pomocí funkcí"
- Seznamy, forma list, příklady jednoduchých funkcí pro práci se seznamy.
- Forma quote.
- Datová struktura = konstruktory + selektory (+metody).
- Příklad struktury Binární strom:
- konstruktory Nulltree, Tree(L,V,R),
- test nulltree?
- selektory Root, Left, Right
- Rozmyslet:Příklady funkcí v Lispu nad touto datovou strukturou:
- Výpis listů stromu do seznamu (bez nutnosti zřetězovat seznamy).
- výška stromu
- Rozmyslet:
Datová reprezentace mobilu, testy na vyváženost a bezpečnost.
- prezence
- přednáška 21.listopadu
- Implemenace zlomku jako příklad nutnost "inteligentních" konstruktorů a selektorů.
- Jednoduché příklady funkcí v Lispu nad datovou strukturou binární strom:
- Výpis listů stromu do seznamu (bez nutnosti zřetězovat seznamy).
- výška stromu
- Komentář k úlohám o mobilu
Ještě naskok k Prologu
- Ovlivňování efektivity Prologoských programů.
- Několik implemenací výpočtu Fibonnaciovy posloupnosti, iterativní výpočet.
- Úvod do Haskellu
- Haskell jako funkcionální jazyk s typovou kontrolou.
- Definice funkce, typová specifikace funkce.
- Uživatelské definice typů. Typové a datové kostruktory.
Typová synonyma.
Polymorfické typy. Seznamy,
- přednáška 28.listopadu
- Haskell - opakování
- Definování seznamů pomocí generátorů a stráží. Výrazy pro aritmetické posloupnosti.
Podrobný výklad sémantiky výrazů tvaru [ e | q1 , q2 , ... ,qr ],
jednoduché příklady použití.
- Dvě implementace generování seznamu všech permutací daného seznamu
opravte chybu, která byla na slidu !!
- Lambda abstrakce.
- Práce s fukcemi více proměnných - curryfikace
- Převod infixového operátoru na binární funkci a zpět. Řezy (sections).
- Funkce v Haskellu nejsou striktní.
Objekt boot. Líné (lazy, by need) vyhodnocování funkcí.
- Zápis definice funkce pomocí case výrazu,
Stráže v definicích funkcí
- "Mečování" parametrů. Pořadí - odleva doprava a z vněšku dovniř,
Výsledkem mečování může být úspěch, selhání nebo divergence.
Formální prametry jako "vzorky" - patterns:
- proměnné
- As-patterns - '@'
- žolík - '_'
- datový konstruktor
- "aritmetický parametr" - "n+k"
Příklady
- Jednoduché příklady na práci se seznamy
- přednáška 5.prosince
- Opakování
- fixity deklarace
- lazy patterns, příklady
- lazy vyhodnocování - vyhodnocuj až když musíš
otvírá možnost definování nekoneščných termů (jako zápisů algoritmů produkujících nekonečnou posloupnost výsledků,
z nichž však v každém konkrétním výpočtu potřebuji - a tedy budu počítat - jen konečně mnoho)
srovnej aktuální a petenciální nekonečno v matematice
- Nekonečné datové struktury. Příklad fibonacciovy posloupnosti, syntaxe pro nekonečné seznamy.
- if výraz
- Konstrukce let a where, dvojrozměrná syntaxe Haskellu
- Funkce map, fold a foldr a příklady jejich použití
- Mocninné řady jako příklad nekonečných termů, derivace a n-tá derivace mocninné řady
- První a n-tá derivace mocninné řady
- Prvočísla pomocí Erathostenova síta.
- Na rozmyšlenou:
- Operace s mocninnými řadami
- První a n-tá derivace mocninné řady
- Aritmetické operace s mocninnými řadami (sčítání, odčítání, násobení a dělení)
- Výpočet hodnoty součtu prvních N čísel mocninné řady R v bodě X
- Totéž pro K tou derivaci
- Typové specifikace těchto funkcí
- Porovnejte s obdobnými funkcemi pro různé reprezentace polynomů
- motivační příklad pro zavedení tříd
- přednáška 12.prosince
- přednáška 19.prosince
velmi se nepovedla
- O zkouškových písemkácha způsobu přihlašování na zkoušky
Co je ještě v Haskellu
- Abstraktní datové typy - moduly.
- třídy a jejich instance
- v typu jde definovat identifikátory složek a pak je používat obvyklým způsobem
- striktní konstruktory dat - !
- programování vstupů a výstupů
- imperativní programování v Haskellu
- komentář k začátku modulu prelude
- prohra s hardwarem a předčasný konec
- přednáška 9.ledna
Logika za Prologem - letem světem
- Predikátový a výrokový počet
- Interpretace, logicky pravdivé formule, splnitelnost
- Kluzulární tvar formule, Skolemova věta
- Herbrandovo universum, Herbrandova věta
- Základní resoluční metoda, unifikační algoritmus, Robonsonova věta
- Hornovy klausule a Prolog