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).
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