Kuidas loomuliku keelt tõlkida Prologi?

Algajatel tekitab alati probleeme Prologi maailmakirjeldamise viis - milline (sõna) on suhe (predikaat), milline (sõna) on objekt (konstant või muutuja). Tegelikult vastavad Prologi programmi laused üsna täpselt loomuliku keele lausetele; tuleb ainult hoolikalt vahet teha objektide (konstantide ja muutujate) ja nendevaheliste suhete, predikaatide vahel (predikaadid on Prologis alati konstandid, s.t. predikaadi kohal ei saa kunagi kasutada muutujat).
Täiendame poegi ja tütreid kirjeldavat programmi:

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

Titaanid olid jumalate soo esi-isa Uranose lapsed:

titaan(Titaan):-
laps(uranos,Titaan).

Siin titaan on predikaadi nimi, Titaan - objekt (muutuja); loomulikult oleks siin muutuja tähistusena võinud kasutada ükskõik millist sõna, kuid näiteks X oleks palju halvem, sest selles tähistuses ei ole semantikat, hiljem programmi lugedes on palju raskem aru saada, mida X tegelikult peaks tähistama.

Et seda reeglit kasutada, tuleb defineerida predikaat laps. Lapsed on kas pojad või tütred:

laps(Vanem,X):-
poeg_on(Vanem,X).

laps(Vanem,X):-
tytar_on(Vanem,X).

Kõik titaanide järglased olid (nn. uued) jumalad:

jumal(Isik):- titaan(Titaan),
jarglane(Titaan,Isik).

Järglased on lapsed ja laste järglased (matemaatiliselt: suhe jarglane on suhte laps transitiivne sulund):

jarglane(Isik,Järglane):-
laps(Isik,Järglane).

jarglane(Isik,Järglane):-
laps(Isik,Laps),
jarglane(Laps,Järglane).

Olümplased olid Olümpose mäel asuvad peajumal Zeus ja tema vennad ja õed, välja arvatud Demeter (Demeter lahkus Olümposelt, kui Zeus lubas allmaailmajumalal Hadesel röövida tema tütre):

olymplane(zeus).

olymplane(Isik):-
vend(zeus,Isik).

olymplane(Isik):-
õde(zeus,Isik),
not(Isik=demeter).

Isik Vend on isiku Isik vend (s.t. nende vahel on suhe vend), kui leidub keegi kolmas isik Vanem , kellele isik Vend on poeg ja isik Isik - laps (kas poeg või tütar); kuna tavaliselt ennast keegi ei loe oma vennaks või õeks, peab veel nõudma, et isikud Vend ja Isik oleksid erinevad:

vend(Isik, Vend):-
laps(Vanem, Isik),
poeg_on(Vanem, Isik),
not(Isik = Vend).

Analoogiliselt kirjeldame predikaadi õde:

õde(Isik, Õde):-
laps(Vanem, Isik),
tytar_on(Vanem, Õde),
not(Isik = Õde).

Ülesandeid:
1. Määra predikaadid jne
2. Kuidas (minimaalsete lisadega) ülaltoodud programmis saaks kirjeldada isikute soo, s.t. predikaadid meessoost(Isik) ja naissoost(Isik) (poegade ja tütarde sugu järeldub vastavatest predikaatidest; lisada tulevad faktid nende isikute kohta, kes ülaltoodud andmebaasis ei ole kellegi pojad ega tütred)
3. Kuidas muutuksid kõigi predikaatide (näiteks soo) definitsioonid, kui põhifaktid oleksid predikaatide poeg_on(Isik, Poeg) ja tytar_on(Isik, Tytar) asemel kirjeldatud predikaat idega isa(Isa, Laps) ja ema(Ema, Laps) ?
4. Suhe "sugulane" määratakse tavaliselt (näiteks sugupuud joonistades) nii: sugulased on kõik eellased (vanemad, vanavanemad jne) ja nende järglased ja nende nn veresugulaste (minu veresugulane on isik, kelle jaoks meil mõlemal on yhine eellane, s.t. meie mõlema soonis voolab selle ühise eellase verd) abikaasad, kuid mitte enam abikaasade eellased (nende järglased loomulikult on kõik sugulased, sest nad on veresugulased); erandina loetakse sageli sugulasteks ka isiku enda abikaasa vanemad, s.t. ämm ja äi. Määra Prologi predikaat sugulane(Isik, Sugulane)
NB: suhe "sugulane" (selle definitsiooni järgi) ei ole sümmeetriline: minu pojapoja naine on minu sugulane, kuid mina ei ole tema sugulane!
5. Paljud predikaadid (vajab, kasutab, põlveneb jne) sarnanevad oma omadustelt predikaatidega poeg_on(Isik, Poeg), tytar_on(Isik, Tytar) (s.t. nendest tuletatakse uusi predikaate transitiivse sulundi abil). Kuidas kirjeldada näiteks ökosüsteemis kehtivaid sõltuvussuhteid?


Küsimused, probleemid: ©2004 Jaak Henno