1 / 16 7. loeng Tekstitöötlus Sisend/väljund Teksti lugemine Sõnad
2 / 16 Sisend/väljund vaikimisi: Termid: read, write?-read(x). : 2+3. X = 2+3.?-write(2+3). 2+3 true. Jooksva sisendi vaatamine: seeing?- seeing(x). X = user. Jooksva väljundi vaatamine: telling?- telling(x). X = user. See tähendab, et vaikimisi on nii sisendiks kui väljundiks interaktiivne keskkond, mida süsteem tähistab konstandiga user.
3 / 16 Sisendi määramine: Fail kui sisend: see, seen, seeing?- see( input.txt ), seeing(x). X = <stream>(01180198).?- read(x). X = f(2, x, [a, 2]).?- read(x),y is X. X = 2* (1+2), Y = 6.?- read(x). X = end_of_file.?- seen. true.?- seeing(x). X = user.
4 / 16 Väljundi määramine: Fail kui väljund: tell, told, telling?- tell( output.txt ). true.?- telling(x). X = <stream>(01181520).?- write(abcd). true.?- write(3 + 2). true.?- told. true.?- telling(x). X = user.
5 / 16 Faili kirjutamine: Faili avamine/sulgemine: open, close?-open( hello.txt,write,s), write(s, Hello! ), close(s). S = <stream>(01256ba0)?-open( hello.txt,write,s,[alias=out]), write(out, Hello! ), close(out). S = out
6 / 16 Faili kirjutamine: Faili saab kirjutada ka sümbolhaaval: put_code kirjutab faili sümboli tema ASCII koodi järgi.?-put_code(out,65). Kirjutab faili sümboli A. put_char kirjutab faili etteantud sümboli.?-put_code(out, A ).
7 / 16 Failist lugemine:?-open( hello.txt, read, S, [alias=in]). get_code, get_char Võimaldavad lugeda failist ühe sümbolikoodi / sümboli, kusjuures iga kord loetakse uus sümbol.?- get_char(in,x). X = H.?- get_char(in,x). X = e.?- get_char(in,x). X = l.?- get_char(in,x). X = l.?- get_char(in,x). X = o.?- get_char(in,x). X =!.?- get_char(in,x). X = end_of_file.
8 / 16 Failist lugemine:?-open( hello.txt, read, S, [alias=in]). peek_code, peek_char Võimaldavad lugeda failist ühe sümbolikoodi / sümboli kusjuures sama sümbolit loetakse mitu korda järjest.?- peek_char(in,x). X = H.?- peek_char(in,x). X = H.?- peek_char(in,x). X = H....
9 / 16 Failist lugemine: Realõpp : sümbol \n või ASCII kood 10. Faililõpp : sümbol end_of_file (selle kood on 1), at_end_of_stream(in). Teisendused sümbolite ja nende koodide vahel:?-atom_codes(abc,xs). Xs = [97, 98, 99]?-atom_chars(abc,Xs). Xs = [a, b, c]
10 / 16 Teksti teisendamine sümbolite listiks Loeme sisendi Stream sümboleid kuni rea lõpuni. Listi [C Cs] väärtuseks on sisendi esitus sümbolite listina. text_to_list(stream,[c Cs]):- get_char(stream,c), (end_of_line(c) -> Cs = [] ; text_to_list(stream,cs)). end_of_line( \n ). Olgu sisendiks interaktiivne keskkond ( user ).?-text_to_list(user,r). : The text R = [ T, h, e,, t, e, x, t, \n ]
11 / 16 Teksti teisendamine sõnade listiks Defineerime sõna tähed ja sõna lõpud. end_of_word(. ). end_of_word( ). end_of_word( \n ). %...kindlasti saame defineerida neid rohkem letter(x) :- letters(xs), member(x,xs). letters([ A, B, C,...]). %suured tähed letters([a,b,c,...]). %väiksed tähed
12 / 16 Teksti teisendamine sõnade listiks Loeme sümbolite listist välja esimese sõna: loeme listi vasakult paremale kuni jõuame märgini, mis tähistab sõna lõppu. Predikaat first_word(cs,ws,rest) on tõene, kui sümbolite listist Cs esimese sõna Ws eraldamisel saama listi Rest. Cs on sümbolite list. Ws on esimese sõna sümbolite list. C on vaadeldav sümbol. Rest on list, kuhu pannakse kõik ülejäänud sümbolid esimese sõna eraldamise järel. Kui vaadeldav sümbol C on täht, lisame ta moodustatava sõna juurde. Vaatame läbi ülejäänud sümbolid Cs rekursiivselt. first_word([c Cs],[C Ws],Rest):- letter(c), first_word(cs,ws,rest).
13 / 16 Teksti teisendamine sõnade listiks Kui C on sõna lõpp, siis lõpetame tööd. Kõik vaatlemata sümbolid jäävad kolmandaks parameertiks. first_word([c Cs],[],[C Cs]):- end_of_word(c). Kui oleme jõudnud sisendi lõpuni, siis samuti lõpetame tööd. Mitte ükski sümbol ei jäänud vaatlemata. first_word([],[],[]). Tulemusena saame kätte teksti esimese sõna ning ülejäänud teksti osa.?- first_word([ T,h,i,s,,i,s,,t,e,x,t],Xs,Ys). Xs = [ T, h, i, s], Ys = [, i, s,, t, e, x, t]
14 / 16 Teksti teisendamine sõnade listiks Eraldame tekstist sõnad. Kõigepealt loeme välja etteantud listist esimese sõna (samuti listina) ning teisendame seda üheks terveks sõnaks kasutades süsteemset predikaati atom_chars/2. Loeme välja ülejäänud sõnad rekursiivselt. Tühikuid ja muid rea lõppu tähistavaid sümboleid jätame välja. word_list([],[]). word_list([c Cs],Ws):- end_of_word(c), word_list(cs,ws). word_list([c Cs],[W Ws]):- letter(c), first_word([c Cs],WordLetters,Rest), atom_chars(w,wordletters), word_list(rest,ws).
15 / 16 Teksti teisendamine sõnade listiks Testime enne defineeritud preikaate kasutaja sisendi peal.?-text_to_list(user,r), word_list(r,w). : This is text R = [ T,h,i,s,,i,s,,t,e,x,t, \n ] W = [ This,is,text]
16 / 16 Ülesanne Tekitage oma arvutisse tavaline tekstifail nimega tekst.txt ning kirjutage esimeseks reaks This is text. Lõpetage reavahetusega! Kasutades enne defineeritud predikaati text_to_list kirjutage päring, mis avab faili tekst.txt, loeb sellest esimese rea ning väljastab selle ekraanile sümbolite listina. Faili avamiseks kasutage süsteemset predikaati open. NB! Koodi kopeerimisel slaididelt võivad muutuda ülakomade märgid (end_of_line( \n )).