2


Kuidas Prolog otsib vastust päringule?

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

Päring koosneb ühest või enamast eesmärgist:

? pojapoeg(uranos,X).

Otsides vastust päringule asendab Prolog samm-sammult eesmärke, kasutades programmis olevaid reegleid, kuni jõuab faktideni; programmilauseid vaadeldakse nende esinemise järjekorras:

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

--
esimene võimalus: Poeg = okeanos
? poeg_on(uranos,okeanos), poeg_on(okeanos, X).

Kuna päringule (eesmärgile)

? poeg_on(okeanos, X).

ei leidu vastust (goal fails), toimub tagurdus (backtracking), s.t. viimase valiku kohal otsitakse järgmine võimalus:

? poeg_on(uranos,Poeg), poeg_on(Poeg,X).
-
teine võimalus: Poeg = iapetos
? poeg_on(uranos, iapetos), poeg_on(iapetos , X).
? 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 vastus

X = zeus

Ülesanne
Millises järjekorras saadakse vastused, kui ülaltoodud programmis predikaadi "poeg_on" kirjelduses kahe esimese rea järjekord vahetada?


Küsimused, probleemid:

jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde