Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Michał Wujkowski Przemysław Cecelski Kamil Rychli ń ski Mateusz Iwa ń ski Prolog – bliższe spojrzenie.

Podobne prezentacje


Prezentacja na temat: "Michał Wujkowski Przemysław Cecelski Kamil Rychli ń ski Mateusz Iwa ń ski Prolog – bliższe spojrzenie."— Zapis prezentacji:

1 Michał Wujkowski Przemysław Cecelski Kamil Rychli ń ski Mateusz Iwa ń ski Prolog – bliższe spojrzenie

2 Listy Listy w Prologu mog ą przechowywa ć dane dowolnego typu [alpha,beta,gamma,delta] [1,2,3] Sama lista równie ż mo ż e zawiera ć list ę : [[a,list,within],a,list]

3 Listy mog ą by ć tworzone przez zjednoczenie, cała list zostaje przypisane do danej zmiennej lub kilku zmiennych, dotyczy to równie ż list lub struktur w nich osadzonych(przykład 3,4) np.: UnifyWithResult [a,b,c]XX=[a,b,c] [X,Y,Z][a,b,c]X=a, Y=b, Z=c [[a,b],c][X,Y]X=[a,b], Y=c [a(b),c(X)][Z,c(a)]X=a, Z=a(b)

4 Ka ż da lista mo ż e by ć podzielona na głow ę i ogon za pomoc ą symbolu „ | „. Oczywi ś cie głowa to pierwszy element, ogon pozostałe. Ogon w odró ż nieniu od głowy mo ż e by ć pusty. [a|[b,c,d]] = [a,b,c,d] [a|[]] = [a] [] -oznacza list ę pust ą UnifyWithResult [X|Y][a,b,c,d]X=a, Y=[b,c,d] [X|Y][a]X=a, Y=[]

5 Najciekawsze przykłady z wieloma elementami w head/tail, nie zawsze jest to jeden element! np.:[a,b,c|[d,e,f]] = [a,b,c,d,e,f] UnifyWithResult [X,Y|Z][a,b,c]X=a, Y=b, Z=[c] [X,Y|Z][a,b,c,d]X=a, Y=b, Z=[c,d] [X,Y,Z|A][a,b,c]X=a, Y=b, Z=c, A=[] [X,Y,Z|A][a,b]fails

6 Przykład Program: third_element([A,B,C|Rest],C). – definicja listy Wywołanie: 1) third_element([a,b,c,d,e,f],X). 2) third_element([a,b,Y,d,e,f],c). Wynik: 1) X = c 2) Y = c

7 Błąd podczas kompilacji: Singleton variables: [A,B,Rest] Powy ż szy bł ą d jest spowodowany tym, i ż mamy program w postaci: third_element([A,B,C|Rest],C). Gdzie elementy A,B,Rest nie s ą nigdzie u ż ywane i nie posiadaj ą warto ś ci, je ż eli takich zmiennych nie potrzebujemy mo ż emy zast ą pi ć je znakiem _ wtedy wspomniany bł ą d znika tj.: third_element([_,_,C|_],C).

8 Zadanie, sprawdzi ć czy pierwsze dwa elementy s ą jednakowe: Program: takie_same([A,A,_|_]). Wywałania: 1) takie_same([a,b,c,d,e,f]). 2) takie_same([a,a,c,d,e,f]). 3) takie_same([a,X,c,d,e,f]). Wyniki: 1) false 2) true 3) X=a W 3. przypadku do zmiennej X przypisana została warto ść pierwszego elementu

9 Zadanie, zamieni ć pierwsze dwa elementy listy i zwróci ć pozostałe Program takie_same([A,B|Z],[B,A|Z]). Wywołanie 1) takie_same([x,i,c,d],K) 2) takie_same([x,[1,2,3],c,d],K). Wynik 1) K = [i, x, c, d] 2) K = [[1, 2, 3], x, c, d]

