Verbide liigid

Eelmises loengus vaadeldud programm võtab vastu (genereerib) palju mõtetuid lauseid: "auto naerab kiiresti" (verb "naerab" nõuab aluseks inimest, mitte elutut olendit "auto" ja sellega koos ei või kasutada tempot iseloomustavat määrust). See näitab, et lauseliikmete kirjeldamine ainult sõnaliikidega (alus peab olema nimisõna, õeldis - verb) on liiga jäme klassifikatsioon. On tarvis täpsemat liigitust: millised nimisõnad (elusad, elutud, füusilised kehad, abstraktsed mõisted jne) võivad esineda milliste tegevuste (verbide) objektide ja subjektidena.
Lause kirjeldab alati mingit tegevust, muutust või olekut, sellepärast on lause kõige tähtsam liige predikaat, verb.
Tegevusi ja neid kirjeldavaid verbe on mitmesuguseid. Transitiivsed verbid nõuavad tegevuse objekti: lööb (mida/keda?), juhib (mida/keda?), intransitiivsed verbid objekti ei nõua (naerab, puruneb, keeb); mõned verbid eeldavat elusat subjekti (tegija, lause alus): juhib, läheb (kes juhib?), teised elutut; mõned verbid nõuavad mitte ainult elusolendit, vaid inimest (naerab) jne.
Ka teised sõnaliigid võib jagada semantiliste omaduste alusel alaliikidesse, mis võivad lauses esineda ainult koos teatud tüüpi verbide ja muude lauseliikmetega. Inglise keele jaoks esitas R. Schank lause sügavstruktuuri (deep structure) kirjelduse, milles sõnad jagati kuude liiki (nähtavad esimed, tegavused ja olekud, esemete omadused, tegevuste omadus ed, ajad, kohad); tegevused - kahteteistkümnessse alamliiki (füüsilise eseme asukoha muutus, abstraktse suhte muutus, informatsiooni liikumine, füüsilise jõu rakendamine jne).
Järgnevas arvestatakse lause struktuuri analüüsides vaid seda, kas lauses esinev verb on transitiivne või intransitiivne (nõuab sihitist või ei), millises käändes peab olema alus ja sihitis ja et täiendi ja aluse, samuti määruse ja verbi arvud (ainsus või mitmus) oleksid samad.
lause(Lause) :-
subjekt(Subjekt,Arv,nimetav),
predikaat(Predikaat,Arv,transitiivne),
objekt(Sihitis,_,sihitav),
yhenda(Predikaat,Sihitis,Predikaatryhm),
yhenda(Subjekt,Predikaatryhm,Lause).
Intransitiivne verb nõuab ainult subjekti (alust):
lause(Lause) :-
subjekt(Subjekt,Arv,nimetav),
predikaat(Predikaat,Arv,intransitiivne),
yhenda(Subjekt,Predikaat,Lause).
Subjekt e. aluserühm koosneb nimetavas käändes olevast nimisõnast või nimisõnast ja seda iseloomustavast omadussõnast (täiendist); viimasel juhul peavad nimisõna ja omadussõna arv (ainsus või mitmus) ja kääne olema samad :

subjekt(Sonad,Arv,Kaane) :-
aluseryhm(Sonad,Arv,Kaane).
aluseryhm(Sonad,Arv,Kaane) :-
nimisona(Sonad,Arv,Kaane).
aluseryhm(Sonad,Arv,Kaane) :-
omadussona(Omadussona,Arv,Kaane),
nimisona(Nimisona,Arv,Kaane),
yhenda(Omadussona,Nimisona,Sonad).
Sihitis on oma süntaksilt (vormilt) samasugune kui aluserühm:
objekt(Sonad,Arv,Kaane) :-
aluseryhm(Sonad,Arv,Kaane).
Predikaat on kas verb (tegusõna) või verb ja tegevust iseloomustav määrus:
predikaat(Sona,Arv,Tyyppi) :-
verb(Sona,Arv,Tyyppi). predikaat(Sonad,Arv,Tyyppi) :-
verb(Verb,Arv,Tyyppi),
maarus(Maarsona),
yhenda(Verb,Maarsona,Sonad).
Jääb üle veel kirjeldada sõnastik. Sõnad esitatakse aatomitena (võib ka stringidena), ja neile on lisatud arvu (ainsus/mitmus) ja käänet iseloomustavad tunnused:

