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