10 Listy jako rekordy Lista mo ż e przechowywa ć dane w postaci rekordów, dla przykładu przechowajmy dane osobowe: ['Michael Covington', '285 Saint George Drive', 'Athens', 'Georgia', '30606']

11 Najwa ż niejsz ą ró ż nic ą jest fakt, ż e liczba elementów listy nie musi by ć z góry okre ś lona a elementy list nie musz ą by ć danego typu co daje mo ż liwo ść zapisanie np. daty urodzenie i jednocze ś nie nazwiska. Lista mo ż e zawiera ć inn ą list ę jak wcze ś niej wspomnieli ś my dla przykładu nazwisko osoby, dzieci, szkoła: [ `Adam Nowak `, [`Marta`, `Maciek`, `Ada`], `Uniwersytet Łódzki`]

12 Listy mo ż na u ż y ć równie ż jako tablicy np. do przechowania macierzy: [[1,2,3], [4,5,6], [7,8,9]] Nale ż y pami ę ta ć jednak, ż e czas dost ę pu do elementu na li ś cie jest zale ż ny od odległo ś ci elementu od pocz ą tku listy, poniewa ż komputer musi przejrze ć cał ą list ę od pocz ą tku aby znale źć potrzebny nam element w przypadku tablicy czas dost ę pu do danej jest zawsze taki sam.

13 Rekurencja a listy Nie zawsze mo ż emy jasno okre ś li ć ile elementów b ę dzie miała nasza lista wtedy z pomoc ą przychodzi nam rekurencja. We ź my pod uwag ę takie zadanie, mamy sprawdzi ć czy X jest elementem listy Y, oczywi ś cie nie wiemy z góry ile elementów ma lista Y, nie mo ż emy w tym przypadku u ż y ć sko ń czonej liczby predeterminowanych pozycji, musimy przeszukiwa ć tak długo list ę, a ż nie znajdziemy elementu X lub nie sko ń cz ą si ę dane do przeszukiwania – lista Y. Nale ż y równie ż obsłu ż y ć przypadek w którym list Y b ę dzie pusta.

14 Program: member(X,[X|_]) member(X,[_|Ytail]) :- member(X,Ytail) Wywołanie: 1) member(c,[a,b,c]). - true 2) member(f,[a,b,c]). – false Schemat nie pasuje do klauzuli 1 wi ę c program kontynuuje działanie w drugim „przebiegu” wywołane jest member(c,[b,c]). Id ą c dalej otrzymamy member(c,[c]) w tym przypadku [c]=[c|[]] tak wi ę c otrzymamy warto ść true.

15 Przeliczanie elementów listy Zakładamy ż e lista jest pusta List_length([],0). W innym przypadku pomi ń pierwszy element i policz liczb ę pozostałych w Tail, algorytm działa równie ż rekurencyjnie, poniewa ż ż eby policzy ć cało ść pocz ą tkowo liczy elementy mniejszej listy. Kod: list_length([],0) list_length([_|Tail],K) :- list_length(Tail,J), K is J + 1. ?- list_length([a,b,c],K0). ?- list_length([b,c],K1). ?- list_length([c],K2). ?-listl_ength([],0). ?- K2 is 0+1. ?- K1 is 1+1. ?- K0 is 2+1.

16 Ł ą czenie list Do ł ą czenie list nie mo ż emy u ż y ć znaku „ | ”, wynikiem nadal byłaby lista w li ś cie dla przykładu we ź my [a,b,c] z [d,e,f], aby uzyska ć [a,b,c,d,e,f] W momencie kiedy u ż yjemy „ | ” otrzymamy nast ę puj ą cy wynik: [[a,b,c],d,e,f] Na pocz ą tek zajmijmy si ę warunkiem ograniczaj ą cym, gdy ż lista ewentualnie zostanie pusta. append([],X,X). Rekurencyjna klauzula : append([X1|X2],Y,[X1|Z]) :- append(X2,Y,Z). We ź pierwszy element pierwszej listy(nazwij X1) Rekurencyjnie doł ą cz ogon pierwszej listy do całej drugiej listy. Nazwij rezultat Z. Dodaj X1 do pocz ą tku Z.

