Prologi seos loogikaga

Prolog põhineb esimest järku predikaatarvutusel, s.t. loogikal, kus kasutatakse konstante (siin: uranos, rhea jne), muutujaid, mille väärtuseks võivad olla need konstandid (Isa, Pojapoeg, Vanaisa) ja predikaate, mis seovad muutujaid ja konstante ja millel on tõeväärtus: poeg_on(uranos, okeanos) on tõene, kuid pojapoeg(uranos, iapetos) pole (see pole seni esitatud lausetest tuletatav); muutujateks võivad olla vaid predikaatide argumendid, s.t. muutujate väärtuseks võivad olla vaid faktides esinevad konstandid, mitte predikaadid (see ongi esimest ja teist järku predikaatarvutuse erinevus). Prologi faktid, näiteks:

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).
esitavad tõeseid predikaatarvutuse lauseid (kahekohaline predikaat tytar_on on tõene, kui selle esimeseks argumendiks on konstant uranos ja teiseks - konstant rhea).

Reeglid, näiteks

pojapoeg(Vanaisa,Pojapoeg) :-

poeg_on(Vanaisa,Isa),
poeg_on(Isa,Pojapoeg).
kirjeldavad tõesed implikatsioonid: predikaatide poeg_on(Vanaisa,Isa) japoeg_on(Isa,Pojapoeg) tõesuse korral on tõene ka predikaat pojapoeg(Vanaisa,Pojapoeg). Muutujate kasutamine on lubatud vaid predikaatide argumentidena (predikaadid on alati fikseeritud, s.t. konstandid); viimasena vaadeldud reeglis on Vanaisa, Isa, Pojapoeg kõik muutujad. Loomulikult võib muutujaid tähistada ükskõik kuidas (muutujate nime kuju on oluline vaid antud reeglis). Kuna muutuja tunnus on (peale suure algustähe) ka _ (allkriips) esimese sümbolina, on viimane reegel on täiesti samaväärne reegliga

pojapoeg(_123,_436) :-
poeg_on(_123,_254),
poeg_on(_254,_436).

Kahjuks selline on enamuses Prolog-idest kasutatav programmi teksti "sisemine" kuju (kasutaja poolt sisestatud muutujad asendatakse ja ka debuggerid näitavad tavaliselt programmi just sellisel kujul. Programmi loetavuse ja arusaadavuse jaoks on siiski väga oluline püüda muutujatele anda vähemalt esialgses tekstis arusaadavad, sisulised (semantilised) nimed, s.t. kasutada Vanaisa, Pojapoeg, Isa, mitte X, Y, Z või _123, _436, _254.

Kindlasti peab vahet tegema muutujate (Pojapoeg) ja predikaatide ( pojapoeg(..., ...) ) vahel - muutujate (näit Pojapoeg) väärtuseks on konstandid, tegelikkuse objektid (zeus, atlas,...), kuid predikaadid näitavad vaid suhteid muutujate ja konstantide vahel - kes on kelle poeg, tütar, pojapoeg jne. Loomulikus (näit eesti) keeles me kasutame näiteks sõna "poeg" samuti kahes (vähemalt) erinevas tähenduses - "poeg" võib tähistada isikut ( "poeg Indrek") kui ka suhet ("Andrese poeg on Indrek"); kumb aspekt olulisem on, selgub tavaliselt kontekstist. Arutluste formaliseerimisel (Prolog-is) on nende kahe aspekti vahel oluline vahe, näiteks senivaadeldud programmilõikudes Poeg on muutuja, mille väärtuseks võivad olla programmis esinenud isikud (okeanos, iapetos - konstandid!), kuid poeg_on on suhe, predikaat ja see ei saa Prologis olla muutuja väärtuseks. Sellepärast ongi siin kasutatud vormi poeg_on, mitte poeg - muutujate ja predikaatide erinev nimekuju aitab vähendada vigu, mis tekivad loomuliku keele ebatäpse keelekasutuse tõttu. Loomulikus keeles on sõnumi (lause) vastuvõtjaks inimene, kes automaatselt täiendab ja parandab kahemõttelisi väljendeid; arvuti ei ole selleks (veel) suuteline.


Küsimused, probleemid: ©2004 Jaak Henno