Prolog Wejście / wyjście 16.06.2016r
Najprostszym sposobem pobierania danych od użytkownika jest odczytywanie informacji wprowadzonych za pomocą urządzenia standardowego wejścia jakim zwykle jest klawiatura. Zadanie to realizuje predykat read. Przykładowo dla programu: a(1,a). a(2,b). a(3,c). a(4,d). e(x) :- read(y),a(y,x). Efektem jego działania jest?- e(x). : [1.][ENTER] X = a ;
Innym prostym przykładem programu pobierającego dane, to program obliczający pole powierzchni kwadratu: Przykład: kwadrat :- read(x), Y is X * X, write(y). Efekt:?- kwadrat. : 4. [ENTER] 16 [ENTER] true
Do wyprowadzania informacji za pomocą urządzenia standardowego wyjścia jakim zwykle jest ekran służy predykat write. Predykat nl powoduje przejście do nowej linii. a(0) :-!. a(n) :- write("cos"), nl, N1 is N-1, a(n1). Efekt jego działania:?- a(3). cos cos cos true
Czytanie znaków: Do pobierania pojedynczych znaków służy predykat get_char:?- get_char(znak). : ala [ENTER] Znak = a Przykład programu pobierającego pojedyncze znaki tak długo, jak wprowadzony znak różny jest od znaku q a :- get_char(z),write('wprowadzony znak: ), write(z), nl, \+ (Z=q), a.
?- a. : ala ma kota [ENTER] wprowadzony znak: a wprowadzony znak: l wprowadzony znak: a wprowadzony znak: wprowadzony znak: m wprowadzony znak: a wprowadzony znak: wprowadzony znak: k wprowadzony znak: o wprowadzony znak: t wprowadzony znak: a wprowadzony znak: : q wprowadzony znak: q false
Czytanie z pliku W Prologu, pojęcie standardowego wejścia/wyjścia uogólnia się na pojęcie strumienia wejściowego/wyjściowego, które związane mogą być z dowolnym urządzeniem wprowadzającym/wyprowadzającym dane jak np. klawiatura, monitor, plik itd. Istniejące w Prologu wbudowane strumienie user_input oraz user_output odpowiadają klawiaturze i monitorowi. Praca z plikami możliwa jest dzięki predykatom open. Jest to predykat służący do powiązania strumienia z plikiem. Close jest to predykat pozwalający zakończyć prace z plikiem.
Program czytający dane z pliku: czytajplik :- open('dane.txt',read,x), current_input(ci), set_input(x), kododczytujacy, close(x), set_input(ci). kododczytujacy :- read(term), obsluz(term). obsluz( end_of_file ) :-!. obsluz(term) :- write(term),nl,kododczytujacy.
Argumenty predykatu open maja następujące znaczenie: Pierwszy argument ( dane.txt ) to nazwa pliku, który chcemy otworzyć. Drugi argument (read) to jeden z trybów: read otwarcie do odczytu istniejącego pliku; write utworzenie nowego pliku do zapisu (jeśli plik istnieje, zostanie usunięty); readwrite tryb zapisu i odczytu (jeśli plik istnieje to zostanie otworzony plik istniejący w przeciwnym razie plik zostanie utworzony); append istniejący plik zostanie otworzony do dopisywania. Trzeci argument (X) to zmienna, która zostanie związana ze strumieniem.
Aby w predykacie kododczytujacy móc odczytać dane z pliku, jak ze standardowego wejścia (wyjścia), należy najpierw zmienić strumień. Zmiana bieżącego strumienia wejściowego i wyjściowego odbywa się za pomocą predykatów set_input oraz set_output. Predykaty current_input oraz current_output pozwalają sprawdzić jak aktualnie ustawione są strumienie. Typowy program czytający plik powinien wyglądać tak:
Teraz kod należy uzupełnić o predykat kododczytujacy: czytajplik :- open( dane.txt,read,x), current_input(ci), set_input(x), kododczytujacy, close(x), set_input(ci). kododczytujacy :- read(term), obsluz(term). obsluz( end_of_file ) :-!. obsluz(term) :- write(term),nl,kododczytujacy.
Efekt działania tego programu na pliku dane.txt ala. ma. kota. Wygląda następująco:?- czytajplik. ala ma kotaa true
Ważne aby używać znaku kropki (.) po każdym wyrazie. Jego pominiecie w pliku z danymi, np. ala. ma kota. Powoduje wypisanie komunikatu:?- czytajplik. linia 1 ERROR: dane.txt:2:3: Syntax error: Operator expected
Znak kropki można pominąć jeśli użyjemy w odpowiednim miejscu znaku apostrof ( ) lub cudzysłów ("). Używając znaku,np. ala. ma. kota. 'kot ma'. ale.?- czytajplik. ala ma kota kot ma ale true.
Używając znaku " np. linia. 1. "linia 2". linia. 3. Efektem działania programu jest?- czytajplik. linia 1 [108, 105, 110, 105, 97, 32, 50] linia 3 Yes
Pisanie do pliku Na podobnych zasadach opiera się pisanie do pliku: zapisz :- open( out.txt,write,x), current_output(co), set_output(x), kodzapisujacy, close(x), set_output(co). kodzapisujacy :- read(x),\+ (X= quit ),write(x),nl,flush,kodzapisujacy.
Wprowadzając dane:?- zapisz. : ala. : ma. : kota. : quit. false W pliku out.txt otrzymamy dane: ala ma kota
KONIEC Prezentacje wykonali: Karol Wyskiel. Wojciech Jarosiński. Mateusz Cnotkowski. Radosław Krawczyk.