Prolog: Struktury danych Przemysław Bluszcz Maciej Laskowski Marcin Biernat.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Sortowanie przez scalanie
Związki w UML.
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Schemat blokowy M START KONIEC
PROGRAMOWANIE STRUKTURALNE
PROGRAMOWANIE STRUKTURALNE
ALGORYTM Co to jest algorytm?
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
Liczby Pierwsze - algorytmy
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Podstawy informatyki Powtórka Grupa: 1A Prowadzący: Grzegorz Smyk
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Prowadzenie wywiadów grupowych MODUŁ IV Sesja 2B PROGRAM WZMOCNIENIA.
BD-LAB6 Wojciech Pieprzyca
Dr Anna Kwiatkowska Instytut Informatyki
Zapis informacji Dr Anna Kwiatkowska.
Wprowadzenie do programowania w języku Turbo Pascal
Strategia skutecznego szukania informacji w Internecie
Podstawy programowania
MATEMATYCZNE METODY SZYFROWANIA
Programowanie strukturalne i obiektowe
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Poznaj bliżej program Microsoft Office Word 2007
TABLICE C++.
Algorytmy i struktury danych
A. Sumionka. Starodawna gra marynarska; Gra dwu i wieloosobowa; Gracze wykonują ruchy naprzemian; Złożona ze stosów, w których znajduje się pewna ilość
Instrukcja USOS Rejestracja na zajęcia obieralne wersja by Marek Opacki.
Instrukcja USOSweb Wersja: Opracował: Sebastian Sieńko Moduł sprawdzianów.
ANNA BANIEWSKA SYLWIA FILUŚ
Języki i automaty część 3.
Inicjalizacja i sprzątanie
XML – eXtensible Markup Language
Algorytmy.
Farseer Physics Engine. Farseer Physics Engine jest silnikiem fizycznym napisanym dla platformy.NET. Został on zainspirowany przez silnik Box2D znany.
Elżbieta Fiedziukiewicz
MICROSOFT Access TWORZENIE MAKR
Projektowanie stron WWW
Wzorce slajdów programu microsoft powerpoint
Obliczalność czyli co da się policzyć i jak Model obliczeń maszyna licznikowa dr Kamila Barylska.
Algorytmy- Wprowadzenie do programowania
Projektowanie relacyjnych baz danych – diagramy związków encji
Temat 5: Instrukcje: print(), echo()
Krakowski Piotr, Woliński Radosław, Kowalski Piotr, Machowski Michał.
Relacja (ang.relation) Po podzieleniu danych na tabele i zdefiniowaniu pól kluczy podstawowych trzeba wprowadzić do systemu bazy danych informacje na temat.
Struktury danych i obliczenia w Prologu Autorzy: Kamil Krajewski Mateusz Szymański Paweł Bińkowski.
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]
Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski.
Instrukcja Rejestracja do I edycji Gimnazjalnej Olimpiady Wiedzy o Społeczeństwie Instrukcja
Wstęp do programowania Wykład 10 Programowanie w logice.
PHP jest językiem skryptowym służącym do rozszerzania możliwości stron internetowych. Jego składnia jest bardzo podobna do popularnych języków programowania.
„Filtry i funkcje bazodanowe w EXCELU”
Michał Wujkowski Przemysław Cecelski Kamil Rychli ń ski Mateusz Iwa ń ski Prolog – bliższe spojrzenie.
Algorytmy. Co to jest algorytm? Przepis prowadzący do rozwiązania zadania.
Algorytmy, sposoby ich zapisu.1 Algorytm to uporządkowany opis postępowania przy rozwiązywaniu problemu z uwzględnieniem opisu danych oraz opisu kolejnych.
Liczbami naturalnymi nazywamy liczby 0,1,2,3,..., 127,... Liczby naturalne poznaliśmy już wcześniej; służą one do liczenia przedmiotów. Zbiór liczb.
Uruchamianie programu. Po rozwinięciu zakładki Inwentaryzacja należy wybrać pierwszą pozycję - Inwentaryzacje.
Nawracanie i odcięcie Jakub Czoboda, Jezierski Aleksander, Skierkowski Paweł, Bembenista Kamil, Martynowski Witold.
Prolog: Struktury danych
Rekurencja - Haskell Bartosz Pawlak Sebastian Żółtowski Adam Stegenda Krystian Sobótka Tomasz Gołębiewski.
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Typy wyliczeniowe, kolekcje
Rozdział 5 REKURENCJA.
Listy.
Wstęp do Informatyki - Wykład 6
Patryk Kłys Aleksandra dąbrowska
A closer look.
Wykonali: Jakub Gutkowski, Klaudia Belka, Damian Koncewicz
Prolog – Using Data Structures
Haskell Składnia funkcji.
Zapis prezentacji:

