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

Slides:



Advertisements
Podobne prezentacje
Struna – rozwi ą zanie dAlemberta Ewa Jench WFiIS AGH.
Advertisements

Tablice.
Opracowanie: Maria W ą sik. Pierwsze komputery budowano w celu rozwi ą zywania konkretnych problemów. Gdy pojawiało si ę nowe zadanie, nale ż ało przebudowa.
Instrukcje sterujące część 1
Prąd elektryczny Opór elektryczny.
PASCAL pętla WHILE.
Programowanie strukturalne i obiektowe
Budowanie schematu blokowego
TABLICE C++.
Mateusz Siuda klasa IVa
Jak można nauczyć korzystania z prawdopodobieństwa.
UŁAMKI ZWYKŁE ?.
Krakowski Piotr, Woliński Radosław, Kowalski Piotr, Machowski Michał.
Typy liczbowe, zmienne, operatory Zajęcia 4. Zmienne Zmienna – to w programowaniu element programu, który może mieć przypisaną pewną wartość (wartość.
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]
Proces doboru próby. Badana populacja – (zbiorowość generalna, populacja generalna) ogół rzeczywistych jednostek, o których chcemy uzyskać informacje.
W tej prezentacji dowiecie się dlaczego i w jaki sposób papierosy, alkohol oraz narkotyki szkodzą zdrowiu i jak to zwalczać. Postaram się odpowiedzieć.
„Jak pomóc uczniom się uczyć i czerpać z tego radość?” opracowała: Krystyna Turska.
Pionierka ogół umiejętności związanych z budowaniem przez harcerzy.
Stężenia Określają wzajemne ilości substancji wymieszanych ze sobą. Gdy substancje tworzą jednolite fazy to nazywa się je roztworami (np. roztwór cukru.
Copyright (c) PortalMatematyczny.pl. Strona Główna Co to jest hazard ? Gry hazardowe Legenda: Slajd końcowy Strona G ł ówna Przejdź do strony głównej.
Opis karty według metody wielowskaźnikowej-podwójnego sprawdzenia.
© Matematyczne modelowanie procesów biotechnologicznych - laboratorium, Studium Magisterskie Wydział Chemiczny Politechniki Wrocławskiej, Kierunek Biotechnologia,
Excel 2007 dla średniozaawansowanych zajęcia z dnia
 Formuła to wyrażenie algebraiczne (wzór) określające jakie operacje ma wykonać program na danych. Może ona zawierać liczby, łańcuchy znaków, funkcje,
Ćwiczenia Zarządzanie Ryzykiem Renata Karkowska, ćwiczenia „Zarządzanie ryzykiem” 1.
Cel analizy statystycznej. „Człowiek –najlepsza inwestycja”
Wyrażenia Algebraiczne Bibliografia Znak 1Znak 2 Znak 3 Znak 4 Znak 5 Znak 6 Znak 7 Znak 8 Znak 9 Znak 10 Znak 11.
FORMAT WYMIANY DANYCH GEODEZYJNYCH TANAGO. TANGO V. 1.
Poczta elektroniczna – e- mail Gmail zakładanie konta. Wysyłanie wiadomości.
Wypadkowa sił.. Bardzo często się zdarza, że na ciało działa kilka sił. Okazuje się, że można działanie tych sił zastąpić jedną, o odpowiedniej wartości.
OBSŁUGA KARTY DILO. Karta diagnostyki i leczenia onkologicznego zawiera: - oznaczenie pacjenta, pozwalające na ustalenie jego tożsamości, - oznaczenie.
Algorytmy. Co to jest algorytm? Przepis prowadzący do rozwiązania zadania.
Zmienne losowe Zmienne losowe oznacza się dużymi literami alfabetu łacińskiego, na przykład X, Y, Z. Natomiast wartości jakie one przyjmują odpowiednio.
Karolina Supera Michał Krajewski. Struktura w formie drzewa Funktor jest węzłem Składniki struktur są gałęziami W strukturze możemy zagnieżdżać inne struktury.
Analiza tendencji centralnej „Człowiek – najlepsza inwestycja”
Zapraszamy na naszą stronę. Zależy nam na kontakcie z Wami. Czytajcie, komentujcie i dyskutujcie na forum. Nic o Was bez Was Zapraszamy na naszą stronę.
Porównywarki cen leków w Polsce i na świecie. Porównywarki w Polsce.
ULAMKI ZWYKLE KLASA IV. 2 3 kreska ułamkowa licznik ułamka mianownik ułamka ULamek zwykLy.
W KRAINIE TRAPEZÓW. W "Szkole Myślenia" stawiamy na umiejętność rozumowania, zadawania pytań badawczych, rozwiązywania problemów oraz wykorzystania wiedzy.
Algorytmy Informatyka Zakres rozszerzony
KARTY RATOWNICZE W POLSCE
KOMBINATORYKA.
Komunikatory Zespół Szkół Zawodowych Nr 3 im. Adama Kocura w Katowicach - Janowie.
Menu Jednomiany Wyrażenia algebraiczne -definicja Mnożenie i dzielenie sum algebraicznych przez jednomian Mnożenie sum algebraicznych Wzory skróconego.
Instalacja nienadzorowana windows xp Jakub klafta.
Python. Języki Programistyczne Microcode Machine code Assembly Language (symboliczna reprezentacja machine code) Low-level Programming Language (FORTRAN,
Optymalna wielkość produkcji przedsiębiorstwa działającego w doskonałej konkurencji (analiza krótkookresowa) Przypomnijmy założenia modelu doskonałej.
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Nr36zad3 Klasa IIIa Gimnazjum w Bogdańcu ma zaszczyt zaprezentować rozwiązanie zadania: o trójkątach z monet!
Prolog: Struktury danych Przemysław Bluszcz Maciej Laskowski Marcin Biernat.
Prolog: Struktury danych
Typy wyliczeniowe, kolekcje
Rozdział 5 REKURENCJA.
Schematy blokowe.
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
Liczby pierwsze.
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
Rekursje Tak jak w innych językach funkcje mogą odwoływać się same do siebie Możemy regulować głębokość przed stwierdzeniem błędu (MaxRecursion, $RecursionLimit,
Wykonali: Jakub Gutkowski, Klaudia Belka, Damian Koncewicz
Pisemne dzielenie liczb naturalnych
Proste obliczenia w arkuszu kalkulacyjnym
Rekurencja Ponieważ w Haskellu nie mamy klasycznych pętli for czy while dlatego w wielu algorytmach musimy używać rekurencji.
Implementacja rekurencji w języku Haskell
Haskell Składnia funkcji.
Doskonalenie rachunku pamięciowego u uczniów
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Zapis prezentacji:

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

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

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

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

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]

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']

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`]

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

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

Struktury danych i obliczenia

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.

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

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

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

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.

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.

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.

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.

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

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

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.

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