Wejście i wyjście Wydział Matematyki UŁ 30 marca 2007
Plan prezentacji Czytanie i pisanie termów 1 Czytanie i pisanie termów Czytanie termów Pisanie termów 2 Czytanie znaków Pisanie znaków 3 Czytanie z pliku 4 naiwne bąbelkowe przez wstawiania przez łączenie szybkie
Czytanie termów Pisanie termów Predykat read odczytuje term wprowadzony z klawiatury (term ten musi kończyć się kropką). Predykat read można uzgodnić tylko raz. Program a(1,b). a(1,c). a(2,d). a(2,e). e(x) :- read(y),a(y,x). i efekt jego działania?- e(x). : 1. X = b ; X = c ; No Zauważmy, że Prolog podczas nawracania nie pyta już o kolejne liczby.
Czytanie termów Pisanie termów Program kwadrat :- read(x), licz(x). licz(stop) :-!. licz(x) :- C is X * X, write(c),kwadrat. i efekt jego działania?- kwadrat. : 4. 16 : stop. Yes
Czytanie termów Pisanie termów Predykat write wypisuje term. Predykat nl powoduje przejście do nowej linii. Podobnie jak read oba predykaty można uzgodnić tylko raz. Program a(0). a(n) :- write( ala ), N1 is N-1, a(n1). i efekt jego działania?- a(5). ala ala ala ala ala Yes
Czytanie znaków Pisanie znaków Predykat get_char odczytuje pojedyńczy znak.?- get_char(znak). : a Znak = a Yes?- get_char(znak). : ala Znak = a Unknown action: l (h for help) Action? Yes
Czytanie znaków Pisanie znaków Wywołanie celu put_char(x), w przypadku gdy zmienna X ukonkretniona jest znakiem, powoduje jego wypisanie.?- get_char(znak),put_char(znak). : a a Znak = a Yes
Czytanie z pliku Prolog może pisać dane do strumieni i ze strumieni dane odczytywać. Strumień, jak w innych językach programowania może odpowiadać klawiaturze, monitorowi, plikowi itd. W Prologu istnieją wbudowane strumienie user_input oraz user_output odpowiadające klawiaturze i monitorowi. Predykat open służy do powiązania strumienia z plikiem. Predykat close pozwala zakończyć używanie pliku. Typowy program czytający plik powinien wyglądać tak czytajplik :- open( dane.txt,read,x), kododczytujacy(x), close(x).
Czytanie z pliku 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. Uwzględniając te nowe predykaty, typowy program czytający plik powinien wyglądać tak czytajplik :- open( dane.txt,read,x), current_input(ci), set_input(x), kododczytujacy, close(x), set_input(ci).
Czytanie z pliku 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. Uwzględniając te nowe predykaty, typowy program czytający plik powinien wyglądać tak czytajplik :- open( dane.txt,read,x), current_input(ci), set_input(x), kododczytujacy, close(x), set_input(ci).
Czytanie z pliku 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. Uwzględniając te nowe predykaty, typowy program czytający plik powinien wyglądać tak czytajplik :- open( dane.txt,read,x), current_input(ci), set_input(x), kododczytujacy, close(x), set_input(ci).
Czytanie z pliku Program 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. Plik dane.txt linia. 1. linia. 2. linia. 3. i. linia. 4. a. to. jest. ostatnia. linia. 5.
naiwne bąbelkowe przez wstawiania przez łączenie szybkie naiwne nsort(x, Y) :- permutacja(x, Y), uporzadkowana(y). usun(x,[x Xs],Xs). usun(x,[y Ys],[Y Zs]) :- usun(x,ys,zs). permutacja([], []). permutacja(xs, [Z Zs]) :- usun(z, Xs, Ys), permutacja(ys, Zs). uporzadkowana([x]). uporzadkowana([x, Y R]) :- X =< Y, uporzadkowana([y R]).
naiwne bąbelkowe przez wstawiania przez łączenie szybkie bąbelkowe bsort(list, Sorted) :- swap(list, List1),!, bsort(list1, Sorted). bsort(sorted, Sorted). swap([x,y Rest], [Y,X Rest]) :- X > Y. swap([z Rest], [Z Rest1]) :- swap(rest, Rest1).
naiwne bąbelkowe przez wstawiania przez łączenie szybkie przez wstawiania isort([],[]). isort([x Tail],Sorted) :- isort(tail, SortedTail), insert(x, SortedTail, Sorted). insert(x, [Y Sorted], [Y Sorted1]) :- X > Y,!, insert (X, Sorted, Sorted1). insert(x, Sorted, [X Sorted]).
naiwne bąbelkowe przez wstawiania przez łączenie szybkie przez łączenie msort([],[]). msort([x],[x]). msort(list,sorted):- List=[_,_ _],polowa(list,l1,l2), msort(l1,sorted1),msort(l2,sorted2), mymerge(sorted1,sorted2,sorted). mymerge([],l,l). mymerge(l,[],l) :- L\=[]. mymerge([x T1],[Y T2],[X T]) :- X=<Y,myMerge(T1,[Y T2],T). mymerge([x T1],[Y T2],[Y T]) :- X>Y,myMerge([X T1],T2,T). polowa(l,a,b):-polowa2(l,l,a,b). polowa2([],r,[],r). polowa2([_],r,[],r). polowa2([_,_ T],[X L],[X L1],R) :- polowa2(t,l,l1,r).
naiwne bąbelkowe przez wstawiania przez łączenie szybkie szybkie qsort([],[]). qsort([x Tail], Sorted) :- split(x, Tail, Small, Big),!, qsort(small, SortedSmall), qsort(big, SortedBig), lacz(sortedsmall, [X SortedBig], Sorted). split(h,[],[],[]). split(h,[x T],[X L],G) :- X=<H,split(H,T,L,G). split(h,[x T],L,[X G]) :- X>H,split(H,T,L,G). lacz([], L, L). lacz([x L1], L2, [X L3]) :- lacz(l1, L2, L3).