Lab 5 - Przemysław Juszczuk

Transkrypt

Lab 5 - Przemysław Juszczuk
Języki programowania deklaratywnego
dr Przemysław Juszczuk
Katedra Inżynierii Wiedzy
laborki 5
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Powtórka
Obiekty - jego opis i relacje jakim podlega obiekt;
Termy - stałe, zmienne, struktury (termy złożone);
Termy złożone - obiekty złożone z innych obiektów;
Klauzule - fakty i reguły;
Reguły - zbiór warunków, jakie muszą być spełnione (ciało reguły prawa część wyrażenia), aby cel był spełniony (cel, czyli głowa - lewa
część wyrażenia);
Unifikacja - proces dopasowywania - każda zmienna po uzgodnieniu
miała tę samą wartość (wyjątek to zmienne anonimowe);
Rekurencja - wywołanie funkcji przez samą siebie;
Predykaty wbudowane - wczytywanie danych z klawiatury, pobieranie
danych, wypisywanie na ekran;
Co jeszcze
Listy;
Rekurencja w listach;
Mechanizm rezolucji.
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Listy
Lista - ciąg uporządkowanych elementów.
Listy - tablice.
[] - lista o długości zero (nil).
Lista o długości n składa się z głowy i ogona o długosci n − 1.
Zatem głowa to pierwszy element listy, a wszystkie pozostałe
elementy należą do ogona.
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Rysunek: Lista jako drzewo
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Listy
[1, 2, 3, 4] - lista złożona z 4 elementów;
[1, 2, 3, [ala, kot]] - lista list.
[a] - lista złożona z elementu a.
[H|T ] - wyróżnienie głowy (head) i ogona (tail) w liście;
[H|T ] = [1, 2, 3, 4] - czyli H = 1 i T = [2, 3, 4].
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Przykłady list
[a, b, c] - głowa - a, ogon - b,c.
[] - lista pusta. Brak głowy i ogona.
[[bury , kot], mruczy ] - [bury , kot] - głowa, mruczy -ogon.
[bury , [kot, mruczy ]] - bury - głowa, [kot, mruczy ] -ogon.
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Ćwiczenie
Określ głowę i ogon podanych list:
[a, b, c].
[a].
[].
[[the, cardinal], [pulled, [off ]], [each, [plum, coloured], shoe]]
Listy i jeszcze o uzgadnianiu
[X , Y , Z ] - [jan, lubi, ryby ].
[kot] - [X |Y ]; (X = kot, Y = []).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Jeszcze o listach
Przynależność elementu do listy:
nalezy(X,[X|_]).
nalezy(X,[_|Yogon]) :-
nalezy(X,Yogon).
?- nalezy(a, [a,b,c]).
albo wersja wbudowana
member(X, [X|T]).
member(X, [H|T]) :- member(X, T).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Jeszcze o listach
Zliczanie elementów listy:
dlugosc([],0).
dlugosc([_|Ogon],Dlug) :dlugosc(Ogon,X),
Dlug is X+1.
?- dlugosc([a,b,c,d],X)
Sklejanie list:
klejListy([],X,X).
klejListy([X|Lista1],Lista2,[X|Lista3]) :klejListy(Lista1,Lista2,Lista3).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Rysunek: Konkatenacja
append(List1, List2, Result) :List1 = [Head1|Tail1],
Result = [Head1|Result’]
append(Tail1, List2, Result’).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Jeszcze o listach
?- klejListy([a,b,c,d],[c,d,e,f],X).
?- klejListy([a,b,c],Wynik,[c,d,e]).
?- klejListy([a,b],X,[a,b,c,d]).
?- klejListy(A,B,[a,b,c,d,e]).
?- klejListy([1,2,3],[a,b,c],X).
?- klejListy([1,2,3],[a(e),b(f),c(d,g)],X).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Jeszcze o listach
Dodawanie elementów:
dodaj(X,L,[X|L]).
?- dodaj(a,[c,d],X).
Usuwanie elementów:
usun(X,[X|Reszta],Reszta).
usun(X,[Y|Ogon],[Y|Reszta]) :usun(X,Ogon,Reszta).
????-
usun(a,[a,b,a,c,a,a],X).
usun(a,[a,b,c,d],X).
usun(c,[a,b,c,d],X).
usun(c,X,[a,b,c,d]).
?- usun(1,X,[a,b,c,d]).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Ćwiczenie
Napisz predykat, który wypisuje elementy listy (a co z wypisaniem listy
tak, aby każdy element znalazł się w nowej linii? - nl).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
my_write([]).
my_write([X|R]):- write(X),my_write(R).
% oraz
my_write([]).
my_write([X|R]):- write(X),nl,my_write(R).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Ćwiczenie
Napisz predykat umożliwiający wyznaczenie liczby elementów listy:
size([],0).
size([H|T],N) :- size(T,N1), N is N1+1.
Ćwiczenie
Na podstawie powyższego programu napisz program sumujący elementy z
listy.
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Sumowanie elementów listy
sumuj([X],X).
sumuj([H|T],S):- sumuj(T,ST), S is ST + H.
i teraz: sumuj([a,b,c,d],X).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Unifikacja - powtórka
[a, d, z, c] i [H|T ].
[apple, pear , grape] i [A, pear |Rest]
[a|Rest] i [a, b, c]
[a, []] i [A, B|Rest]
[One] i [two|[]]
[one] i [Two]
[a, b, X ] i [a, b, c, d]
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Jeszcze o listach
Odwracanie listy:
odwroc([],[]).
odwroc([H|T],L) :odwroc(T,R),
sklej(R,[H],L).
?- odwroc([a,b,c,d],X).
?- odwroc([a,b,c,d],[d,c,b,a]).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Listy
zagadka(X, A,
?- zagadka(a,
?- zagadka(b,
?- zagadka(X,
?- zagadka(X,
B) :- member(X, A), member(X,
[b, c, a], [p, a, l]).
[b, l, u, e], [y, e, l, l, o,
[r, a, p, i, d], [a, c, t, i,
[w, a, l, n, u, t], [c, h, e,
dr Przemysław Juszczuk
B).
w]).
o, n]).
r, r, y]).
Języki programowania deklaratywnego
Ćwiczenia
Napisz predykaty:
pierwszyNaLiscie(X,Y).
drugiNaLiscie(X,Y).
ostatniNaLiscie(X,Y).
sumaElementowListy(X,W).
sumaDodatnichElementowListy(X,W).
maksymalnyLista(X,W).
odwrocListe(X,Y).
dr Przemysław Juszczuk
Języki programowania deklaratywnego
Kod ASCII a metoda put
X = ’a’, put(X).
X = ’ala’, put(X). - oczekujemy pojedynczego znaku.
put(65),put(66),put(67). - kod ASCII
Ćwiczenie
Napisz program, który pozwoli wypisać na ekran wszystkie samogłoski.
dr Przemysław Juszczuk
Języki programowania deklaratywnego