ϵ">]>
11. CVIČENIE Z PREDMETU ÚVOD DO DEKLARATÍVNEHO PROGRAMOVANIA LS 2014/2015
http://dai.fmph.uniba.sk/courses/udp/ex/ex11.zip
Dátum: 13. 5. 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
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.
Konštruktor všeobecných stromov. Všeobecné stromy kódujeme jediným konštruktorom , kde je hodnota uložená vrchole a je zoznam podstromov.
Konštruktor je zadefinovaný v module nasledovne:
[CL] Diskriminácia na konštruktor všeobecných stromov. Pretože je párovací konštruktor (viď [1, §18.1]), CL umožňuje nasledujúcu diskrimináciu s jedným prípadom:
Často budeme potrebovať skombinovať túto diskrimináciu so zoznamovou:
Kódy všeobecných stromov. Predikát platí, ak je zoznamom všeobecných stromov. Predikát platí, ak je všeobecným stromom (presnejšie kódom všeobecného stromu).
[CL] Formátovanie kódov všeobecných stromov. Predikát môžeme použiť ako formát na zobrazenie čísel vo forme všeobecných stromov.
Úloha. Vyskúšajte nasledujúce dopyty (queries):
223759839492 = t:Gt
1,1,(1,2,0),(1,3,0),(1,4,0),0 = t:Gt
Predikát môžeme podobne použiť na zobrazenie čísel vo forme zoznamov všeobecných stromov.
[CL] Formátovanie kódov všeobecných stromov so znakmi vo vrcholoch. Predikát zadefinovaný v module môžeme použiť ako formát na zobrazenie čísel vo forme všeobecných stromov so znakmi vo vrcholoch (znak je v CL číslo menšie ako 256).
Úloha. Vyskúšajte nasledujúce dopyty (queries):
1,102,(1,120,0),(1,121,0),0 = t:Gtc
Gnd(102,Gnd(120,0),Gnd(121,0),0) = t:Gtc
Pomôcka na testovanie – syntaktické stromy aplikačných výrazov. V module je zadefinovaná funkcia , ktorej hodnotou pre reťazec obsahujúci dobre uzátvorkovaný aplikačný výraz je syntaktický strom tohto výrazu. Aplikačný výraz je tvorený konštantami a aplikáciami funkcií na aplikačné výrazy. Mená konštánt a funkcií vo výrazoch sú jednoznakové. Tieto znaky sú uložené vo vrcholoch syntaktického stromu aplikačného výrazu. Napríklad:
Stromy vytvorené funkciou budeme v tomto cvičení využívať na testovanie. Nasledujúca konštanta je reťazec s príkladom zložitejšieho aplikačného výrazu.
Úloha. Vyskúšajte nasledujúce dopyty (queries):
'f(x,y)' = s:Str & S2gtc(s) = t:Gtc
'f(g(x,y),z,h(u))' = s:Str & S2gtc(s) = t:Gtc
Fgxyzhup_ = s:Str & S2gtc(s) = t:Gtc
Úloha. Veľkosť všeobecného stromu. Zadefinujte funkciu , ktorej hodnotou je veľkosť všeobecného stromu , čiže počet jeho vrcholov. Naprogramujte a použite všeobecnejšiu funkciu , ktorej hodnotou je súčet veľkostí všeobecných stromov v zozname .
Postup, keď najprv naprogramujeme operáciu na zozname všeobecných stromov a potom ju špecializujeme na všeobecný strom, použijeme aj v ďalších úlohách.
Testovanie:
Sz_test = r:Results
Úloha. Hĺbka všeobecného stromu. Zadefinujte funkciu , ktorej hodnotou je hĺbka všeobecného stromu .
Testovanie:
Dp_test = r:Results
Úloha. Prvky všeobecného stromu. Zadefinujte predikát , ktorý platí, ak je číslo prvkom všeobecného stromu .
Testovanie:
Ingt_test = r:Results
Úloha. Zrkadlový obraz všeobecného stromu. Zadefinujte funkciu , ktorej hodnotou je zrkadlový obraz stromu .
Testovanie:
Reflect_test = r:Results_gtc
Úloha. Efektívny program pre zrkadlový obraz. Zadefinujte efektívnu verziu funkcie . Využite pomocnú funkciu , ktorá má vlastnosť:
Pri definícii nepoužite zreťazenie, ale využite akumulátor .
Testovanie:
Reflectal_test = r:Results_lgtc Reflect_efficient_test = r:Results_gtc
Úloha. Zadefinujte funkcie a . Hodnotou funkcie je zoznam prvkov stromu v poradí preorder. Zadanie pre funkciu je analogické.
Testovanie:
Preorder_test = r:Results_str Postorder_test = r:Results_str
Úloha. Efektívne prechody. Zadefinujte efektívne verzie funkcií a pomocou funkcií a , ktoré majú vlastnosti
Pri definíciách nepoužite zreťazenie, ale využite akumulátor .
Testovanie:
Preorderal_test = r:Results_str Preorder_efficient_test = r:Results_str Postorderal_test = r:Results_str Postorder_efficient_test = r:Results_str
Izomorfné všeobecné stromy. Pre dané všeobecné stromy a platí predikát práve vtedy, keď sú tieto stromy izomorfné, teda majú rovnaký tvar, ale nie nutne rovnaké hodnoty uložené vo vrcholoch.
Predikát je reláciou ekvivalencie na zoznamoch všeobecných stromov. Predikát je reláciou ekvivalencie na všeobecných stromoch. Navyše platí
a
Číslovanie vrcholov vo všeobecných stromoch. V nasledujúcich úlohách budeme číslovať vrcholy vo všeobecných stromoch. To znamená, že pre daný strom vytvoríme izomorfný strom, v ktorom sú hodnoty vo vrcholoch nahradené číslami v predpísanom poradí.
Úloha. Zadefinujte funkciu , ktorá očísluje vrcholy všeobecného stromu tak, aby pri výpise v poradí preorder tvorili súvislý interval prirodzených čísel .
Špecifikácia:
Návod. Zadefinujte a použite pomocnú funkciu , ktorá očísluje vrcholy stromov v zozname tak, aby pri výpise v poradí preorder tvorili súvislý interval prirodzených čísel . Využite funkciu alebo (podľa uváženia).
Špecifikácia:
Testovanie:
Num_prel_test = r:Results_lgt Num_pre_test = r:Results_gt
Úloha. Analogicky k predchádzajúcej funkcii zadefinujte funkciu , ktorá spĺňa špecifikáciu:
Testovanie:
Num_postl_test = r:Results_lgt Num_post_test = r:Results_gt
PRÉMIOVÁ DOMÁCA ÚLOHA du11. (2 body)
Termín odovzdania: nedeľa 27. 5. 2015 23:59:59
Pravidlá pre prémiové domáce úlohy nájdete na http://dai.fmph.uniba.sk/courses/udp/#pdu.
Zadefinujte funkciu , ktorej hodnota je rovnaká ako , teda spĺňa špecifikáciu:
Nepoužite funkciu veľkosť stromu ani veľkosť zoznamu stromov !
Návod. Využite pomocnú funkciu s vlastnosťou:
Funkcia teda súčasne vytvorí očíslovaný les aj vypočíta prvé nepoužité číslo a vráti dvojicu obsahujúcu oba tieto výsledky.
Samozrejme, ani v tejto funkcii nepoužite ani .
Testovanie.
Num_postl1_test = r:Results_lgt_n Num_post1_test = r:Results_gt