Silbitamine

Silbitamine on esimenene sõnade struktuuri selgitav operatsioon, mille me oleme juba lapsena õppinud: prog-ram-mee-ri-mi-ne Kõige lihtsam (lihtsõnade) silbitamisreegel on: silp algab konsonandiga, mille järel tuleb vokaal; seejuures ei või eelmine silp koosneda vaid ühest konsonandist (selline olukord võib tekkida sõna alguses: prant-su-se). Liitsõnad jagatakse enne selle reegli rakendamist lihtsõnadeks; kuna see nõuab kogu Eesti keele sõnastiku tundmist, vaatleme järgnevas ainult lihtsõnu. Et õpetada Prologi silbitama, tuleb algul selgitada, millised tähed on vokaalid, millised konsonandid:
vokaal(a).
vokaal(e).
vokaal(i).
vokaal(o).
vokaal(u).
vokaal(y).
vokaal('õ').
vokaal('ä').
vokaal('ö').
vokaal('ü').
konsonant(Taht):-
not(vokaal(Taht)).

Sõna silbitamiseks tuleb sõna algul muuta tähtede nimistuks (muidu ei ole võimalik määrata, millised tähed on vokaalid, millised konsonandid). Sõna (Prologi terminoloogias aatomi) muudab tähtede nimistuks predikaat tähejada . Kuna seda predikaati tuleb kasutada mõlemas suunas - algul sõnast tähtede jada moodustamiseks ja siis silbi tähtede jadast silbi saamiseks, kontrollitakse systeemipredikaadiga atom(X) algul, kas esimesel muutujal on väärtus ja jagatakse seejärel aatom selle tähtede nimistuks; kui teisel muutujal (tähtede nimistul) on väärtus, liidetakse selle elemendid üheks aatomiks kasutades süsteemipredikaati atomlist_concat(List,Atom) .

Ühetähelise aatomi tähtede nimistu koosneb vaid sellest tähest ja pikema puhul kasutatakse predikaati rekursiivselt:

tähejada(A,[A]):-
atom(A),
atom_length(A,1),
!.
tähejada(Atom,[A|List]):-
atom(Atom),
!,
algustäht(Atom,A,Muud),
tähejada(Muud,List).
tähejada(Atom,List):-
atomlist_concat(List,Atom).

Aatomi algustähe eraldamiseks kasutatakse AMZI-Prologi systeemipredikaati atom_concat(A1,A2,A), mis kas liidab aatomid A1 ja A2 aatomiks A (s.t. kui selle esimeseks ja teiseks argumendiks on aatomid ja kolmas on muutuja) või jagab kolmanda argumendina antud aatomi kõikvõimalikel viisidel (backtrackingu juures) kaheks aatomiks; sellisel juhul peavad mõlemad esimesed kaks argumenti olema muutujad:

algustäht(Atom,A,Muud):-
atom_concat(A,Muud,Atom),
atom_length(A,1).

Tähtede nimistu muudetakse silpide nimistuks ja väljastatakse:

silbita(Sona) :-
tähejada(Sona, Tahed),
silbinimistu(Tahed,Silbid),
väljasta(Silbid),
nl.

Tähtede nimistust saadakse silpide nimistu, eristades algul nimistust esimese silbi tähed. Esimest silpi moodustavate tähtede nimistu ei või olla tühi ega koosneda vaid ühest konsonandist. Kui need tingimused on täidetud ja järgnevad tähed sobivad uue silbi alustamiseks (esimene täht - konsonant, teine - vokaal), muudetakse esimesele silbile vastav tähtede nimistu taas silbiks (aatomiks). Kui järelejäänud tähtede seast uut silpi eraldada enam ei ole võimalik, muudetakse kõik järelejäänud tähed silbiks.

silbinimistu(Tahed,[Silp|Silbid]) :-
append(Algus,Jargmine,Tahed),
not( Algus = []),
not( yksikkonsonant(Algus)),
silbialgus(Jargmine),
tähejada(Silp, Algus),
silbinimistu(Jargmine, Silbid).
silbinimistu(Tahed, [Silp]) :-
tähejada(Silp, Tahed).

Silp algab konsonandiga, millele järgneb vokaal:

silbialgus([X,Y|_]) :-
konsonant(X),
vokaal(Y).

Predikaat yksikkonsonant kontrollib, kas tähtede nimistu koosneb ainult ühest konsonandist:

yksikkonsonant([K]) :-
konsonant(K).

Silbinimistu väljastatakse, eristades silbid üksteisest sidekriipsuga:

väljasta([X]) :-
write(X), nl, !.
väljasta([X|Y]) :-
write(X),
write('-'),
väljasta(Y).

Abipredikaat append(List1,List2,List) liidab kaks nimistut üheks; kuna seda kasutatakse ka vastupidi, s.t. antud nimistu jagamisel (kõikvõimalikeks) osadeks, ei või selle kirjelduse esimese lause lõpus olla ! :

append([],List,List).
append([A|List],List2, [A|List1]):-
append(List,List2,List1).

Ülesandeid:
1. Siin esitatud silbitamisreeglid ei ole täielikud; täienda programmi nii, et see oskaks

a) leida ka vokaaliga algavaid silpe (e-va-ku-at-si-oon)

b) silbitada liitsõnu ( lei-va-au-to); loomulikult peab siis looma ka (väikese) sõnastiku, kus on esitatud lihtsõnad.



Küsimused, probleemid: ©2004 Jaak Henno