Kuidas Prolog otsib vastust päringule?

Oletame, et Prolog-i on sisestatud järgmine programm:

tytar_on(uranos,rhea).
tytar_on(kronos,hera).
poeg_on(uranos,okeanos).
poeg_on(uranos,iapetos).
poeg_on(uranos,kronos).
poeg_on(kronos,zeus).
poeg_on(iapetos,atlas).
pojapoeg(Vanaisa,Pojapoeg) :-

poeg_on(Vanaisa,Isa),
poeg_on(Isa,Pojapoeg).

Anname nüüd päringu, Prolog-i terminoloogias - eesmärgi (goal); neid võib olla ka mitu:

? pojapoeg(uranos,X). --s.t. kes on Uranos-e pojapojad?

Päringule vastust otsides asendab Prolog samm-sammult eesmärke, kasutades programmis olevaid reegleid (reegli peas, s.t. vasakul pool olev predikaat asendatakse reegli kehas, s.t. paremal pool olevate predikaatidega), kuni jõuab faktideni; programmilauseid vaadeldakse nende esinemise järjekorras:

? pojapoeg(uranos,X).

Programmis (Prolog-i andmebaasis) esineb predikaat "pojapoeg" reegli vasakul pool, s.t. see määratakse reegli paremal pool olevate predikaatide abil (":-" tähendab "siis kui"), sellepärast asendatakse eesmärk pojapoeg(uranos,X) esimesel sammul kahe uue eesmärgiga:

? poeg_on(uranos,Poeg), poeg_on(Poeg,X).

Esimesele eesmärgile vastust otsides (s.t. programmiridu ülevalt-alla läbi vaadates) leiab Prolog, et muutuja Poeg väärtuseks võib olla okeanos , seega muutub tema eesmärkide rida:

? poeg_on(uranos,okeanos), poeg_on(okeanos, X).

Kuna päringule (eesmärgile)

? poeg_on(okeanos, X).
ühtegi sobivat muutuja X väärtust pole (goal fails), toimub tagurdus (backtracking), s.t. otsitakse viimasena väärtustatud muutujale (Poeg) järgmine väärtus Poeg = iapetos ja Prolog-i eesmärgiks saab :
? poeg_on(uranos, iapetos), poeg_on(iapetos , X).
ja nüüd leiab Prolog Prolog muutujale X sobiva väärtuse (otsimine kestab kuni kõigile muutujatele on leitud väärtused; kui see pole võimalik, teatab Prolog sõnaga no , et esialgsele päringule/eesmärgile pole üldse võimalik vastust):
poeg_on(uranos, iapetos), poeg_on(iapetos,atlas).
X = atlas

Kuna päringule

? poeg_on(iapetos , X).
leidub teisigi vastuseid (lahendeid), jätkab Prolog otsimist; järgmiseks võimaluseks on
? poeg_on(uranos, kronos), poeg_on(kronos , X).
kust leitakse järgmine vastus
X = zeus

Ülesandeid:
1. Millises järjekorras saadakse vastused, kui ülaltoodud programmis predikaadi "poeg_on" kirjelduses kahe esimese rea järjekord vahetada?
2. Sademed on kirjeldatud lausetega (halb kirjeldus - miks?):
sademed:-
vihm.
sademed :-
lumesadu.
lumesadu :-
sademed,
alla_nulli.
lumesadu.
vihm :-
sademed, not(alla_nulli).

Millised vastused saadakse päringutele:

?- alla_nulli.
?- not(alla_nulli).
?- sademed.
?- lumesadu.
3. Töö- ja puhkepäevi kirjeldavad faktid ja reeglid on sisestatud kujul:
tööpäev(esmaspäev).
tööpäev(teisipäev).
tööpäev(kolmapäev).
tööpäev(neljapäev).
tööpäev(reede).
puhkepäev(Päev):-
not(tööpäev(Päev)).

Millised vastused saadakse päringutele (miks?):

?- puhkepäev(pühapäev).
? - tööpäev(Jõulupäev).
? - puhkepäev(nädala_esimene_päev). ? - puhkepäev(Päev).



Küsimused, probleemid: ©2004 Jaak Henno