omadussona(suur,ainsus,nimetav).
omadussona(suurt,ainsus,sihitav).
omadussona(rõõmus,ainsus,nimetav).
omadussona(rõõmsat,ainsus,sihitav).
omadussona(rõõmsaid,mitmus,sihitav).
nimisona(poiss,ainsus,nimetav).
nimisona(auto,ainsus,nimetav).
nimisona(palli,ainsus,sihitav).
nimisona(pojad,mitmus,nimetav).
nimisona(kastid,mitmus,nimetav).
maarus(kiiresti).
maarus(kohe).
verb(jookseb,ainsus,intransitiivne).
verb(lööb,ainsus,transitiivne).
verb(roolib,ainsus,transitiivne).
verb(roolivad,mitmus,transitiivne).
verb(liigub,ainsus,intransitiivne).
verb(loeb,ainsus,transitiivne).
verb(loevad,mitmus,transitiivne).
verb(naerab,ainsus,intransitiivne).
verb(naeravad,mitmus,intransitiivne).

Laused käsitletakse sõnade nimistutena. Abipredikaat yhenda sarnaneb nimistute yhendamise predikaadile append, kuid seda saab kasutada ka juhul, kui esimesed argumendid on kas aatomid või stringid, sellisel juhul teisendab ta need algul üheelemendilisteks nimistuteks ja liidab siis nimistud :

yhenda(Sõna1,Sõna2,Sõnad) :-
teisenda(Sõna1,List1),
teisenda(Sõna2,List2),
append(List1,List2,Sõnad).
teisenda(Sõna,[Sõna]):-
(atom(Sõna);string(Sõna)),!.
teisenda(X,X). % - kui ei ole aatom ega string, peab argument juba olema nimistu
append([],L,L):-!.
append([E|L,L1,[E|L2]):-
append(L,L1,L2).
Et kontrollida, milliseid laused see programm suudab analüüsida (genereerida), tuleb lauset moodustavate sõnade nimistu väljastada:

räägi(Lause) :-
lause(Lause),
write(Lause),nl.
Kui lasta Prologil mõned laused faktidena oma programmi kirjutada, oskab ta vastata ka küsimustele.
õpi(Lause) :-
lause(Lause),
assert(fakt(Lause)).
kysi(Lause):-
fakt(Lause).

Kuna predikaadi fakt argument on sõnade nimistu, peab ka küsimuse esitama sõnade nimistuna; küsisõna peab olema muutuja (s.t. suure algustähega) ja asetsema küsimuse sõnade nimistus samal kohal, kus jutustavas lauses on vastus:
? - õpi([poiss,jookseb,kiiresti]).
yes

? - kysi([Kes,jookseb,kiiresti]).
Kes = poiss.

? - kysi([poiss,jookseb,Kuidas]).
Kuidas = kiiresti.


Ülesandeid:
1. Täienda ülaltoodud programmi sõnade vormi määramisega lõputunnuste abil (vt. loeng 18 ), nii et sõnastikus võiks esitada ainult sõnade tüved, st. kahe fakti
nimisõna(auto, ainsus,nimetav).
nimisõna(autod, mitmus,nimetav).
asemel võiks esitada vaid fakti
nimisõna(auto).
ja programm moodustaks ise nii ainsuse kui ka mitmuse vormid ja oskaks neid analüüsis kasutada, s.t. töötaks samamoodi kui ülaltoodud programm.
2. Täienda ülaltoodud programmi nii, et see mitte ainult ei genereeriks talle tuntud sõnadest lauseid, vaid suudaks ka esitatud lauset analüüsida (kui selle esinevad sõnad/sõnavormid on kirjeldatud), s.t. leiaks esitatud lauses aluse, öeldise jne.


Küsimused, probleemid: ©2004 Jaak Henno