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.

Olgu näiteks Kronose lapsed kirjeldatud faktiga:

lapsed(kronos, [demeter, hades, hestia, poseidon,zeus, hera]).

Kronose esimese lapse nime ja kõigi ülejäänud laste nimede nimistu saaksime päringuga:

? lapsed(kronos, [Esimene|Muud]).
Esimene = demeter
Muud = [hades, hestia, poseidon, zeus,hera]

Prologis on süsteemipredikaadid ka nimistute moodustamiseks, näiteks lausetest poeg_on(Isa,Poeg) uue predikaadi pojad(Isa, Pojad) (Pojad on nimistu kõigist Isa poegadest) moodustamiseks. Selleks võib kasutada Prologi süsteemipredikaati findall(Muutuja, Tingimus, Nimistu) abil; siin Muutuja on muutuja, mille predikaadi Tingimus rahuldavad väärtused korjatakse kokku nimistusse Pojad, seega kõigi Kronose poegade nimistu Pojad saab lausega

findall(Poeg, poeg_on(kronos,Poeg), Pojad).

Predikaadil findall(Muutuja, Tingimus, Nimistu) on mitu erikuju, mis võimaldavad moodustada kordusteta, järjestatud jne nimistuid, vt Prolog-i Help-faili. Muutuja võib olla ka mitut muutujat sisaldav nimistu ja Tingimus võib olla koostatud mitmest predikaadist, mis on loogikaoperaatorite ja (,), või(;), eitus (not) abil üheks loogiliseks tingimuseks ühendatud.

Kui näiteks programmis on laused isade-emade kohta kujul

isa(Isa, Laps)
ema(Ema, Laps)
ja tahetakse teada, millistel Isa-Ema paaridel on ühiseid lapsi, saab kõigi selliste paaride nimistu Vanemad moodustada lausega
findall(Isa-Ema, (isa(Isa,Laps),ema(Ema,Laps)), Vanemad).

Ülesandeid:
1. Koosta programm, mis sugulassuhete (lausete poeg-on, tytar_on) põhjal koostab antud isiku kohta nimistu tema vendadest-õdedest.
2. Kaart on esitatud lausetega tee(Linn1, Linn2, KM), mis näitavad otseteed (ilma vahelinnadeta) linnast linna. Koosta predikaat, mis iga linna jaoks koostaks nimistu kõigist naaberlinnadest, s.t. linnadest kuhu sellest linnast pääseb ilma vahelinnu läbimata.


Küsimused, probleemid: ©2004 Jaak Henno