ϵ">]>
9. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2012/2013
ČASŤ A
http://dai.fmph.uniba.sk/courses/udp/ex/ex09.zip
Dátum: 8. 4. 2013
Odporúčaná verzia CL: 5.81.20
WWW stránka predmetu: http://dai.fmph.uniba.sk/courses/udp/
Kontakt: udp(zavináč)lists.dai.fmph.uniba.sk
Úvodná poznámka. Toto cvičenie je venované triedeniu zoznamov (ex09a) a reprezentácii konečných množín usporiadanými zoznamami bez opakovania (ex09b).
Literatúra.
[1] J. Kľuka. Prednášky z Úvodu do deklaratívneho programovania LS 2012/2013.
http://dai.fmph.uniba.sk/courses/udp/udp-prednasky-2013.pdf
[2] D. Guller. Poznámky k prednáškam z CL.
[3] J. Komara and P. J. Voda. Metamathematics of Computer Programming. 2001.
Prvok zoznamu. Zabudovaný predikát platí práve vtedy, keď je prvkom zoznamu , teda
Tento predikát je zadefinovaný zoznamovou rekurziou nasledovne:
Predikát zapisujeme „ in “, jeho negáciu zapisujeme „ !in “.
Úloha. Zadefinujte funkciu , ktorá zistí počet výskytov prvku v zozname .
Špecifikácia:
Napríklad a .
Testovanie:
Count_test = r:Results
Úloha. Zadefinujte predikát , ktorý platí práve vtedy, keď pre každý prvok zoznamu je počet výskytov v zoznamoch a rovnaký.
Formálne:
Napríklad
Testovanie:
Eq_counts_test = r:Results
Úloha. Zadefinujte predikát , ktorý platí práve vtedy, keď je zoznam permutáciou zoznamu , teda keď pre každé číslo je počet výskytov v zoznamoch a rovnaký.
Formálne:
Použite predikát s vhodne zvoleným zoznamom .
Napríklad
Testovanie:
Perm_test = r:Results
Úloha. Zadefinujte predikát , ktorý platí práve vtedy, keď je vzostupne usporiadaný zoznam, v ktorom sa prvky môžu opakovať.
Formálne:
Napríklad
Testovanie:
Ord_test = r:Results
Úloha. Zadefinujte funkciu , ktorá vsunie prvok do utriedeného zoznamu tak, aby výsledný zoznam bol utriedený.
Predpokladajte a využite, že zoznam je utriedený, ale jeho utriedenie netestujte ani nijak inak nezabezpečujte. Správaním funkcie na neutriedenom zozname sa nezaoberajte.
Špecifikácia:
Napríklad , a
Testovanie:
Ins_test = r:Results
Úloha. Použitím funkcie zadefinujte funkciu , ktorá utriedi ľubovoľný zoznam vsúvaním.
Funkcia spĺňa vyššie uvedenú špecifikáciu triedenia:
Testovanie:
Isort_test = r:Results
Úloha. Zadefinujte funkciu , ktorá rozdelí zoznam na dva zoznamy a tak, aby sa prvky z párnych miest v zozname nachádzali v a aby sa prvky z nepárnych miest v zozname nachádzali v (poradie počítame od 0).
Funkcia vždy vráti dvojicu zoznamov. Nepoužite žiadne pomocné funkcie ani predikáty.
Špecifikácia:
Napríklad a .
Testovanie:
Msplit_test = r:Results
Úloha. Zadefinujte funkciu , ktorá zlúči dva utriedené zoznamy do utriedeného zoznamu.
Funkcia prechádza oboma zoznamami súčasne a nevyužíva žiadne pomocné funkcie ani predikáty. Splnenie požiadavky na utriedenie a predpokladajte, ale netestujte ani nezabezpečujte.
Špecifikácia:
Napríklad .
Testovanie:
Merge_test = r:Results
Úloha. Zadefinujte funkciu , ktorá utriedi ľubovoľný zoznam zlučovaním.
Použite funkcie a . Pozor na zacyklenie.
Funkcia spĺňa vyššie uvedenú špecifikáciu triedenia:
Testovanie:
Msort_test = r:Results
Úloha. Zadefinujte funkciu , ktorá rozdelí zoznam na zoznamy a tak, aby obsahoval prvky menšie alebo rovnaké ako a obsahoval prvky väčšie ako .
Funkcia vždy vráti dvojicu zoznamov. Prvok nepridávajte do žiadneho z výstupných zoznamov (ak sa nevyskytuje v ). Nepoužite žiadne pomocné funkcie.
Špecifikácia:
Napríklad .
Testovanie:
Qsplit_test = r:Results
Úloha. Naprogramujte funkciu , ktorá utriedi ľubovoľný zoznam algoritmom quick sort.
Ako pivot použite prvý prvok zoznamu. Použite funkciu na rozdelenie zoznamu podľa pivota. Rekurzívne utrieďte časti zoznamu a spojte ich navzájom a s pivotom pomocou zreťazenia a párovania.
Funkcia spĺňa vyššie uvedenú špecifikáciu triedenia:
Testovanie:
Qsort_test = r:Results