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