Erinevusnimistud

Loomuliku keele lauseid analüüsides (vt. loeng "Verbide liigid") vaatlesime lauset sõnade nimistuna; nimistu Lause jagunes alamnimistuteks Subjekt, Predikaat, Sihitis:
lause(Lause) :-
subjekt(Subjekt,Arv,nimetav),
predikaat(Predikaat,Arv,transitiivne),
objekt(Sihitis,_,sihitav),
append(Predikaat,Sihitis,Predikaatryhm),
append(Subjekt,Predikaatryhm,Lause).
Niimoodid sõnade nimistut Lause alamnimistutest Subjekt, Predikaat, Sihitis kokku pannes peab Prolog tegema palju asjatut tööd. Kõik toimuks palju kiiremini, kui kohe algusest peale arvesse võtta, et nimistud Subjekt, Predikaat, Sihitis on kõik suurema nimistu Lause alamosad. Kuna selline situatsioon esineb sageli, on Prologis loodud operaator, mis esitab nimistu kahe nimistu vahena, nn erinevusnimistuna (difference list). Näiteks avaldis
[a,s,d] = [a,s,d,f]-[f]
ütleb, et nimistu [a,s,d] saadakse, kui nimistust [a,s,d,f] jäetakse ära (lahutatakse) nimistu [f]. Loomulikult on iga nimistu X korral X = X-[]. Näiteks eespool vaadeldud eesti keele lihtlausete (lause esitatakse sõnade nimistuna) elementaarse (lause koosnev vaid aluserühmast ja öeldiserühmast) kirjelduse võib esitada erinevusnimistuid kasutades järgmiselt.

lause(Lause) :-
aluseryhm(Lause-Verbirühm),
verbiryhm(Verbirühm-[]).

s.t. sõnade nimistu Lause on lause, kui selle alguses olev nimistu osa Lause-Verbirühm moodustab aluserühma ja järelejääv nimistu Verbirühm = Verbirühm-[] moodustab öeldiserühma; vastavate nimistute esitamine erinevusnimistutena võimaldab Prologil neid käsitleda ilma tagasipöördumisteta (backtracking), mis traditsioonilise append (kui lause on esitatud sõnade nimistuna) kasutamise puhul (vrdl. loeng "Verbide liigid") oleks olnud paratamatu. Edasi on kõik traditsiooniline:

aluseryhm(NP-X):-
nimisona(NP-X).
aluseryhm(NP-X):-
omadussona(NP-NE),
aluseryhm(NE-X).
verbiryhm(VP-X):-
verb(VP-X).
verbiryhm(VP-X):-
verb(VP-MP),
maarsona(MP-X).
nimisona([koer|X]-X).
nimisona([poiss|X]-X).
nimisona([hiir|X]-X).
verb([jookseb|X]-X).
verb([ujub|X]-X).
omadussona([suur|X]-X).
omadussona([sinine|X]-X).
omadussona([ilus|X]-X).
maarsona([kiiresti|X]-X).
maarsona([kaua|X]-X).
maarsona([ettevaatlikult|X]-X).
Milliseid lauseid Prolog oskab selle kirjelduse põhjal moodustada?
?- lause(X).
X = [koer,jookseb]
X = [koer,ujub]
X = [koer,jookseb,kiiresti]
jne.
Ülesandeid:
1. Ylesande tekst


Küsimused, probleemid: ©2004 Jaak Henno