17 Rekurencyjne odwracanie listy 1. Podziel oryginaln ą list ę na head(głow ę ) i tail(ogon). 2. Rekurencyjnie odwróci ć tail(ogon) oryginalnej listy. 3. Stworzy ć liste której jedyne elementy s ą head(głow ą ) oryginalnej listy. 4. Powi ą za ć odwrócony tail(ogon) oryginalnej listy z list ą stworzon ą w kroku 3. reverse([],[]). reverse([Head|Tail], Result) :- reverse(Tail,ReversedTail), append(ReversedTail,[Head],Result).

18 Ci ą gi znaków W Prologu mo ż na reprezentowa ć ciagi znaków na 3 sposoby: - Jako atom. Atomy s ą kompaktowe ale ci ęż ko nimi manipulowa ć - Jako lista kodów ASCII - Jako lista jednoznakowych atomów. Wpisuj ą c słowo „abc”, Prolog interpretuje to jako nast ę puj ą ce kody ASCII [97,98,99]. Teoria z ksi ąż ki mówi, ż e problemem jest wy ś wietlenia samych znaków poniewa ż przy u ż ycia funkcji write lub display otrzymamy liste numerów ASCII zamiast napisu. Nie zauwa ż yli ś my tego, poniewa ż kompilator w naszej wersji zwraca wła ś ciwy ju ż napis.

19 Zakładaj ą c jednak, ż e jest inaczej nale ż y u ż y ć listy w nast ę puj ą cy sposób: write_str([Head|Tail]) :- put(Head), write_str(Tail). write_str([]). -- instrukcja put zamienia kod ASCII na liter ę Rekurencja jest prosta do ś ledzenia. Je ż eli string nie jest pusty (tak wi ę c b ę dzie si ę zgadzał [Head|Tail]) wypisze pierwsz ą pozycjie i powtórz procedure dla pozostałych pozycji. Kiedy String stanie si ę pusty, zako ń cz powodzeniem bez kolejnych akcji. Stringi s ą listami w ka ż dym sensie słowa i kazda lista technik przetwarzania mo ż e by ć na nich u ż yta. Tak wi ę c reverse odwróci string-a, append zwi ąż e lub podzieli string itd..

20 Struktury danych i obliczenia

21 Arytmetyka Przykłady jak wygl ą da prosta arytmetyka w Prologu: ?- Y is 2+2. Y = 4 ?- 5 is 3+3. false ?- Z is (3.9 / 2.1). Z = Predykat „ is ” oblicza wyra ż enie arytmetyczne z prawej strony i przypisuje je do wyra ż enia po lewej stronie.

22 Operatory + dodawanie - odejmowanie * mno ż enie / dzielenie zmiennoprzecinkowe // dzielenie całkowite mod modulo

23 Funkcje abs() - warto ść bezwzgl ę dna sqrt() – pierwiastek kwadratowy log() – logarytm, przy podstawie e exp() - funkcja wykładnicza, podstawa e floor() – najwi ę ksza warto ść integer mniejsza lub równa argumentowi round() - zaokr ą glenie do najbli ż szej liczby

24 Operatory R is wyra ż enie – ocenia i przypisuje warto ść wyra ż enie1 =:= wyra ż enie2 – je ż eli równe wyra ż enie1 =\= wyra ż enie2 – je ż eli ró ż ne wyra ż enie1 > wyra ż enie2 – je ż eli wi ę ksze wyra ż enie1 < wyra ż enie2 – je ż eli mniejsze wyra ż enie1 >= wyra ż enie2 – je ż eli wi ę ksze b ą d ź równe wyra ż enie1 =< wyra ż enie2 – je ż eli mniejsze b ą d ź równe