Prolog: Struktury danych Przemysław Bluszcz Maciej Laskowski Marcin Biernat

Struktury i drzewa  Zwykle łatwiej jest zrozumieć postać skomplikowanej struktury, jeśli piszemy je w postaci drzewa, w którym każdy funktor jest gałęzią, a składniki to liście. Każdy liść może wskazywać na inną strukturę, więc możemy mieć struktury w strukturach. Jest w zwyczaju pisać schemat drzewa z korzeniem na górze, a na dole liście. Na przykład, rodzice struktura (Charles, Elizabeth, Philip) jest zapisana jako:

 Struktura a + b * c (lub równoważnie + (a * (b, c))) jest zapisana jako:  Struktura książki (moby_dick, autor (Herman Melville)) jest zapisana jako:

 Zauważmy, że ostatnie dwie struktury drzewa mają ten sam kształt, choć korzenie i liście są różne. Zanim przejdziemy dalej, należy upewnić się, że można pisać diagramy drzewa dla każdej ze struktur, które widzieliście w poprzednich rozdziałach.  Przypuśćmy, że biorąc pod uwagę zdanie "Jan lubi Mary" i musimy reprezentować składnię zdania. Bardzo prosta składnia z języka angielskiego jest taka, że zdanie składa się z rzeczownika, a następnie wyrażenie z czasownika. Dodatkowo fraza czasownik składa się z czasownika i innego rzeczownika.  Zdanie (rzeczownik (X), VERB_PHRASE (czasownik (Y), rzeczownik (Z)))  Jeżeli weźmiemy pod uwagę nasze zdanie ( "John lubi Mary"), a instancje zmiennych w strukturze ze słowami zdania, otrzymujemy:

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]

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)

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=[]

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

Przykład Program 2: Tworzenie podlisty ?- L1 = [1, 2, 3, 4], L1 = [A, B, C, D], L2 = [D, C, B, A]. Wynik: L1 = [1, 2, 3, 4], A = 1, B = 2, C = 3, D = 4, L2 = [4, 3, 2, 1].

 W Prologu dostępnych jest wiele predykatów wyrażających warunki na listach. Najważniejsze z nich to: member(X, L) spełniony, gdy X jest elementem listy L;  append(L1, L2, L3) spełniony, gdy lista L3 jest połączeniem list L1 i L2;  select(X, L1, L2) spełniony, gdy lista L2 jest listą pozostałą z listy L1 po wyjęciu z niej elementu X.  Należy zwrócić uwagę, że powyższe warunki mogą być spełnione na wiele sposobów dostarczając wiele odpowiedzi.

Na przykład, jeśli pytamy się o element listy trójelementowej, to otrzymamy trzy odpowiedzi: ?- member(X, [a, b, c]). X = a ; X = b ; X = c. Co więcej, Prolog wyraża relacje a nie tylko funkcje, więc predykat append można używać nie tylko do składania list ale również do ich rozrywania: ?- append([1, 2], [3, 4, 5], X). X = [1, 2, 3, 4, 5]. ?- append(X, Y, [a, b, c]). X = [], Y = [a, b, c] ; X = [a], Y = [b, c] ; X = [a, b], Y = [c] ; X = [a, b, c], Y = [] ; false.

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

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: [ `Robert Lewandowski`, [`Lewy`, `Maciek`, `Marcin`], `PWSZ Płock`]

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.

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.

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.

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.

Łączenie list Do łączenie list nie możemy użyć znaku „|”, wynikiem nadal byłaby list 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.

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).

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.

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..