Dane wejściowe/wyjściowe Wbudowane predykaty Krzysztof Wlazło 22.05.2017
Dane wejściowe Aby pobrać dane wejściowe od użytkownika w języku Prolog można użyć specjalny predykat read. Prezentuje to następujący przykład: wydarzenie(966, ‘chrzest Polski’). wydarzenie(1025, ‘koronacja Bolesława Chrobrego’). wydarzenie(1525, ‘hołd pruski’). wyd(Y) :- read(X), wydarzenie(X, Y).
Dane wyjściowe Aby wprowadzić dane za pomocą urządzenia wyjścia można użyć predykat write. Z kolei predykat nl powoduje przejście do nowej linii. Ilustruje to następujący przykład: plus(0) :- !. plus(N) :- write('+'), nl, N1 is N - 1, plus(N1).
Czytanie znaku Możemy pobrać pojedyńczy znak X używając predykat get_char(X), np: podaj :- write('podaj znak: '), get_char(X), nl, write('podales znak: '), write(X).
Pisanie znaku Do wypisania pojedyńczego znaku X służy predykat put_char(X), np: wyswietl :- put_char('s'), put_char('h'), put_char('e'), nl, put_char('i'), put_char('s'), nl, put_char('h'), put_char('e'), put_char('r'), put_char('e').
Czytanie z pliku Aby odczytać dane z pliku należy użyć predykatów open oraz close. Ogólna forma programu odczytującego dane z pliku wygląda następująco: program :- open(‘myfile.txt’, read, X), code_reading(X), close(X). gdzie code_reading(X) jest predykatem odczytującym dane z pliku.
Pisanie do pliku Analogicznie przy pisaniu do pliku ogólna forma takiego programu wygląda następująco: program :- open(‘output.txt’, write, X), code_writing(X), close(X). gdzie code_writing(X) jest predykatem piszącym dane do pliku.
Czytanie z pliku c.d. W predykacie code_reading należy zmienić strumień wejściowy. Predykaty set_input oraz set_output zmieniają bieżący strumień wejściowy i wyjściowy. Z kolei predykaty current_input oraz current_output sprawdzają jak ustawione są strumienie.
Czytanie z pliku - przykład Zatem program czytający plik powinien wyglądać następująco: readFromFile :- open('data.txt',read,X), current_input(Stream), set_input(X), code_reading, close(X), set_input(Stream). code_reading :- read(Y), instructions(Y). instructions( end_of_file ) :- !. instructions(Y) :- write(Y), nl, code_reading.
Pisanie do pliku - przykład Analogicznie przy pisaniu do pliku program powinien wyglądać następująco: writeToFile :- open('output.txt',write,X), current_output(Stream), set_output(X), code_writing, close(X), set_output(Stream). code_writing :- read(X),\+ (X='q'), write(X),nl,flush,code_writing. gdzie flush odpowiada za czyszczenie bufora.
Wbudowane predykaty – klasyfikacja termów Prolog posiada predykaty, dzięki którym możliwe jest manipulowanie termami w zależności od ich rodzaju, np: var(X) – jest spełniony, jeżeli X jest zmienną wolną(niezwiązaną), np. var(4) daje false, a var(X) daje true, nonvar(X) - jest spełniony, jeżeli X jest zmienna związaną, a zatem predykat ten jest przeciwieństwem do var(X), np. nonvar(4) daje true, a nonvar(X) daje false, atom(X) – jest spełniony, jeżeli X jest stałą lub zmienna związaną atomową, np. atom(X) i atom(4) daje false, a atom(abece) daje true,
Wbudowane predykaty – klasyfikacja termów number(X) – jest spełniony, jeżeli X jest liczbą, np. number(-4.7) daje true, atomic(X) – jest spełniony, jeżeli X jest liczbą lub atomem, np. atomic(-24.3) oraz atomic(‘jablko’) dają true.
Wbudowane predykaty – wpływ na nawracanie Predykat repeat służy do generowania wielu rozwiązań poprzez nawracanie. Trwa do momentu, aż wszystkie cele zostaną spełnione, np. new_get(X) :- repeat, get_char(X). get_non_space(X) :- new_get(X), \+ X = ' '.
Wbudowane predykaty – złożone cele Predykat call jest używany w celu wywoływania innego predykatu, np. call(write(‘Hello World’)). Predykat \+ jest zadeklarowany jako operator prefiksowy i jest operatorem negacji, np. \+ (2=4) da w wyniku true.
Wbudowane predykaty – wyrażenia arytmetyczne W języku Prolog mamy następujące operatory arytmetyczne: X is Y X + Y X – Y X * Y X / Y X//Y(dzielenie całkowite, np. 5//3 daje 1) X mod Y
Wbudowane predykaty – operatory porównania W języku Prolog mamy następujące operatory porównania: X = Y X =:= Y(równość) X =\= Y(różność) X < Y X > Y X >= Y X =< Y