ϵ">]>
4. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2014/2015
ČASŤ A
http://dai.fmph.uniba.sk/courses/udp/ex/ex04.zip
Dátum: 18. 3. 2015
Odporúčaná verzia CL: 5.81.21
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 2014/2015.
http://dai.fmph.uniba.sk/courses/udp/udp-prednasky-2015.pdf
[2] D. Guller. Poznámky k prednáškam z CL.
[3] J. Komara and P. J. Voda. Metamathematics of Computer Programming. 2001.
Binárny zápis čísla. Každé prirodzené číslo možno zapísať v tvare
kde pre všetky .
Postupnosť … nazývame binárnym zápisom (binárnou reprezentáciou) čísla .
Napríklad
Binárny zápis čísla je teda
[CL] Binárne konštruktory. V CL sú preddefinované funkcie
nazývané binárne konštruktory. Pomocou nich môžeme konštruovať binárny zápis čísel. Funkciu môžeme chápať ako „pridaj číslicu 0 na koniec binárneho zápisu čísla “. Tomu zodpovedá aj spôsob jej zobrazenia: . Význam sa dá chápať analogicky.
[CL] Úloha. Vyhodnoťte nasledujúce dopyty (queries):
S1 S0 S1 S1(0) = n
50 = n & S0(n) = p & S1(n) = q
[CL] Binárny formát. CL dokáže zobraziť hodnotu premennej v Query v binárnom zápise pomocou binárneho formátu .
Syntax:
hodnota = premenna:Nb
Hodnota sa zobrazí akoby bola skonštruovaná z 0 pomocou konštruktorov a .
[CL] Úloha. Vyhodnoťte nasledujúce dopyty (queries):
13 = n:Nb
13+12 = n & n = m:Nb
S1 S0 S1 S0 S1(0) = n & n = m:Nb
[CL] Binárna diskriminácia. Binárny zápis každého prirodzeného čísla končí číslicou 0 alebo číslicou 1:
(N2_cover) |
Tieto možnosti sú vzájomne výlučné
(N2_excl) |
a tvoria binárnu diskrimináciu. CL pozná túto diskrimináciu. Používame ju v tvare
kde je ľubovoľný výraz (obyčajne argument funkcie) a je nová premenná (podobne ako pri monadickej diskriminácii).
Binárnu diskrimináciu možno dosadiť do argumentov definovanej funkcie nasledovne:
[CL] Úloha. Zadajte nasledujúce dopyty (queries) pre viacero rôznych hodnôt :
13 = n:Nb & n = 0
13 = n:Nb & n = S0(m)
13 = n:Nb & n = S0(m:Nb)
13 = n:Nb & n = S1(m)
13 = n:Nb & n = S1(m:Nb)
Úloha. Pomocou binárnej diskriminácie naprogramujte funkciu , ktorej hodnotou je zvyšok po delení čísla číslom .
Testovanie.
Mod4_test = r:Results
Binárna rekurzia. Ak funkciu zadefinujeme tak, že všetky rekurzívne volania majú menší počet binárnych číslic ako pôvodný argument, teda
hovoríme o binárnej rekurzii. Všimnite si, že pre je potrené rozlíšiť prípady (teda aj ) a (teda aj a sa dá zapísať menším počtom binárnych číslic ako ). Binárna rekurzia je špeciálnym prípadom všeobecnej (course-of-values) rekurzie, pretože
Všetky funkcie v tomto cvičení definujte iba binárnou rekurziou!
Poznámka. Binárnou rekurziou môžeme zadefinovať efektívne aritmetické operácie na prirodzených číslach s neobmedzenou presnosťou. Počet krokov potrebných na takto zadefinované operácie lineárne závisí od počtu číslic v binárnom zápise argumentov operácie, nie od hodnoty argumentov.
Úloha. Nasledovník. Binárnou rekurziou zadefinujte funkciu nasledovník .
Návod. Predstavte si binárnu verziu sčítania, ako ste sa ho učili na základnej škole. Uvedomte si, kedy nastáva prenos do vyššieho rádu.
01100 (12) 01101 (13) 01111 (15) + 1 + 1 + 1 ----- ----- ------ 01101 (13) 01110 (14) 010000 (16)
Testovanie.
Succ_test = r:Results_n
Úloha. Sčítanie. Binárnou rekurziou zadefinujte funkciu sčítanie .
Návod 1 (názorný). Predstavte si binárnu verziu sčítania, ako ste sa ho učili na základnej škole. Rozoberte jednotlivé prípady:
00 x0 x0 x0 x1 x1 x1 + y +00 +y0 +y1 +00 +y0 +y1 --- --- --- --- --- --- --- ?? ?? ?? ?? ?? ?? ??
Na prenos do vyššieho rádu použite funkciu nasledovník () z predchádzajúcej úlohy.
Návod 2 (algebraický). Uvedomte si, že a že . Preto napríklad . Upravte tento výraz tak, aby sa dal zapísať iba pomocou , , funkcie a rekurzívneho volania , ktoré má hodnotu . Podobne postupujte aj v ostatných prípadoch.
Testovanie.
Add_test = r:Results_n
Úloha. Násobenie. Binárnou rekurziou zadefinujte funkciu násobenie .
Návod. Využite algebraický návod k funkcii . Použite iba rekurzívne volanie , funkciu a binárne konštruktory. Binárnu diskrimináciu použite iba na jeden argument.
Testovanie.
Mul_test = r:Results_n
Úloha. Druhá mocnina. Binárnou rekurziou zadefinujte funkciu druhej mocniny . Nepoužite žiadne doteraz naprogramované ani vlastné pomocné funkcie okrem sčítania.
Návod. Uvedomte si, že a teda . Upravte tento výraz tak, aby sa dal zapísať iba pomocou , , sčítania a rekurzívneho volania , ktoré má hodnotu . Podobne postupujte pri .
Testovanie.
Square_test = r:Results_n
Úloha. Umocnenie. Binárnou rekurziou zadefinujte funkciu umocnenie .
Návod. Postupujte podobne ako pri funkcii , teda vyjadrite pomocou už zadefinovaných operácií a rekurzie hodnoty a . Použite funkcie a .
Testovanie.
Exp_test = r:Results_n
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) – d) môžete odovzdať nezávisle od seba. Časť d) sa nachádza v súbore ex04b.cl.
a) (2 body) Dokážte, že pre vašu definíciu funkcie platí:
(Exp_succ) |
Použite svoju definíciu funkcie , úplnú indukciu, analýzu prípadov
(N2_cover) |
ďalej fakty
definície konštruktorov a a vlastnosti sčítania a násobenia. Nepredpokladajte, že skutočne počíta umocnenie!
b) (1 bod) Naprogramujte binárnou rekurziou funkciu , ktorá počíta predchodcu čísla , teda . Nepoužite žiadne pomocné funkcie, okrem a ani žiadne zabudované aritmetické operácie.
Testovanie.
Pred_test = r:Results_n
c) (1 bod) Binárnou rekurziou naprogramujte funkciu , ktorá počíta rozdiel čísel a za predpokladu, že , teda
(Sub_spec) |
V prípade, že , môže byť hodnota ľubovoľná.
Použite pomocnú funkciu a binárne konštruktory. Nepoužite iné pomocné funkcie, žiadne zabudované aritmetické operácie ani porovnania.
Testovanie.
Sub_test = r:Results_n