ϵ">]>
6. CVIČENIE (DOMÁCA ÚLOHA) Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2013/2014
ČASŤ B
http://dai.fmph.uniba.sk/courses/udp/ex/ex06.zip
Dátum: 27. 3. 2014
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 (ex06a) a reprezentácii konečných množín usporiadanými zoznamami bez opakovania (ex06b).
Literatúra.
[1] J. Kľuka. Prednášky z Úvodu do deklaratívneho programovania LS 2013/2014.
http://dai.fmph.uniba.sk/courses/udp/udp-prednasky-2014.pdf
[2] D. Guller. Poznámky k prednáškam z CL.
[3] J. Komara and P. J. Voda. Metamathematics of Computer Programming. 2001.
Reprezentácia množín usporiadanými zoznamami bez opakovania. Konečné množiny môžeme jednoducho reprezentovať zoznamami. Pri množinách je dôležitá iba príslušnosť prvku do množiny. Počet výskytov prvku ani poradie prvkov nie sú podstatné. Množiny môžeme preto reprezentovať usporiadanými zoznamami bez opakovania prvkov. Operácie na dvoch množinách potom dokážeme naprogramovať tak, aby počet krokov potrebných na ich vykonanie lineárne závisel od súčtu počtu prvkov v množinách.
[CL] Trichotomická diskriminácia. V nasledujúcich úlohách využijeme trichotomickú diskrimináciu:
Úloha. Zadefinujte predikát , ktorý platí, ak je zoznam, ktorý reprezentuje množinu, teda usporiadaný a bez opakovania.
Definícia je podobná predikátu z ex08a.
Špecifikácia:
Testovanie:
Set_test = r:Results
Úloha. Zadefinujte predikát , ktorý platí, ak je prvkom množiny .
Napríklad a .
Využite (ale netestujte!), že je množina. Ani v jednom z uvedených príkladov výpočet nesmie prejsť celý zoznam .
Špecifikácia:
Testovanie:
Member_test = r:Results
Extenzionalita. Všimnite si, že reprezentácia množín usporiadanými zoznamami bez opakovania je jednoznačná a teda má vlastnosť extenzionality: Množiny sú si rovné práve vtedy, keď majú tie isté prvky.
Úloha. Zadefinujte funkciu , ktorá vloží prvok do množiny , teda vráti množinu, ktorá obsahuje všetky prvky a prvok .
Napríklad a .
Pozor na poradie argumentov a na fakt, že v množinách sa prvky neopakujú a sú usporiadané. Nepoužite žiadne pomocné funkcie ani predikáty (vrátane a ).
Špecifikácia:
Testovanie:
Insert_test = r:Results
Úloha. Zadefinujte funkciu , ktorá odstráni prvok z množiny , teda vráti množinu obsahujúcu všetky prvky okrem .
Napríklad a .
Pozor na poradie argumentov a na fakt, že v množinách sa prvky neopakujú a sú usporiadané. Nepoužite žiadne pomocné funkcie ani predikáty (vrátane a ). Ani v jednom z uvedených príkladov výpočet nesmie prejsť celý zoznam .
Špecifikácia:
Testovanie:
Delete_test = r:Results
Úloha. Zadefinujte funkciu , ktorá zjednotí množiny a .
Napríklad .
Využite (ale netestujte!), že a sú množiny. Algoritmus pre zjednotenie je podobný zlúčeniu utriedených zoznamov, vo výsledku sa však žiadny prvok nesmie opakovať. Nepoužite žiadne pomocné funkcie ani predikáty (vrátane a ).
Špecifikácia:
Testovanie:
Union_test = r:Results
Úloha. Zadefinujte funkciu , ktorá vypočíta prienik množín a .
Napríklad .
Využite (ale netestujte!), že a sú množiny. Použite podobný algoritmus ako pre zjednotenie. Nepoužite žiadne pomocné funkcie ani predikáty (vrátane a ).
Špecifikácia:
Testovanie:
Inter_test = r:Results
Úloha. Zadefinujte funkciu , ktorá vypočíta rozdiel množín a .
Napríklad .
Platia rovnaké obmedzenia a odporúčania ako v predošlých úlohách.
Špecifikácia:
Testovanie:
Diff_test = r:Results
Úloha. Zadefinujte funkciu , ktorá vypočíta symetrický rozdiel množín a .
Napríklad .
Platia rovnaké obmedzenia a odporúčania ako v predošlých úlohách.
Špecifikácia:
Testovanie:
Sdiff_test = r:Results
Úloha. Zadefinujte predikát , ktorý platí, ak je podmnožinou .
Napríklad a .
Platia rovnaké obmedzenia a odporúčania ako v predošlých úlohách.
Špecifikácia:
Testovanie:
Subset_test = r:Results
Prémiová domáca úloha du06. (1+1+1+(1+1)+1 = 6 bodov)
Pravidlá pre prémiové domáce úlohy nájdete na http://dai.fmph.uniba.sk/courses/udp/#pdu
Jednotlivé časti úlohy budeme hodnotiť samostatne.
Časti a) a b) sa nachádzajú v súbore ex06a.
Definícia. Dvojica je lexikograficky menšia ako dvojica práve vtedy, keď alebo a .
Formálne túto vlastnosť vyjadríme predikátom s nasledujúcou klauzálnou definíciou.
Definícia. Konečná relácia je zoznam dvojíc, ktoré sú usporiadané lexikograficky.
Napríklad zoznam
je konečnou reláciou, ale zoznamy
z rôznych dôvodov (akých?) nie sú konečnými reláciami.
Konečné relácie sú špeciálnym typom asociatívnych zoznamov z prémiovej domácej úlohy du05 c).
Predikát platí práve vtedy, keď je konečná relácia.
Definícia. Karteziánskym súčinom konečných množín a nazveme konečnú reláciu , ktorá obsahuje dvojicu práve vtedy, keď je prvkom a je prvkom .
c) (1 bod) Naprogramujte funkciu , ktorej hodnotou je karteziánsky súčin konečných množín a .
Využite, ale netestujte, že a sú konečné množiny. Budete potrebovať pomocnú funkciu a zreťazenie.
Definícia. Obrazom konečnej množiny v konečnej relácii je konečná množina , ktorá pre každý prvok obsahuje práve tie prvky , pre ktoré dvojica patrí do .
Napríklad obrazom konečnej množiny vo vyššie uvedenej konečnej relácii je množina . Obrazom množín , , v relácii je .
d) (1+1 bod) Zadefinujte funkciu , ktorej hodnotou je obraz konečnej množiny v relácii . Využite, ale netestujte, že je konečná relácia a je konečná množina. (1 bod)
Budete potrebovať pomocnú funkciu (obraz prvku) a niektorú z množinových operácií.
Za maximálne využitie vlastností množín a relácií na skrátenie výpočtu dostanete ďalší 1 bod. Vyžaduje si tupling v pomocnej funkcii alebo triedenie.
Definícia. Zložením konečných relácií a je konečná relácia , ktorá obsahuje dvojicu práve vtedy, keď pre nejaký prvok relácia obsahuje dvojicu a relácia obsahuje .
Napríklad
e) (1 bod) Zadefinujte funkciu , ktorej hodnotou je zloženie konečných relácií a .
Využite, ale netestujte, že a sú konečné relácie. Využite obraz, karteziánsky súčin a zreťazenie.