cvičení 5.března
Začněte své prográmky ladit v Prologu, pokud to bude dělat potíže, podíváme se na to příště
- opakování otáčení seznamu v lineárním čase pomocí akumulátoru
místo otáčení ot(+Seznam, -otoceny_seznam) vytvářme predikát otA (+Seznam, +Akumulátor, -Otoceny_seznam_zřetězený_s_Akumulátorem)
ot(S,OS):- otA(S,[],OS).
otA([],A,A).
otA([H|T],A,OSA):- otA(T, [H|A], OSA]).
- obdobně třídění quick sortem bez conkatenace
- opakování aritmetiky:
operátor is a aritmetické relační operátory : <, <=, >,>=, =:=, =\=
- největší společný dělitel dvou čísel a seznamu čísel
- otáčení matice, i zde můžeme využít akumulátoru
- spirála sp(+Matice, -Spirála)
- inverzní vztah, který ze spirály (a rozměru matice) vytvoří matici, ze které spirála byla vyrobena, můžeme dostat "zadarmo".
vytvoříme matici z anonymních proměnných daných rozměrů - anonym_mat(+Pocet_radek, +PocetSloupcu, -Anonym_mat)
namotej(-Mat,+PocR, +PocSl, +Spir)
namotej(Mat,C Spir) :- anonym_mat(PocR, PocSl, Mat), spirala(Mat, Spir).
- Rozdílové seznamy jsou speciální případ neúplně definovaných datových struktur - obsahují volnou proměnnou
rozdílová reprezentace seznamu [a,b,c] je [a,b,c|C] - C kde C je volná proměnná,
rozdílová reprezentace seznamu [] je C-C kde C je volná proměnná.
Tedy vlastně umístíme volnou proměnnou "na konec seznamu "místo []" a když ji dáme ještě někam jinam ( např. za minus můžeme na konec seznamu "přidat cokoli" jen unifikací
zřetězení rozdílových seznamů v konstantnín čase conc(A-B,B-C,A-C)
- podívejte se na quicksort bez concatenace - je to vlastně "totéž", jako kdybychom programovali quicksot rozdílových seznamů
- největší společný dělitel dvou čísel a seznamu čísel
- domácí úkoly
- naprogramujte predikáty převádějící seznamy na rozdílové seznamy a zpět (může to být i jen jeden obousměrný)
- množinové operace
množinu reprezentujeme jako rostoucí seznam jejích prvků
naprogramujte predikáty, které počítají sjednocení, rozdíl a průnik dvou množin
- funkci reprezentujeme jako seznam dvojic f(vzor, obraz) uspořanoý podle první složky
naprogramujte relace obraz(+Funkce,+Mnozina, -Obraz_mnoziny) a vzor(+Funkce,+Mnozina, -obraz(+Funkce,+Mnozina, -Vzor_mnoziny)