25 Konstruowanie wyrażeń ?- 4+1 =:= 2+3. true. ?- 4 is sqrt(16). false. ?- 4.0 is sqrt(16). true. ?- What is 2 + 3* What = 19.

26 Ciągi znaków S ą trzy sposoby na zaprezentowanie ci ą gu znaków w Prologu: Jako atom. Jako lista kodów ASCII. Jako lista jedno znakowych atomów. Je ś li wpiszemy („like this”) to komputer zinterpretuje to jako liste kodów ASCII. A wi ę c „abc” i [97,98,99] dla Prologa to dokładnie to samo. Lista kodów ASCII to tradycyjnie nazywany string.

27 Struktury Wiele warunków w Prologu składa si ę z funktora wynikaj ą cego z zera albo wi ę kszej ilo ś ci warunków takich jak: a(b,c) alpha([beta,gamma],X) 'this and'(that) f(g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) i_have_no_arguments Warunki tej formy nazywane s ą Structures(Struktury). Funktor zawsze jest atomem, ale argumenty mog ą by ć warunkami ka ż dego typu. Struktura bez argumentów jest po prostu atomem.

28 Przykład u ż ycia struktur: person(name('Michael Covington'), gender(male), birthplace(city('Valdosta'), state('Georgia'))) sentence(noun_phrase(determiner(the), noun(cat)), verb_phrase(verb(chased), noun_phrase(determiner(the) ), noun(dog)))) Struktury działaj ą podobnie jak listy, ale inaczej s ą przechowywane w pami ę ci. Jedn ą z wa ż niejszych ró ż nic to to, ż e lista jest podzielona na head i tail, a struktura nie jest. Struktura zjednoczy si ę z inna kiedy ma taki sam funktor i taka sam ą ilo ść argumentów.

29 UnifyWithResult a(b,c)XX=a(b,c) a(b,c)a(X,Y)X=b, Y=c a(b,c)a(X)fails a(b,c)a(X,Y,Z)fails

30 „Occurs check” Mo ż emy stworzy ć dziwaczna, zap ę tlon ą struktur ę. Struktury te zawieraj ą wska ź niki do siebie, a one doprowadzaj ą do p ę tli bez ko ń ca. ?- X = f(X). X = f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f (f(f... ?- X = [a,b,X] X = [a,b,[a,b,[a,b,[a,b,[a,b,[a,b,[a,b,[a,b[a,b,[a,b[a,b, [a,b... ?- f(X) = f(f(X)) X = f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f (f(f(... Standard ISO posiada funkcje unify_with_occurs_check która odpowiada za kontrole przed próba wykonania: ?- unify_with_occurs_check(X,f(X)). no. ?- unify_with_occurs_check(X,f(a)). X = f(a)

31 Strategie przechowywania danych S ą trzy sposoby na przechowywanie danych w programach w Prologu: W instancji zmiennej. Nie jest to trwały sposób przechowywania danych, poniewa ż działa tylko w zasi ę gu klauzuli która je definiuje. W argumentach. Lista argumentów jest sposobem by procedura komunikowała si ę. Procedura mo ż e wykona ć rekurencyjnie proces i zapisywa ć informacje z jednej rekurencji do drugiej. W bazie wiedzy. Jest to najtrwalszy sposób przechowywania danych.

32 Zadanie Napisz funkcj ę w prologu, która odwraca list ę list, Tzn: reverseLL([[1,2,3],[4,5],[8,9]],X) X = [[3,2,1],[5,4],[9,8]] reverseLL([],[]) reverseLL([X|Y],Z) :- reverse(X,A), reverseLL(Y,B), append(A,B,Z).


Pobierz ppt "Michał Wujkowski Przemysław Cecelski Kamil Rychli ń ski Mateusz Iwa ń ski Prolog – bliższe spojrzenie."

Podobne prezentacje


Reklamy Google