Upload
phamngoc
View
221
Download
3
Embed Size (px)
Citation preview
RĪGAS TEHNISKĀ UNIVERSITĀTEDATORZINĀTNES UN INFORMĀCIJAS TEHNOLOĢIJAS
FAKULTĀTE
3. praktiskais darbs kursāProgresīvās datu bāzes
Deduktīvās DB projektēšana
Izstrādāja: Aleksis LieknaGrupa: DMD0-1
Apl. Nr. 051RDB081Pārbaudīja: prof. Jānis Eiduks
Rīga 2008
Saturs
1. Hierarhiskā uzdevuma definēšana...........................................................................................3
2. Faktu definēšana......................................................................................................................4
3. Likumu definēšana..................................................................................................................5
4. Izveduma piemērs....................................................................................................................7
5. Darba uzsākšana......................................................................................................................8
6. Faktu glabāšana un izgūšana.................................................................................................11
6.1. Plāns....................................................................................................................................11
6.2. Realizācija..........................................................................................................................13
7. Likumu glabāšana un izgūšana..............................................................................................27
8. Loģiskā izveduma realizēšana...............................................................................................36
9. Piemēri...................................................................................................................................40
Secinājumi.....................................................................................................................................42
1. Hierarhiskā uzdevuma definēšana
Darbā ir izvēlēta izgudrojumu hierarhija. Šī hierarhija atspoguļo kādi izgudrojumi ir
balstīti uz kādiem citiem izgudrojumiem. Kā piemēru var minēt elektrisko spuldzīti, kuras
izgudrošanai kā priekšnosacījums ir elektrības, stieples un stikla izgudrošana. Darbā atspoguļotā
struktūra sevī ietver izgudrojumu hierarhiju, kas atspoguļo iedomāta izgudrojuma, proti, „telpas
izliekuma radītāja” izgudrošanai nepieciešamos priekšnosacījumus (vienu uz otra balstītus
izgudrojumus). Problēmvides hierarhiskā diagramma grafa veidā ir attēlota 1.1. attēlā.
1.1. att. Problēmvides hierarhiskā diagramma.
Aplūkojot attēlu redzams, ka telpas izliekuma radītājam ir nepieciešama astrālās plazmas
gaisma un iecementēts ziloņkauls. Katram no šiem izgudrojumiem ir nepieciešami vēl kādi citi
izgudrojumi, kuriem var būt nepieciešami vēl citi izgudrojumi utt.
3
2. Faktu definēšana
Pirmajā nodaļā aprakstītā hierarhiskā uzdevuma realizēšanai ir nepieciešams definēt
faktus, ar kuru palīdzību šo hierarhiju aprakstīt. Viens no šādiem faktu tipiem varētu būt „sastāv
no” ar diviem parametriem – „sastāv no (X, Y)”, kur X ir izgudrojums, bet Y - kāds cits
izgudrojums, kurš nepieciešams izgudrojumam X. Tipiski piemēri varētu būt šādi:
sastāv no (cements, java)
sastāv no (cements, ūdens)
sastāv no (cements, smiltis)
Vēl viens fakts, kuru iespējams definēt ir „ir izgudrots” ar vienu parametru –
„izgudrots(X)”, kur X apzīmē izgudrojumu. Ar šī fakta palīdzību iespējams norādīt to, vai
izgudrojums ir izgudrots vai nē. Tipisks piemērs varētu būt šāds:
ir izgudrots (elektrība)
Ar šiem diviem definētajiem faktiem ir pietiekoši, lai ķertos klāt pie likumu definēšanas.
Tas nekas, ka sākumā viss izskatās pliekani un vienkārši – īstā „odziņa” vēl sekos.
Darba autors vēlas atzīmēt, ka apzinās faktu, ka predikātu nosaukumos un parametros
nav pieļaujamas tukšumzīmes, taču šī prasības likumu un faktu definēšanas ietvaros nav
ierētotas, lasāmības un saprotamības palielināšanas nolūkos
4
3. Likumu definēšana
Balstoties uz definētajiem faktiem ir iespējams definēt likumus, uz kuriem balstīt
izveduma mehānismu. Pirmais no likumiem, kuru iespējams definēt ir likums „ir lapa” ar 1
parametru – „lapa(X)”, kur X ir izgudrojums. Ar šī likuma palīdzību ir iespējams noskaidrot vai
izgudrojums X atrodas hierarhiskās struktūras apakšā – ir koka struktūras lapa. Likums
nepieciešams, lai varētu noskaidrot vai izgudrojumam X ir „bērni” – izgudrojumi, kuru
izgudrošana ir nepieciešama izgudrojuma X realizācijai. Nenorādot parametru X tiktu iegūti visi
izgudrojumi, kuriem nav „bērnu”. Šī likuma definējums varētu būt šāds:
ir lapa (X) :- NE (sastāv no (X, Y))
Nākošais likums, kuru ir iespējams definēt, ir likums „ir izveidojams” ar vienu parametru
– „ir izveidojams(X)”, kur X ir izgudrojums. Ar šī likuma palīdzību iespējams noskaidrot vai
pašreiz ir iespējams izveidot izgudrojumu X. Loģika ir šāda, proti, izgudrojumu X ir iespējams
izveidot, ja ir izgudroti visi izgudrojumi, no kuriem tas sastāv. Nenorādot parametru X tiktu
iegūti visi izveidojamie izgudrojumi. Likuma definējums varētu būt šāds:
ir izveidojams (X) :- sastāv no (X, Y), ir izgudrots (Y)
Nākošais likums ir likums „eksistē zarā” ar diviem parametriem – „eksistē zarā(X, Y)”.
Ar šī likuma palīdzību ir iespējams noteikt, vai izgudrojums Y atrodas zarā zem izgudrojuma X.
Šādi var noskaidrot, piemēram, vai kāda izgudrojuma neesamība ietekmētu kādu citu
izgudrojumu. Likuma pielietošanā iespējamas arī variācijas, piemēram, norādot tikai parametru
X, tiktu iegūti visi izgudrojumi, kuri atrodas „zem” šī izgudrojuma visa zara ietvaros (ne tikai
tiešie pēcteči). Norādot tikai parametru Y tiktu iegūti visi izgudrojumi, kuru pastāvēšanai tieši
vai pastarpināti ir nepieciešams šis izgudrojums. Minētais likums ietver sevī rekursiju, un tā
definējums varētu būt šāds:
eksistē zarā (X, Y) :- sastāv no (X, Z), eksistē zarā (Z, Y)
Vēl viens likums, kuru iespējams definēt ir likums „varētu izveidot” ar vienu parametru –
„varētu izveidot(X)”, kur X ir izgudrojums. Ar šī likuma palīdzību ir iespējams noteikt, vai
izgudrojumu X būtu iespējams izveidot. Loģika ir šāda, proti, izgudrojumu varētu izveidot, ja tas
ir izveidojams (ir izgudrotas visas tā sastāvdaļas), vai arī tā sastāvdaļas varētu izveidot. Kā
5
piemēru varētu minēt pirmajā nodaļā definētās hierarhijas elementu „plazmas lampiņa”. Tās
izveidošanai ir nepieciešama lampa un plazmas pulveris. Pieņemsim, ka lampa jau ir izgudrota,
bet plazmas pulveris nav. Pieņemsim arī, ka ir izgudrotas visas plazmas pulverim nepieciešamās
sastāvdaļas (šķidra plastmasa un sasaldētas varžu kājiņas). Šādā gadījumā izgudrojums „plazmas
lampiņa” nav izveidojams (jo plazmas pulveris nav izgudrots), taču ir izveidojams (jo plazmas
pulveris ir izveidojams – visas tā sastāvdaļas ir izgudrotas). Minētais likums ietver sevī rekursiju,
un tā definējums varētu būt šāds:
varētu izveidot (X) :- ir izveidojams (X) VAI (sastāv no(X, Y), varētu izveidot (Y))
6
4. Izveduma piemērs
Izveduma piemēra ietvaros, autors piedāvā aplūkot likuma „varētu izveidot” izsaukšanu,
kā parametru norādot „plazmas lampiņa”. Ar šī izveduma piemēra palīdzību ir iespējams noteikt
vai plazmas lampiņu varētu izveidot vai nē. Izveduma piemēra grafiskais attēlojums ir redzams
4.2. attēlā.
4.2. att. Izveduma piemēra grafiskais attēlojums
7
5. Darba uzsākšana
Lai uzsāktu darbu ar uzdevuma realizāciju, autors uzskata par vajadzīgu izveidot jaunu
lietotāju un tabulu telpu, piešķirot jaunizveidotajam lietotājam nepieciešamās tiesības vienīgi uz
jaunizveidoto tabulu telpu. Izmantojot šādu pieeju, ir iespējams nodrošināt darba izpildi,
neatkarīgi no pārējo datu bāzes lietotāju darbības un, pats galvenais, netraucējot viņiem.
Lai šo ieceri īstenotu, vispirms nepieciešams sistēmā autorizēties ar lietotāju „SYSTEM”
(sk. 5.3. att.).
5.3. att. Autorizācija sistēmā ar lietotāju „SYSTEM”
Pēc tam ir iespējams izveidot jaunu tabulu telpu (sk. 5.4. att.).
5.4. att. Jaunas tabulu telpas izveidošana
Tad ir iespējams izveidot jaunu sistēmas lietotāju (sk. 5.5. att.).
8
5.5. att. Jauna lietotāja izveide
Tagad ir iespējams jaunizveidotajam lietotājam piekļuvi jaunizveidotajai tabulu telpai (sk. 5.6.
att.).
5.6. Piekļuves piešķiršana tabulu telpai
Visbeidzot lietotājam jāpiešķir nepieciešamās tiesības izveidot un aplūkot dažādus datu bāzes
elementus. To var panākt, pievienojot šo lietotāju iepriekšējo laboratorijas darbu gaitā
izveidotajai lietotāju grupai „laboriem” (sk. 5.7. att.).
5.7. att. Lietotāja pievienošana iepriekš izveidotajai lietotāju grupai
9
Kad visas augstākminētās darbības izpildītas, ir iespējams autorizēties sistēmā ar jaunizveidoto
lietotāju (sk. 5.8. att.).
5.8. att. Autorizācija sistēmā ar jaunizveidoto lietotāju
Tagad sistēma ir gatava darbam ar realizāciju.
10
6. Faktu glabāšana un izgūšana
6.1. Plāns
Sāksim ar faktu glabāšanu. Otrajā nodaļā definēto faktu glabāšanai izvēlēsimies divu
tabulu struktūru. Pirmā tabula „izgudrojumi” saturēs izgudrojuma identifikatoru, nosaukumu, kā
arī informāciju par to, vai šis izgudrojums jau ir izgudrots. Otrajā tabulā glabāsim izgudrojumu
koku – hierarhisko struktūru norādot priekšteci un pēcteci no izgudrojumu tabulas. Glabāšanas
struktūra ir redzama 6.9. attēlā.
6.9. att. Glabāšanas struktūra
Kā redzams, struktūrā eksistē divas saites – „Saite S1” un „Saite S2”, kuras nodrošina
attiecīgi priekšteča un pēcteča piesaisti izgudrojumu koka tabulai no izgudrojumu tabulas.
Aprakstīsim veidojamās struktūras nedaudz sīkāk. Sāksim ar izgudrojumu tabulu.
Nosauksim šo tabulu „inventions” un aplūkosi tās atribūtu sarakstu (sk. 6.1. tabulu).
6.1. tabula
Tabulas “inventions” atribūtu saraksts
NRPK Nosaukums Datu tips Komentāri
1 id_invention Number Primārā atslēga
2 invention_title Varchar2(50) Izgudrojuma nosaukums
3 invention_invented Number(1) Nosaka vai izgudrojums
jau ir izgudrots
Pēc tam pāriesim pie izgudrojumu koka tabulas. Nosauksim šo tabulu „invention_tree”
un aplūkosim arī šīs tabulas atribūtu sarakstu (sk. 6.2. tabulu).
6.2. tabula
Tabulas “invention_tree” atribūtu saraksts11
NRPK Nosaukums Datu tips Komentāri
1 id_invention_tree Number Primārā atslēga
2 predcessor_id Number Tā izgudrojuma
identifikators, kurš koka
struktūrā atrodas augstāk
par izgudrojumu ar
identifikatoru
„successor_id”
3 successor_id Number Tā izgudrojuma
identifikators, kurš koka
struktūrā atrodas zemāk
par izgudrojumu ar
identifikatoru
„predcessor_id”
Pāriesim pie faktu ievades un izvades. Lai faktus būtu iespējams ērti ievadīt un izgūt, ir
nepieciešams izveidot skatus. Veidosim šos skatus tā, lai ar izgudrojumiem varētu darboties,
izmantojot to nosaukumus (nav jāķēpājas ar identifikatoriem). Skatus veidosim arī tā, lai katrs no
tiem atbilstu konkrētam faktu tipam, tādējādi maksimāli vienkāršojot darbu ar šiem faktiem. Līdz
ar to izkristalizējas divi veidojamie skati. Pirmais no tiem ir izgudrojumu koka skats, kurš
atspoguļo izgudrojumu kokveida struktūru – priekšteci un pēcteci (to nosaukumus). Otrais ir
izgudroto izgudrojumu skats, un norāda to izgudrojumu nosaukumus, kuri ir izgudroti. Drošības
un atkļūdošanas pēc šajā skatā iekļausim arī lauku, kas parāda izgudrojuma izgudrošanas status
(ir izgudrots vai nav)
Darbu ar faktiem ir iespējams vienkāršot vēl vairāk, ja faktu ievadīšanai un pieprasīšanai
izmanto funkcijas un procedūras. Šī iemesla dēļ izveidosim divas pakotnes – faktu definēšanas
un faktu pieprasīšanas pakotni. Minētās ieceres grafisks atspoguļojums ir parādīts 6.10. attēlā.
12
6.10. att. Ieceres grafiskais atspoguļojums
Realizācija izmantosim angliskos nosaukumus. Līdz ar to, skaidrības ieviešanai, 6.11. attēlā ir
attēlots pirmajā nodaļā definētā hierarhiskā uzdevuma „angliskais variants”.
6.11. att. Hierarhiskā uzdevuma „angliskais variants”
6.2. Realizācija
Pēc izstrādes plāna sastādīšanas ir iespējams ķerties klāt pie uzdevuma realizācijas.
Sāksim ar glabāšanas struktūru realizāciju, un kā pirmo izveidosim izgudrojumu tabulu, proti,
tabulu „inventions” (sk. 6.12. att.).
13
6.12. att. Tabulas „inventions” izveidošana
Izveidosim arī virkni šīs tabulas primārās atslēgas lauka pēcākai automātiskai aizpildīšanai (sk.
6.13. att.).
6.13. att. Virknes „inventions_pk” izveidošana
Pēc tam varam pāriet pie izgudrojuma koka tabulas, proti, tabulas „invention_tree” izveidošanas
(sk. 6.14. att.).
6.14. att. Tabulas „invention_tree” izveidošana
14
Šai tabulai varam izveidot virkni un trigeri primārās atslēgas lauka automātiskas aizpildīšanas
nodrošināšanai (sk. 6.15. att.).
6.15. att. Virknes „invention_tree_pk” un trigera „invention_tree_pk” izveidošana
Līdz ar augstākminēto darbību izpildi esam beiguši darbu pie glabāšanas struktūras
izveides, un varam pievērsties izgūšanas struktūru – skatu veidošanai. Sāksim ar izgudroto
izgudrojumu skatu, kuru nosauksim par „inventions_invented” (sk. 6.16. att.).
6.16. att. Skata „inventions_invented” izveidošana
Pēc tam varam izveidot izgudrojuma koka skatu, proti, skatu „invention_tree_view” (sk. 6.17.
att.).
15
6.17. att. Skata „inveniton_tree_view” izveidošana
Veidosim datu ievadi tā, lai datus varētu pa tiešo ievadīt šajos skatos. Līdz ar to, ir
nepieciešams katram no izveidotajiem skatiem pievienot „instead of insert” tipa trigeri, lai
nodrošinātu INSERT vaicājuma korektu izpildi un atbilstošo datu pareizu saglabāšanu
atbilstošajās tabulās. Vispirms izveidosim šādu trigeri skatam „invention_tree_view” (sk. 6.18.
att.). Trigera darbības loģika ir šāda. Vispirms tiek pārbaudīts, vai eksistē norādītais priekštecis.
Ja šāds priekštecis neeksistē, tad tādu izveido un pieglabā izveidotā ieraksta identifikatoru.
Pretējā gadījumā iegūst eksistējošā priekšteča identifikatoru. Tieši tāpat rīkojas ar pēcteci.
Visbeidzot tiek veidots jauns ieraksts izgudrojumu koku tabulā. Šis ieraksts satur iepriekš izgūtos
un/vai pieglabātos priekšteču un pēcteču identifikatorus.
16
6.18. att. Trigera „invention_tree_insert” izveidošana
Tagad varam pāriet pie trigera izgudroto izgudrojumu skatam izveides (sk. 6.19. att.).
17
6.19. att. Trigera „inventions_invented_insert”
Trigera darbības loģika ir šāda, proti, ja ir atrasts izgudrojums ar norādīto nosaukumu, tad
šim izgudrojumam tiek piešķirts jaunuzstādāmais izgudrošanas statuss( 1- izgudrots, 0 –
neizgudrots). Pretējā gadījumā tiek veidots jauns ieraksts izgudrojumu tabulā, kurš satur norādīto
izgudrojuma nosaukumu, kā arī izgudrojumu izgudrošanas statusu.
Pēc trigeru izveides, ir iespējams ķerties klāt pie faktu definēšanas pakotnes izveides.
Nosauksim šo pakotni „fact_define” un veiksim tās izveidošanu (sk. 6.20. att.).
6.20. att. Pakotnes „fact_define” izveidošanas
18
Kā redzams, pakotnē ir divas procedūras – faktu „ir izgudrots” un „sastāv no”
definēšanas implementācijas. Minētajām procedūrā ir doti angliski nosaukumi, līdz ar ko „ir
izgudrots” ir pārtapis par „invented”, bet „sastāv no” kļuvis par „precedes”.
Pēc pakotnes izveidošanas, nepieciešamas izveidot arī tās ķermeni (sk. 6.21. att.).
6.21. Pakotnes „fact_define” ķermeņa izveidošana
Kā redzams, faktu definēšanas pakotnē esošās procedūras sastāv vienīgi no INSERT tipa
vaicājumiem, kuri tiek izpildīti iepriekš izveidotajiem skatiem, kam piekārtoti „instead of insert”
trigeri.
Tagad varam pāriet pie faktu ievadīšanas. Vispirms ievadām faktus par izgudrojumu
hierarhisko struktūru (sk. 6.22. att.).
19
6.22. att. Faktu par hierarhisko struktūru ievade
Pēc tam varam ievadīt faktus par izgudrotajiem izgudrojumiem (sk. 6.23. att.).
20
6.23. att. Faktu par izgudrotajiem izgudrojumiem ievade
Tagad esam ievadījuši faktus, un būtu jauki aplūkot ievades rezultātus. Lai šo ieceri
realizētu, vispirms nepieciešams implementēt faktu izgūšanas pakotni. Sāksim ar dažu tipu
definēšanu, kurus pēc tam izmantosim gan faktu, gan likumu izgūšanai. Vispirms definēsim tipu
„string_array”, kā kolekciju no „VARCHAR2(50)” tipa elementiem (sk. 6.24. att.).
6.24. att. Tipa „string_array” izveidošana
Pēc tam izveidosim „invention_result” objektu tipu, kurš paredzēts viena hierarhiskās
struktūras ieraksta pieglabāšanai (sk. 6.25. att.).
21
6.25. att. Objektu tupa „invention_result” izveidošana
Tā kā būs nepieciešams operēt arī ar vairākiem hierarhiskās struktūras ierakstiem, tad izveidosim
arī kolekcijas tipu „invention_results” no „invention_result” tipa objektiem (sk. 6.26. att.).
6.26. att. Kolekcijas tipa „invention_results” izveidošana
Kad esam izveidojuši nepieciešamos tipus, varam ķerties klāt pie faktu izgūšanas
pakotnes izveidošanas (sk. 6.27. att.).
6.27. att. Pakotnes „fact_request” izveidošana
22
Šī pakotne satur faktu „invented” un „precedes” izgūšanas implementāciju. Ir iekļautas arī
procedūras „invented_print” un „precedes_print” palīdzību. Loģika ir šāda, proti, „invented” un
„precedes” ir funkcijas, kuras atgriež atbilstošās datu struktūras, kuras citas funkcijas vai
procedūras var izmantot savā darbībā. Procedūras ar nobeigumu „_print” attēlo minēto funkciju
izpildes rezultātu lietotājam saprotamā veidā.
Pēc pakotnes izveidošanas, nepieciešams izveidot tās ķermeni. Ķermeņa izveidošana ir
parādīta 6.28. un 6.29. attēlos.
6.28. att. Pakotnes „fact_request” ķermeņa izveidošana
23
6.29. att. Pakotnes „fact_request” izveidošanas turpinājums
Nedaudz aprakstīsim izveidotās pakotnes ķermeņa saturu. Funkcija „invented” atbild par
datu izgūšanu no izgudroto izgudrojumu skata. Ja tai padotais izgudrojuma nosaukums ir
„NULL”, tad funkcija atgriež visu izgudroto izgudrojumu sarakstu. Pretējā gadījumā funkcija
atgriež „TRUE”, ka izgudrojums ar šādu nosaukumu ir izgudrots, vai „FALSE” pretējā
gadījumā.
Procedūra „invented_print” vienkārši izvada visas iespējamās funkcijas „invented”
atgrieztās vērtības datu bāzes izvades buferī.
Funkcija „precedes” atgriež visu izgudrojumu koku, ja abi tās parametri ir „NULL”,
visus vienas virsotnes bērnus, ka „NULL” ir otrais parametrs, visus virsotnes priekštečus, ja 24
„NULL” ir pirmais parametrs. Ja abi parametri nav „NULL”, tad funkcija atgriež „TRUE”
gadījumā, ja „successor_title_” ir „predcessor_title_” bērns vai „FALSE” pretējā gadījumā.
Procedūra „precedes_print” vienkārši izvada visas iespējamās funkcijas „precedes”
atgrieztās vērtības datu bāzes izvades buferī.
Tagad, kad esam izveidojuši faktu izgūšanas struktūru, ir pienācis laiks pārbaudīt
izveidoto pakotņu darboties spēju. Lai to panāktu, vispirms ieslēdza servera izejas bufera
parādīšanu uz ekrāna (sk. 6.30. att.).
6.30. att. Servera izejas parādīšanas ieslēgšana
Tagad varam izpildīt vienkāršu pārbaudi, izgūstot visu izgudrojumu koku (sk. 6.31. att.).
6.31. att. Visa koka izgūšana
25
Kā redzams, koka struktūras dati ir ievadīti un tiek izgūti korekti. Tagad varam pārbaudīt
izgudrotos izgudrojumus, izgūstot tos visus (sk. 6.32. att.).
6.32. att. Izgudroto izgudrojumu uzgūšana
Kā redzams, arī izgudrotie izgudrojumi ir ievadīti, kā arī tiek uzgūti pareizi. Līdz ar to varam
uzskatīt darbu pie faktiem par pabeigtu, un ir īstais brīdis ķerties klāt likumiem.
26
7. Likumu glabāšana un izgūšana
Likumi tiks realizēti kā likumu pieprasīšanas pakotne, kas griežas pēc informācijas pie
izveidotās faktu pieprasīšanas pakotnes, kā arī veic rekursīvus izsaukumus pati uz saviem
struktūras elementiem. Likumu glabāšana kā tāda sistēmā nav paredzēta, jo pēc autora domām,
likumu glabāšana atsevišķa tabulā, norādot to, kā likums ir saistīts ar faktiem, ir viegli
realizējama tikai vienkāršu likumu gadījumā. Daži no šajā darbā esošajiem likumiem ir
uzskatāmi par pietiekoši komplicētiem, lai to glabāšana atsevišķā tabulā izrādītos pārāk sarežģīta
vienkāršas realizācijas ietvaros. Šī iemesla dēļ darba autors ir izvēlējies programmēšanas pieeju,
proti, ar pakotņu palīdzību apkopot likumus realizējošās funkcijas un procedūras. Paredzētā
struktūra ir redzama 7.33. attēlā.
7.33. att. Likumu struktūra
Balstoties uz izvēlēto likumu struktūras skici, ir iespējams veikt likumu pieprasīšanas
pakotnes realizāciju. Likumu pieprasījuma pakotnes izveidošana ir redzama 7.34. attēlā.
27
7.34. att. Pakotnes „law_request” izveidošana
Kā redzams, pakotne satur visus iepriekš definētos likumus, un to „_print” versijas
lietotāja izvades nodrošināšanai. Tā kā realizācija ir izmantoti angliskie nosaukumi, tad,
skaidrības ieviešanai, ir iespējams precizēt, ka „ir izveidojams” ir pārtapis par „can_be_made”,
„ir lapa” ir pārtapis par „is_leaf”, „eksistē zarā” ir pārtapis par „exists_in_branch”, bet „varētu
izveidot” par „could_be_made”.
Tā kā šīs pakotnes ķermeņa garums krietni pārsniedz viena ekrānuzņēmuma izmērus, pie
kam ir nepārskatāms „SQL-PLUS” vidē, tad autors piedāvā aplūkot ķermeni daļu pa daļai,
izmantojot ekrānuzņēmumus no „Notepad++” vides.
Sāksim ar pirmo daļu, kurā attēlotas funkcija „can_be_made” un procedūra
„can_be_made_print”. Procedūra „can_be_made_print” vienkārši izvada uz ekrāna funkcijas
„can_be_made” darbības rezultātus lietotājam saprotamā veidā. Funkcijas „can_be_made”
darbības algoritms ir šāds, proti, tiek atgriezta vērtība 1, ja visi norādītā izgudrojuma pēcteči ir
izgudroti vai 0 pretējā gadījumā.
28
7.35. att. Funkcija „can_be_made” un procedūra „can_be_made_print”
Pāriesim pie nākošās ķermeņa daļas, kurā attēlotas funkcija „is_leaf” un procedūra
„is_leaf_print” (sk. 7.36. att.). Procedūra „is_leaf_print” vienkārši izvada uz ekrāna funkcijas
„is_leaf” darbības rezultātus lietotājam saprotamā veidā. Funkcijas „is_leaf” darbības algoritms
ir šāds, proti, vispirms tiek pārbaudīts, vai nodotais parametrs nav „NULL”. Ja parametrs ir
„NULL”, tad funkcija atgriež visu iespējamo lapu sarakstu. Pretējā gadījumā funkcija atgriež
„FALSE”, ja norādītais parametrs nav lapa, vai „TRUE”, ja parametrs ir lapa.
29
7.36. att. Funkcija „is_leaf” un procedūra „is_leaf_print”
Pāriesim pie nākošās ķermeņa daļas, proti, funkcijas „exists_in_branch”. Šīs funkcijas
izmērs pārsniedz viena ekrānuzņēmuma izmērus, tādēļ tā ir sadalīta divos attēlos, proti, 7.37. un
7.38. attēlos.
30
7.37. att. Funkcijas „exists_in_branch” pirmā daļa
Funkcijas darbības loģika ir šāda. Gadījumā, ja abi tai nodotie parametri ir „NULL”,
funkcija atgriež visu izgudrojumu koku. Gadījumā, ja „NULL” ir pēctecis, funkcija rekursīvi
uzbūvē visu zaru zem norādītā priekšteča. Gadījumā, ja „NULL” ir priekštecis, funkcija rekursīvi
uzbūvē visus zarus virs šī priekšteča. Gadījumā, ja norādīts gan priekštecis, gan pēctecis,
funkcija rekursīvi mēģina atrast pēcteci zem priekšteča. Atgriež „TRUE”, ja tas izdodas vai
„FALSE” – pretējā gadījumā.
31
7.38. att. Funkcijas „exists_in_branch” otrā daļa
Procedūra „exists_in_branch_print” (sk. 7.39. att.) vienkārši izvada uz ekrāna funkcijas
„exists_in_branch” darbības rezultātus lietotājam saprotamā veidā.
32
7.39. att. Procedūra „exists_in_branch_print”
Pāriesim pie nākošās ķermeņa daļas, proti. funkcijas „could_be_made” (sk. 7.40. att.).
7.40. att. Funkcija „could_be_made”
Šī funkcija atgriež visu iespējamo izgudrojumu sarakstu, kurus „varētu izveidot”, ja
norādītais parametrs ir „NULL”, vai arī rekursijas ceļā sniedz atbildi („TRUE” vai „FALSE”) uz
jautājumu par to, vai caur parametru nodoto izgudrojumu „varētu izveidot”.
33
Procedūra „could_be_made _print” (sk. 7.41. att.) vienkārši izvada uz ekrāna funkcijas
„could_be_made” darbības rezultātus lietotājam saprotamā veidā.
7.41. att. Procedūra „could_be_made_print”
Ķermeņa izveidošanas fragments redzams 7.42. attēlā
7.42. att. Ķermeņa izveidošanas fragments
34
Tagad varam veikt nelielu pārbaudi, iegūstot visus zem telpas izliekuma radītāja esošos
izgudrojumus (sk. 7.43. att.).
7.43. att. Zem telpas izliekuma radītāja esošie izgudrojumi
35
8. Loģiskā izveduma realizēšana
Šajā nodaļā aprakstīsim ceturtajā nodaļā dotā izveduma piemēra realizāciju. Mērķis bija
iegūt atbildi uz jautājumu, vai varētu izveidot plazmas lampu. Atbildi uz šo jautājumu var iegūt
ar vienu vienīgu „could_be_made_print” izsaukumu (sk. 8.44. att.).
8.44. att. Atbilde uz jautājumu
Kā redzams, atbilde ir „TRUE” – patiess. Šāda atbilde gan nav diez ko pārliecinoša, tādēļ
veiksim dziļākus pētījumus, un iziesim cauri ceturtajā nodaļā dotajam izveduma piemēram tagad
jau no programmatūras puses. Tātad, vispirms pārbaudām vai plazmas lampiņa ir izveidojama
(sk. 8.45. att.).
8.45. att. Plazmas lampiņas izveidojamības pārbaude
Pēc tam nosakām plazmas lampiņas pēctečus (sk. 8.46. att.).
36
8.46. att. Plazmas lampiņas pēcteču noteikšana
Tagad nosakām, vai ir izgudrota lampiņa (sk. 8.47. att.).
8.47. att. Vai ir izgudrota lampiņa
Nosakām arī, vai ir izgudrots plazmas pulveris (sk. 8.48. att.).
8.48. att. Vai plazmas pulveris izgudrots
Pārliecināmies, ka plazmas pulveris varētu tikt izveidots (sk. 8.49. att.).
37
8.49. Vai plazmas pulveris varētu tikt izveidots
Neticam ieraudzītajam un spītīgi nosakām plazmas pulvera pēctečus (sk. 8.50. att.).
8.50. att. Plazmas pulvera pēcteču noteikšana
Pārliecināmies, ka ir izgudrota plastmasa (sk. 8.51. att.).
8.51. att. Vai izgudrota plastmasa
Pārliecināmies, ka izgudrotas varžu kājiņas (sk. 8.52. att.).
38
8.52. Vai izgudrotas varžu kājiņas
Kā redzams, izveduma koks ir apiets korekti, un izstrādātās sistēmas funkcionēšana var tikt atzīta
par korektu.
39
9. Piemēri
Piemēri, izveduma koka apiešanas veidā, tika aplūkoti jau iepriekšējā nodaļā. Tādēļ
autors neredz jēgu šajā nodaļā to visu dublēt. Uzskatāmības pēc, daži piemēri tomēr tiek
piedāvāti.
Var noskaidrot, kādi izgudrojumi ir visā zarā zem astrālās sveces (sk. 9.53. att.).
9.53. att. Izgudrojumi zem astrālās sveces
Var arī noskaidrot, vai ūdens (sk. 9.54. att.) un lampiņa (sk. 9.55.) ir lapas.
9.54. att. Vai ūdens ir lapa
40
9.55. att. Vai lampa ir lapa
41
Secinājumi
Darba izstrādes gaitā tika izveidota deduktīvā datu bāze, kas darbojas uz faktu un likumu
pamata. Par realizāciju tika izvēlēta programmēšanas pieeja. To es piedāvāju kā alternatīvu
lekcijās minētajai pieejai, kad likumi jāglabā atsevišķā tabulā, kurā tad pēc tam norāda, kuri
likumi, no kuriem atkarīgi utml. Šāda pieeja varētu izdoties, ja likumi ir ļoti vienkārši pēc
būtības (piemēram, „māte”), bet tiklīdz rodas vajadzība pēc dažādiem nosacījumiem,
noliegumiem, rekursijām, cikliem un tamlīdzīgām lietām, šeit rodas milzīga problēmu jūra. Es
piedāvāju savu kuģi šajā jūrā – neizmantot tabulas likumu glabāšanai, bet gan visu nepieciešamo
noprogrammēt ar PL/SQL palīdzību.
Šīs idejas rezultātā tapa vairākas pakotnes ar funkcijām. Katra pakotne kalpo saviem
mērķiem attiecīgi – faktu definēšanai, faktu izgūšanai un likumu izgūšanai.
Faktu glabāšana tika realizēta ar relāciju tabulu palīdzību. Šīm tabulām tika izveidoti
skati, kas katrs simbolizē savu likumu. Šiem skatiem tika izveidoti „instead of insert” tipa trigeri,
lai dotu iespēju datus ievadīt tieši skatā. Datu ievadīšanu un izgūšanu no šiem skatiem atviegloja
izveidotās pakotnes ar funkcijām.
Darba gaitā saskāros ar vairākām tehniskām problēmām/niansēm, spilgtākās no kurām
vēlos atzīmēt šeit. Pirmā lieta ir – Oracle nedod iespēju „pa tiešo” ierakstīt ar SELECT INTO
palīdzību vienu objektu tāda paša tipa objekta kolekcijas tipa objektā pie nosacījuma, ka
kolekcija ir veidota no standarta tipa. Ar kolekcij Bulk collect
Nākošā lieta, ko vēlos atzīmēt, ir operatora „continue” neesamība PL/SQL valodā.
Bēdīgi. Lai gan šis operators tika ieviests ar Oracle 11 (man ir 10), tomēr, ja tā padomā, cik
gadiem bija jāpaiet, lai tik vienkāršu lietu ieliktu šādā sistēmā.
Trešā lieta, ar ko saskāros, ir Oracle nespēja atšķirt mainīgo nosaukumus un tabulas lauku
nosaukumus. Dažādās DBVS mainīgos apzīmē citādi nekā tabulas laukus (piem., MSSQL lieto
„@”, piemēram, „@mainīgais”), tomēr Oracle tā nav. Šeit rodas problēma – ja mainīgajam
piešķir tādu pašu nosaukumu kā kādam no tabulas laukiem, un pēc tam raksta „... WHERE a.id =
id ...”, kur a.id ir domāts tabulas lauks, bet id ir mainīgais, Oracle nekā nesapratīs, un vienkārši
izvadīs visus ierakstus.
Nobeigumā var secināt, ka faktu un likumu pievienošana datu bāzei padara to
„intelektuālu”, paverot durvis jaunām iespējām un vēl nebijušiem sasniegumiem. Tomēr šādas
datu bāzes izveidošana ir viena piņķerīga lieta, pie kuras ir nopietni jāpieiet, un svarīgi ir
izvēlēties pareizo problēmas risināšanas alternatīvu (kas atbild, piemēram, par likumu glabāšanu)
jau pašā sākumā, lai tādējādi izvairītos no kļūdām un iespējamām nepatīkamām situācijām.
42