Lihtlause struktuur

Lause sisust aru saamiseks tuleb leida lause semantilised (tähenduslikud) osad: aluserühm (alus koos selle täienditega), öeldiserühm e. predikaat (öeldis ja määrused); eesti keeles need tavaliselt esinevadki selles järkekorras.
Järgnevas on lause esitatud ühe aatomina; lausesse kuuluvaid sõnu ühendatakse lauseks süsteemipredikaadi (primitiivi) atom_concat(Atom1, Atom2, Atom1Atom2) abil, mis ühendab aatomid Atom1, Atom2 üheks aatomiks Atom1Atom2. Predikaatiatom_concat võib kasutada nii aatomite ühendamiseks (kahel esimesel argimendil on väärtus, kolmas muutuja) kui ka aatomi jagamisel osadeks, s.t. kui vaid kolmandal argumendil on väärtus (sel juhul peavad mõlemad esimesed argumendid olema muutujad); sel juhul moodustab ta esimese kahe argumendi jaoks kõikvõimalikud sobivad väärtused.
analyysi(Lause) :- aluseryhm(Aluseryhm),
predikaat(Verbiryhm),
atom_concat(Aluseryhm,Verbiryhm,Lause).
Aluserühm koosneb kas ainult nimisõnast või on selle ees mingi omadussõnaline täiend:
aluseryhm(Sona) :-
nimisõna(Sona).
aluseryhm(Sonad) :-
omadussona(Sona1),
nimisõna(Sona2),
atom_concat(Sona1,Sona2,Sonad).
Predikaat (öeldis) on kas verb või verb koos sellele järgneva määrsõnaga:
predikaat(Sona) :-
verb(Sona).
predikaat(Sonad) :-
verb(Sona1),
määrsõna(Sona2),
atom_concat(Sona1,Sona2,Sonad).
Ja lõpuks tuleb kirjeldada sõnastik, s.t. (mõned) verbid, nimisõnad, omadussõnad ja määrsõnad. Kuna kogu lause on aatom, mis on saadud lause sõnade (aatomid) ühendamisega, on sõnade vahele tühiku tekitamiseks kõigi sõnade lõppu lisatud tühik; tühikut sisaldavad aatomid tuleb võtta aatomi eraldajate ' ' vahele.
nimisõna('poiss ').
nimisõna('auto ').
omadussona('suur ').
verb('jookseb ').
verb('kõnnib ').
verb('loeb ').
verb('naerab ').
verb('sõidab ').
verb('jookseb ').
verb('laulab ').
määrsõna('kiiresti ').
määrsõna('aeglaselt ').
Nüüd võib lasta Prologil genereerida kõik (tema jaoks) struktuurilt korrektsed laused, s.t. esitada päringu:
?- lause(X).
poiss jookseb .
...

Ülesandeid:
1. Ülalesitatud predikaat ainult genereerib lauseid, kuid ei oska leida esitatud lihtaluse lauseliikmeid (milline söna on alus, milline öeldis, täiend, määrus). Täienda Ülalesitatud programmi nii, et see oskaks leida esitatud lause lauseliikmed (kui vastavad sönad on kirjeldatud sönastikus), s.t. näiteks päringu
?- lause('poiss jookseb kiiresti').
esitamisel määrab Prolog, mis on alus, öeldis jne. Vihje: et kasutada juba esitatud osa, vöib kohe alguses sÜsteemipredikaatide atom(X) ja var(X) abil määrata, kas predikaadi lause(X) argument X on muutuja (s.t. tuleb genereerida lause) vöi aatom (s.t. analüüsitav lause).
2. Koosta predikaat, mis algul analüüsib lihtlaused (leiab aluse, öeldise jne) ja siis moodustab aluse, öeldise jne kohta käiva küsilause:
? - poiss jookseb.
kes jookseb?
mida poiss teeb?
jne
3. Modifitseerida järgnevat veidi keerukamat lause moodustamise predikaati, nii et see saaks aru ka määrustest ja mitmest täiendist ("suur sinine viierattaline auto...").
lause(s(NP,VP),W,R) :-
aluserühm(NP,W,R1),verbirühm(VP,R1,R),assert(fakt(s(NP,VP))).
aluserühm(np(N),W,R) :-
nimisöna(N,W,R).
aluserühm(np(D,N),W,R) :-
täiend(D,W,R1), nimisöna(N,R1,R).
verbirühm(vp(V,NP),W,R) :-
verb(V,W,R1),
aluserühm(NP,R1,R),
kääne(NP,osastav).
nimisöna(nimisöna(kass),[kass|R],R).
nimisöna(nimisöna(hiir),[hiir|R],R).
nimisöna(nimisöna(koer),[koer|R],R).
täiend(täiend(suur),[suur|R],R).
verb(verb(jälitas),[jälitas|R],R).
kääne(NP,osastav):-
nimisöna(nimisöna(NP),[NP|R],R),
tunnus(T1,osastav),
atom_concat(NP1,T1,NP),T=T1,
nimisöna(nimisöna(NP1),[NP1|R],R).
tunnus(t,osastav).


Küsimused, probleemid: ©2004 Jaak Henno