3


Programmi semantika (tähendus)

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

kirjeldab isa-tütar, isa-poeg suhteid, kasutades formaati

tytar_on(Isa, Tütar).
poeg_on(Isa, Poeg).

s.t. tytar_on, poeg_on on mõlemad kahekohalised (kahe argumendiga) predikaadid, mille esimesel kohal (esimene argument) on isa ja teisel vastavalt tütre või poja nimi. Argumendid (isad, pojad, tütred) on konkreetsed isikud, s.t. konstandid, sellepärast tuleb nad kirjutada väikese tähega!

Reegel

pojapoeg(Vanaisa,Pojapoeg) :-
poeg_on(Vanaisa,Isa),
poeg_on(Isa,Pojapoeg).

-- Koma: "," asemel võib kasutada ka sõna "ja", kui enne on laaditud kas moodul eesti.pro või eesti.plm vastavalt käsuga consult('eesti.pro'), consult('eesti.plm')

ütleb, et isik Vanaisa (ükskõik kes, s.t. muutuja) on mingi teise isiku Pojapoeg pojapoeg (s.t. need kaks isikut on suhtes pojapoeg ), kui leidub (kolmas) isik Isa(muutuja), kes on isiku Vanaisa poeg ja isiku Pojapoeg isa (s.t. isikute Vanaisa, Isa vahel on suhe poeg_on, ja isikute Isa, Pojapoeg vahel on samuti suhe poeg_on).

Kuidas suhteid kirjeldada - kas predikaadi nimeks valida poeg_on või lihtsalt poeg, kas esimene argument on isa ja teine poeg või vastupidi - see on programmeerija otsustada. Vigu tuleb vähem, kui järgitakse loomuliku keele süntaksit. Eesti keeles vastaksid ülaltoodud andmebaasi kirjetele laused

Uranose tütar on Rhea.
Uranose poeg on Okeanos.
Jne.

Predikaat väljendab suhet tegelikkuse objektide vahel, sellepärast on kõige loomulikum predikaadi nimi tavaliselt lause öeldis või öeldisrühm: tütar on, poeg on . Kuna predikaadi nimes ei või olla tühikuid, asendame tühiku allkriipsuga; ülejäänud lauseliikmed muutuvad predikaadi argumentideks - samas järjekorras, nagu nad esinevad lauses (ja täppidega tähed tuleb asendada vastavate täppideta tähtedega!).

Kord valitud süntaksit peab igal pool rangelt jälgima, s.t. kui isa-poeg suhted on kirjeldatud predikaadiga poeg_on (nagu ülal), ei oska Prolog kasutada reeglit

pojapoeg(Vanaisa,Pojapoeg) :-
poeg (Vanaisa,Isa),
poeg (Isa,Pojapoeg).

See reegel muutub Prologile arusaadavaks alles siis, kui programmi on lisatud veel üks reegel (selle võib lisada ükskõik kuhu, erinevate predikaatide kirjelduste järjekord programmis ei ole oluline; oluline on sama predikaati kirjeldavate lausete järjekord):

poeg(Isa,Poeg) :- poeg_on(Isa, Poeg).


Küsimused, probleemid:

jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde