Programowanie w logice - Wejscie i wyjscie Sortowanie
Transkrypt
Programowanie w logice - Wejscie i wyjscie Sortowanie
Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Programowanie w logice Wejście i wyjście Sortowanie Piotr Fulmański Wydział Matematyki UŁ 30 marca 2007 Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Plan prezentacji 1 Czytanie i pisanie termów Czytanie termów Pisanie termów 2 Czytanie i pisanie znaków Czytanie znaków Pisanie znaków 3 Czytanie z pliku i pisanie do pliku Czytanie z pliku 4 Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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. Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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 Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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 Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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 Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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 Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie 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. Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Sortowanie 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]). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Sortowanie 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]). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Sortowanie 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). Piotr Fulmański Programowanie w logice Czytanie i pisanie termów Czytanie i pisanie znaków Czytanie z pliku i pisanie do pliku Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie Sortowanie naiwne bąbelkowe przez wstawiania przez łączenie szybkie Sortowanie 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). Piotr Fulmański Programowanie w logice