ϵ">]>
4. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2013/2014
ČASŤ B
http://dai.fmph.uniba.sk/courses/udp/ex/ex04.zip
Dátum: 11. a 12. 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é aritmetickým operáciám na binárnom zápise čísel (ex04a) a tuplingu (ex04b).
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.
[CL] Zabudovaná párovacia funkcia. Párovacia funkcia zabudovaná do CL je založená na enumerácii (očíslovaní) binárnych stromov. Zapisuje sa binárnym infixovým operátorom „ , “ (čiarka), napríklad
Operátor „ , “ má veľmi nízku prioritu a implicitne sa zátvorkuje doprava:
Vlastnosti párovacej funkcie CL. Podobne ako pre iné párovacie funkcie, aj funkcia má párovacie vlastnosti:
ak sa dva páry rovnajú, rovnajú sa po zložkách:
(1) |
zložky páru sú menšie ako pár:
(2) |
každé nenulové číslo je pár:
(3) |
Z vlastnosti (2) vyplýva:
(4) |
[CL] Úloha. CL nepočíta číselnú hodnotu párovacej funkcie, pokiaľ nie je priamo potrebná. Vyskúšajte napríklad dopyt (query):
1+1,2+2 = x
Ak chcete poznať hodnotu párovacej funkcie pre nejaké čísla, môžete využiť napríklad formát , ktorý každé číslo (aj výsledok párovania) zobrazí v desiatkovom zápise:
1+1,2+2 = x:N
alebo použiť párovanie ako argument aritmetickej operácie:
(1+1,2+2)+0 = x
Pri bežnom programovaní nie je vyčíslenie párovacej funkcie potrebné.
[CL] Párová diskriminácia. Na definovanie funkcií, ktoré spracúvajú vstup vytvorený párovaním budeme používať párovú diskrimináciu:
kde je ľubovoľný term a a sú nové premenné.
Párovú diskrimináciu umožňujú vlastnosti (3) a (4) z predchádzajúceho odseku.
[CL] Úloha. Porovnávania so vzorom z párovej diskriminácie môžete použiť aj v dopytoch (queries). Vyskúšajte napríklad:
0 = x & x = 0 0 = x & x = u,v 8,3 = x & x = 0 8,3 = x & x = u,v 42 = x & x = 0 42 = x & x = u,v
Úloha. Zadefinujte funkciu , ktorá sčíta zložky páru . Ak nie je pár, hodnotou je .
Testovanie.
Sum_pair_test = r:Results
Úloha. Zadefinujte funkciu , ktorá vypočíta skalárny súčin 3-rozmerných vektorov a . 3-rozmerný vektor pomocou párovania zakódujeme ako trojicu (dva doprava vnorené páry): . Prípady, keď číslo alebo nie je trojica, nepíšte, ale prenechajte ich na tzv. default – CL automaticky doplní výsledok .
Testovanie.
Sprod3_test = r:Results
Úloha. Zadefinujte primitívnou rekurziou funkciu
bez použitia funkcie .
Testovanie.
Twofib_test = r:Results_pn
Úloha. Zadefinujte všeobecnou rekurziou funkciu
bez použitia funkcií , a operátorov / a mod.
Testovanie.
Divmod_test = r:Results_pn
Najvýznamnejšia číslica a zvyšok čísla. V pozičnej sústave so základom sa každé číslo dá jednoznačne zapísať ako postupnosť číslic … , kde pre všetky , , a . Platí teda:
Číslica sa nazýva najvýznamnejšia (angl. most significant digit).
Úloha. Zadefinujte všeobecnou rekurziou funkciu , ktorej hodnotou pre a je dvojica , kde je najvýznamnejšia číslica a je zvyšok čísla pozostávajúci zo všetkých menej významných číslic.
Pre a je . Prípad prenechajte na default.
Testovanie.
Msd_lsds_test = r:Results
Prémiová domáca úloha du04. (2+1+1+2 body) Pravidlá pre prémiové domáce úlohy nájdete na http://dai.fmph.uniba.sk/courses/udp#pdu
Časti a) – c) nájdete v ex04a.cl. Jednotlivé časti môžete odovzdať nezávisle od seba.
d) (2 body) Naprogramujte funkciu , ktorá pomocou rekurzie na binárnom zápise čísel a pomocou tuplingu počíta súčasne podiel a zvyšok po delení čísla číslom .
Môžete použiť iba binárnu, dichotomickú ( | ) a párovú diskrimináciu, binárnu rekurziu, zabudované odčítanie (), párovanie (), binárne konštruktory , a konštantu .
Návod. Použite podobný postup ako ste sa učili na základnej škole. Binárnu rekurziu použite na delenca (), deliteľ () je konštantným parametrom. Podstatné časti výpočtu sa dejú pri vynáraní z rekurzie.
Testovanie.
Divmodb_test = r:Results_pn