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