Zpět PRG005

PRG005 Neprocedurální programování

Co bylo na přednáškách

úterý 15:40 M1

Věnujte pozornosti vyhlášce o rozdělení studentů do skupin na semináře

  1. přednáška 5.října
  2. přednáška 12.října
  3. přednáška 19.října
  4. přednáška 26.října
  5. přednáška 2.listopadu
  6. přednáška 9.listopadu
  7. přednáška 16.listopadu
  8. přednáška 23.listopadu
  9. přednáška 30.listopadu
  10. přednáška 7.prosince
  11. přednáška 14.prosince
  12. přednáška 21.prosince
  13. přednáška 4.ledna
  14. přednáška 11.ledna
  1. přednáška 5.října
    • O předmětu, zkoušce a zápočtech.
    • 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)
  2. přednáška 12.října
    • Syntaxe a terminologie Prologu (proměnné, atomy, řetězce, struktury, klausule, fakty, pravidla, procedury, ... ).
    • Středník a jeho používání
    • Unifikace, nejobecnější unifikační substituce, naivní algoritmus unifikace a ukázka jeho selhání.
    • Procedurální (operační) sémantika (algoritmus interpretu) Prologu = unifikace + backtracking.
    • Predikáty pro práci se seznamy:
      • Spojování (konkatenace) dvou seznamů do třetího - má lineární časovou složitost v závislosti na délce prvního ze spojovaných seznamů
      • Vypouštění prvku ze seznamu:
        • uspěje jen když hledaný prvek v seznamu je, pak vypustí jeho první výskyt
          je totéž jako vkládání, jde využít i pro definici predikatu býti prvkem
        • uspěje vždy, je-li tam hledaný prvek, vypustí jeho první výskyt
        • uspěje vždy, vypustí všechny výskyty hledaného prvku
      • Permutace seznamu
      • Otáčení seznamu pomocí konkatenace - má kvadratickou časovou složitost
    • Problém na rozmyšlenou: otáčení seznamu v lineárním čase
  3. přednáška 19.října
    Všechny příklady na rozmyšlenou je třeba řešit bez aritmetiky (která navíc na přednášce ještě - úmyslně- nebyla)
    • Technika akumulátoru, predikát reverse_append.
    • Na rozmyšlenou:
      Hledání prostředního prvku ze seznamu
    • Styl komentářů programů v Prologu. Význam používání +, - a ? před argumenty
    • Příklady datových struktur vytvořených pomocí seznamů
      • Součtové seznamy. A+B má reprezentuje zřetězení seznamu A s otočeným seznamem B.
        Na rozmyšlenou:
        • Přidávání prvku na začátek a na konec součtového seznamu.
        • Odebírání prvku ze začátku a zkonce součtového seznamu
        • Zřetězení součtových seznamů
        • Otáčení součtového seznamu
        • Převod(y) mezi součtovými seznamy a obvyklou reprezentací seznamů
      • Reprezentace matice jako seznamu řádkových seznamů
        Na rozmyšlenou:
        • seznam(+S) býti seznamem, matice(+M) býti maticí
        • empty(+M) býti prázdnou maticí
        • hldiag(+M,-D), vedldiag(+m,-D) hlavni a vedlejsi diagonala (predpokládáme, že vstupní matice je čtvercová
        • Otočení matice o 90 stupňů
        • slupka(+M,-Slupka,-Pecka) - oloupe z matice M "vnější prvky" do seznamu Slupka, zbytek matice tvoří matici Pecka
        • spirála(+M,-Spirala) - loupe matici M do seznamu Spirala tak dlouho až z ní (chudáka) nic nezbude
        • obdelnik(+M) ověří zda argument M je odbélníková matice
        • ctverec(+M) ověří zda argument M je čtvercová matice
        • další "maticové vztahy" dle libosti
    • Standardní predikáty atom/1, var/1, nonvar/1.
    • Rozdílové seznamy jako příklad neúplně definovaných datových struktur (reprezentace obsahuje volnou proměnnou).
      Zřetězení rozdílových seznamů, Převod mezi seznamy a rozdílovými seznamy (použitý operátor řezu zatím bez podrobného výkladu a jeho používání odložíme na později).
    • Predikát rozvin(+S,-RS), který "rozvine" seznamy vložené do seznamu S
      např. rozvin( [a, [b,[c,d],[e]], [], f, [[[[],g]]]] , [a,b,c,d,e,f,g] ]
      a jeho další dvě implementace pomocí akumulátoru a rozdílových seznamů
    • Různé definice predikátu býti předkem a jejich operační sémantika
      Na rozmyšlenou:
      Rozdíly v operační sémantice mezi čtyřmi procedurami procedurami implementujícími vztah předek
    • Deklarativní sémantika Prologu.
    • 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á.
  4. přednáška 26.října
    • 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áty bytistrom(+X), prvekstromu(Co, Vcem)
      • listy(+Strom, -SeznamListu) implementace s kontatenací a bez ní
      • průchod stromem do hloubky a do šířky
    • Orientované grafy
      • reprezentace gr(V,E) , kde V je seznam vrcholů a E je seznam hran; hrana je reprezentována termem e(Odkud,Kam)
      • reprezentace gss( SS ) , kde SS je seznam termů tvaru v(Vrch, Sous), v nichž Vrch je vrchol a Sous je seznam koncových bodů hran, které z něj vycházejí
      • Na rozmyšlenou:
        • Převod resp. převody mezi těmito reprezentacemi
        • Průchod orientovaným grafem do hloubky a do šířky
    • Seznamy nejsou vhodnou datovou strukturou pro reprezentaci dvojic resp. k-tic pro pevné k,
      hodí se naopak pro reprezentaci konečných posloupností libovolné délky
    • Aritmetika, predikát is,
      aritmetické relace =:= , =/= , ‹ , › , ‹= , ›=
    • Jednoduché aritmetické predikáty
      • největší společný dělitel dvou čísel
      • délka seznamu
      • maximum dvou čísel, maximum z prvků seznamu čísel
      • generování seznamu čísel [ k,k+1, .... , n-1, n ]
    • Krabičkový model výpočtu
    • Consult a reconsult.
    • Principy ladění. Predikáty spy/1, nospy/1, trace/0, notrace/0
    • Ukázka práce s SWI Prologem
  5. přednáška 2.listopadu
    • Nalezení následující permutace v lexikografickém uspořádání
    • Využití struktury z anonymních proměnných pro "inverzní zobrazení" (příklad: vytvoření matice daných rozměrů z oloupané spirály - rozmyslet).
    • 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 bez něho (totéž pomocí rozdílových seznamů - rozmyslet).
    • Slévání uspořádaných posloupností - deterministické procedury.
    • Operátor řezu a jeho sémantika - červený a zelený řez
    • Operátor řezu "ničí" deklaritivní sémantiku procedury, některé problémy s používáním řezu
    • Bublinkové třídění
    • Standardní predikát fail a jeho "síla"
    • Negace - ještě se k ní vrátíme
    • Na rozmyšlenou:
      • Třídění seznamu vkládáním
      • Třídění seznamu výběrem
      • Topologické třídění grafů
  6. přednáška 9.listopadu
    • Negace - opakování
    • "Wirthuv" algoritmus pro hledaní osmi nezávislých dam na šachovnici.
    • Jednoduchá procedura řešící algebrogram
    • Standardní predikáty pro analýzu a syntézu termů:
      name/2, functor/3, arg/3, =..   a příklady jejich užití.
    • "Rovnosti v Prologu (==, /==, =, /=, =:=, =/= )
    • "Edinbugrský" model vstupu a výstupu: otvírání, zavírání, zjištění aktuálního streamu, Vstup/výstup termů resp. znaků.
      SWI Prolog umožňuje složitější práci se soubory. Pro použití na cvičeních a při zkouškách vystačíme s touto podmnožinou (v SWI je ralizována s drobnými odchylkami).
    • Příklady programování cyklů v Prologu
      ( "věčný" cyklus repeat .... fail a jeho ukončení, "repeat until" cyklus , "for" cyklus ).
    • Příklady jednoduchého vstupu a výstupu.
    • Větvení výpočtu pomocí středníku a explicitního použití operátoru = na pravé straně klauzule.
    • Kopírování "textového" souboru
  7. přednáška 16.listopadu
    • 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ů.
    • Bagof pomocí assert a retract
    • Několik implemenací výpočtu Fibonnaciovy posloupnosti, iterativní výpočet.
    Touto přednáškou skončil systematický výklad Prologu. Vrátíme se však k němu několika většími příklady.
  8. přednáška 23.listopadu
    Probírá se dialekt Scheme jazyka LISP. 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: faktoriál rekursivně a iterativně, efektivní umocňování, odmocnina newtonovou metodou.
    • Lokální define v Scheme - není přiš obvyklá.
    • Funkce jako parametry.
    • Formy lambda a let, lokalita ve formě let.
    • Dvojice : formy cons, car, cdr.
    • Seznamy, forma list, příklady jednoduchých funkcí pro práci se seznamy.
    • Forma quote.
    • Datová struktura = konstruktory + selektory (+metody).
    • Implemenace zlomku jako příklad nutnost "inteligentních" konstruktorů a selektorů.
  9. přednáška 30.listopadu
    • Datová struktura = konstruktor(y) a selektory
      Výhody takového styly programování (platí obecně nikoli jen v nějakém konkrétním jazyku).
    • Příklad struktury Binární strom:
      • konstruktory Nulltree, Tree(L,V,R),
      • test nulltree?
      • selektory Root, Left, Right
    • 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.
    Ú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, (n)tice - tuples.
    • Definování seznamů pomocí generátorů a stráží. Výrazy pro aritmetické posloupnosti.
  10. přednáška 7.prosince
    • Přihlašování ke zkouškám (přihlásit se lze až když již máte zápočet)
      a u užitečnost funkční gramotnosti pro přežití v (post)industriálním světě (o matfyzu nemluvě).
    • 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
    • Dvourozměrná syntaxe Haskellu (ještě se k tomu vrátíme)
    • Lambda abstrakce.
    • Převod infixového operátoru na binární funkci a zpět. Řezy (sections). Deklarace fixity.
    • Funkce v Haskellu nejsou striktní.
      Objekt boot. Líné (lazy, by need) vyhodnocování 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
    • Definice funkce - použití stráží
    • Nekonečné datové struktury. Příklad fibonacciovy posloupnosti.
  11. přednáška 14.prosince
    • 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ů
    • case výraz ve definicích funkcí
    • Stráže v definicích funkcí
    • if výraz
    • Konstrukce let a where, dvojrozměrná syntaxe
    • Funkce map, fold a foldr a příklady jejich použití
    • lazy patterns
  12. přednáška 21.prosince
    • Mečování parametrů
    • Abstrakce v Haskellu
      let a where, definování funkc9, datová abstrakce, funkce vyšších řádů, lazy vyhodnocování
    • Třídy, podtřídy, vícenásobná dědičnost, použití při typové specifikaci funkcí
    • Třídy Eq, Ord, Num
    • Odvozené instance typů
    • Abstraktní datové typy - moduly.
    • Pole v Haslellu
    • Násobení matic
  13. přednáška 4.ledna
    • Návrat k Prologu.
      Ukázka programu typu Eliza.
    • O zkouškách
    • Binární stromy, definice typu, základní funkce
    • Vkládání do binárního vyhledávacího stromu, vypuštění z něj
    • Analýza problému transformace binárního stromu s prvky typu podtřídy Eq
      na strom obsahující přirozená čásla "kódující" původní obsah, návod k řešení,
      na rozmyšlenou udělat program
    • Co by si "člověk" měl z přednášky odnést
  14. přednáška 11.ledna
    • Třída IO a, vstup a výstup
    • operátor do, return
    • Monády a překlad výrazů s operátorem do "jejich řeči"
    • Axiomy monády
    • Monáda Lists a příklad jejího použití
    • Monáda IO
    • Komentář ke zkouškám
    • Rozbor úloh z ukázkových písemek (první a druhá část).
    • Otázky a odpovědi
Zpět PRG005