ϵ">]>
4. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2012/2013
ČASŤ A
http://dai.fmph.uniba.sk/courses/udp/ex/ex04.zip
Dátum: 5. 3. 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é dyadickej číselnej sústave a operáciám na dyadickom zápise čísel – aritmetickým (ex04a) a symbolickým (ex04b).
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.
Dyadický zápis čísla. Každé prirodzené číslo možno jednoznačne zapísať v tvare
kde pre všetky , .
Postupnosť … nazývame dyadickým zápisom (dyadickou reprezentáciou) čísla .
Napríklad
Dyadický zápis čísla je teda
[CL] Dyadické konštruktory. V CL sú preddefinované funkcie
nazývané dyadické konštruktory. Pomocou nich môžeme konštruovať dyadický zápis čísel. Funkciu môžeme chápať ako „pridaj číslicu 1 na koniec dyadického 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 S2 S1 S1(0) = n
50 = n & S1(n) = p & S2(n) = q
[CL] Dyadický formát. CL dokáže zobraziť hodnotu premennej v Query v dyadickom zápise pomocou dyadického formátu .
Syntax:
hodnota = premenna:N2
Hodnota sa zobrazí akoby bola skonštruovaná z 0 pomocou konštruktorov a .
[CL] Úloha. Vyhodnoťte nasledujúce dopyty (queries):
17 = n:N2
17+12 = n & n = m:N2
S1 S2 S1 S2 S1(0) = n & n = m:N2
[CL] Dyadická diskriminácia. Každé prirodzené číslo je buď alebo dyadický zápis končí číslicou 1 alebo dyadický zápis končí číslicou 2. Tieto možnosti sú vzájomne výlučné.
(N2_cover) |
(N2_excl) |
Tieto 3 možnosti tvoria dyadickú 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).
Dyadickú diskrimináciu možno dosadiť do argumentov definovanej funkcie:
V tomto cvičení používajte iba dyadickú diskrimináciu!
[CL] Úloha. Zadajte nasledujúce dopyty (queries) pre viacero rôznych hodnôt :
17 = n:N2 & n = 0
17 = n:N2 & n = S1(m)
17 = n:N2 & n = S1(m:N2)
17 = n:N2 & n = S2(m)
17 = n:N2 & n = S2(m:N2)
Dyadická rekurzia. Ak funkciu zadefinujeme tak, že všetky rekurzívne volania majú menší počet dyadických číslic ako pôvodný argument, teda
hovoríme o dyadickej rekurzii. Dyadická rekurzia je špeciálnym prípadom všeobecnej (course-of-values) rekurzie, pretože
Všetky funkcie v tomto cvičení definujte iba dyadickou rekurziou!
Poznámka. Dyadickou 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 dyadickom zápise argumentov operácie, nie od hodnoty argumentov.
Úloha. Nasledovník. Dyadickou rekurziou zadefinujte funkciu nasledovník .
Návod. Predstavte si dyadickú verziu sčítania, ako ste sa ho učili na základnej škole. Uvedomte si, kedy nastáva prenos do vyššieho rádu.
0211 (11) 0212 (12) 0222 (14) + 1 + 1 + 1 ---- ---- ----- 0212 (12) 0221 (13) 01111 (15)
Testovanie.
Succ_test = r:Results_n
Úloha. Sčítanie. Dyadickou rekurziou zadefinujte funkciu sčítanie .
Návod 1 (názorný). Predstavte si dyadickú verziu sčítania, ako ste sa ho učili na základnej škole. Rozoberte jednotlivé prípady:
0 x1 x1 x1 x2 x2 x2 + y + 0 +y1 +y2 + 0 +y1 +y2 --- --- --- --- --- --- --- ?? ?? ?? ?? ?? ?? ??
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. Dvojnásobok. Dyadickou rekurziou zadefinujte funkciu dvojnásobok . Nepoužite žiadne pomocné funkcie, ani tie, ktoré ste doteraz naprogramovali.
Návod. Uvedomte si, že a teda . Upravte tento výraz tak, aby sa dal zapísať iba pomocou , a rekurzívneho volania , ktoré má hodnotu . Podobne postupujte pri .
Testovanie.
Twice_test = r:Results_n
Úloha. Násobenie. Dyadickou rekurziou zadefinujte funkciu násobenie .
Návod. Postupujte podobne ako pri funkcii . Použite funkcie a . Dyadickú diskrimináciu použite iba na jeden argument.
Testovanie.
Mul_test = r:Results_n
Úloha. Umocnenie. Dyadickou rekurziou zadefinujte funkciu umocnenie .
Návod. Postupujte podobne ako pri funkcii , teda vyjadrite pomocou už zadefinovaných operácií a rekurzie hodnoty a . Namiesto dvoch rovnakých rekurzívnych volaní použite priradenie do novej premennej (viď úvod ex03a).
Testovanie.
Exp_test = r:Results_n
Prémiová domáca úloha du04a. (2+2 body) Pravidlá pre prémiové domáce úlohy nájdete na http://dai.fmph.uniba.sk/courses/udp#pdu
Časti a) a b) môžete odovzdať nezávisle od seba.
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) |
a fakt, že platí
definície konštruktorov a a vlastnosti sčítania a násobenia. Nepredpokladajte, že skutočne počíta umocnenie!
b) (2 body) Naprogramujte dyadickou rekurziou funkciu , ktorá počíta predchodcu čísla , teda .
Testovanie.
Pred_test = r:Results_n