Nimistud
Nimistu on kandiliste sulgude [ ] vahel esitatud loetelu nimistu elementidest,
mis eraldatakse üksteisest komaga, näiteks [demeter,
hades, hestia, poseidon, zeus, hera] on nimistu kõigist
Kronose lastest. Kuna nimistu element võib taas olla nimistu, saab
nimistute abil realiseerida igasuguseid hierarhilisi andmestruktuure.
Nimistu esitamisel kujul [Pea | Keha] annab
Prolog muutuja Pea väärtuseks
nimistu esimese elemendi, muutuja Keha
väärtuseks tuleb nimistu, mis koosneb esialgse
nimistu kõigist ülejäänud elementidest, seega kui
kronose lapsed oleks kirjeldatud faktiga:
lapsed(kronos,
[demeter, hades, hestia, poseidon, zeus, hera]).
siis saaksime Kronose esimese lapse ja kõigi ülejäänud
laste nimistu päringuga:
? lapsed(kronos, [Esimene|Muud]).
- Esimene = demeter
- Muud = [hades, hestia, poseidon, zeus,
hera]
Näitena nimistute kasutamisest koostame väikese keemiliste
reaktsioonide ekspertsüsteemi, mis võimaldab otsida, milliseid
aineid on olemasolevatest ainetest esitatud reaktsioonide abil võimalik
saada. Lähteandmed (olemasolevad ained ja reaktsioonid) on samad,
mida kasutas insener Cyrus Smith (J. Verne "Saladuslik Saar")
kalju õhkimisel.
Reaktsioonid on loomulik kirjeldada kahekohalise predikaadiga, mille esimene
argument on nimistu kõigist reaktsiooni lähteainetest, teine
- reaktsiooni käigus tekkiv aine:
reaktsioon([pyriit, sysi], raudsulfaat).
- reaktsioon([pyriit, sysi], alumiiniumsulfaat).
- reaktsioon([meretaimed], sooda).
- reaktsioon([rasv, sooda], seep).
- reaktsioon([rasv, sooda], glytseriin).
- reaktsioon([raudsulfaat], väävelhape).
- reaktsioon([vaavelhape, salpeeter], lammastikhape).
- reaktsioon([vaavelhape, lammastikhape],
nitroglytseriin).
Olemasolevad ained võib esitada ühekohalise predikaadiga:
olemas(pyriit).
- olemas(sysi).
- olemas(meretaimed).
- olemas(rasv).
- olemas(salpeeter).
Mingit ainet saab valmistada, kui ta kas on juba olemas
saab_valmistada(Aine):-
- olemas(Aine).
-
või saab seda ainet reaktsiooniga, mille kõiki lähteaineid
saab valmistada:
saab_valmistada(Aine):-
- reaktsioon(Ained, Aine),
- saab_kõikki(Ained).
-
Predikaadi saab_kõikki(Ained) argumendiks
on ainete nimistu. Kõikki nimistusse kuuluvaid aineid saab valmistada,
kui see nimistu on kas tyhi
saab_kõikki([]).
-
või siis on valmistav nii nimistu esimene aine (element) Esimene
kui ka kõik ained ülejäänud elemente esitavas alamnimistus
Muud
:
saab_kõikki([Esimene|Muud]):-
- saab_valmistada(Esimene),
- saab_kõikki(Muud).
-
Kirjeldatud predikaatide abil saab näiteks kontrollida, kas nendest
ainetest saab valmistada nitroglytseriini:
?saab_valmistada(nitroglytseriin).
- yes
Ülesanne
Kui aineid on palju, ei ole neid kõikki mingi uue aine valmistamiseks
võibolla vajagi. Kirjuta kahekohaline predikaat saab_valmistada(Aine,
Vajalikud) , mille abil saab leida kõigi antud aine
Aine valmistamiseks vajalike ainete
nimistu Vajalikud (vaid lähteained
ilma reaktsioonide vaheproduktideta!)
Küsimused, probleemid:
jaak@cc.ttu.ee
Tagasi loengute sisukorra juurde