9


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