Programowanie w Logice Struktury danych (Lista 2)

Podobne dokumenty
Programowanie w logice

0.1. Logika podstawowe pojęcia: zdania i funktory, reguły wnioskowania, zmienne zdaniowe, rachunek zdań.

Programowanie w Logice

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

LOGIKA I TEORIA ZBIORÓW

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.2 Elementy języka Prolog: reguły i rekurencja. Przemysław Kobylański

Języki programowania deklaratywnego

Programowanie w Logice

Wprowadzenie do logiki Zdania, cz. III Język Klasycznego Rachunku Predykatów

Metody Kompilacji Wykład 3

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.1 Elementy języka Prolog: fakty i zapytania. Przemysław Kobylański

Liczby zespolone. x + 2 = 0.

Wprowadzenie do Prologa

Programowanie w Logice Środowisko programowania i dialog z systemem (Lista 0)

Projekt 4: Programowanie w logice

Funkcja liniowa - podsumowanie

Semantyka rachunku predykatów

Prolog (Pro-Logic) Programowanie w Logice. Dr inż. Piotr Urbanek

Systemy algebraiczne. Materiały pomocnicze do wykładu. przedmiot: Matematyka Dyskretna 1 wykładowca: dr Magdalena Kacprzak

Technologie i systemy oparte na logice rozmytej

Logika dla socjologów Część 3: Elementy teorii zbiorów i relacji

Warunki logiczne instrukcja if

Zadanie 1. Potęgi (14 pkt)

Programowanie w Logice

POLITECHNIKA ŚLĄSKA. ZADANIE 2 WALCEM PO WALCU Zadanie zaproponowali: dr inż. Mariusz Pleszczyński, Wydział Matematyki Stosowanej, Politechnika Śląska

GRUPA ĆWICZENIOWA (ZAKREŚL ODPOWIEDNIĄ): MG8 MG13 MB13 MD13 BT13

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykłady 12 i 13. Dowód i dowodzenie w KRP. Tezy KRP

Programowanie deklaratywne

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

PROLOG. Prolog. Programowanie, W.F. Clocksin, C.S. Mellish, HELION Prolog, język sztucznej inteligencji, Eugeniusz Gatnar, Katarzyna Stąpor, Wyd.

Elementy języka Prolog

Programowanie deklaratywne

1 Podstawowe oznaczenia

SZTUCZNA INTELIGENCJA

Programowanie deklaratywne

Elementy logiki. Wojciech Buszkowski Wydział Matematyki i Informatyki UAM Zakład Teorii Obliczeń

VII Olimpiada Matematyczna Gimnazjalistów

PLAN PRACY ZAJĘĆ WYRÓWNAWCZYCH Z MATEMATYKI W KLASIE I LO

KURS WSPOMAGAJĄCY PRZYGOTOWANIA DO MATURY Z MATEMATYKI ZDAJ MATMĘ NA MAKSA. przyjmuje wartości większe od funkcji dokładnie w przedziale

Laboratorium przedmiotu Paradygmaty Programowania

Predykat. Matematyka Dyskretna, Podstawy Logiki i Teorii Mnogości Barbara Głut

Programowanie deklaratywne

LVIII Olimpiada Matematyczna

Programowanie w logice Prolog 2

Matematyka licea ogólnokształcące, technika

1 Powtórzenie wiadomości

FUNKCJA LINIOWA, RÓWNANIA I UKŁADY RÓWNAŃ LINIOWYCH

PODSTAWY RACHUNKU WEKTOROWEGO

6. Notacja wykładnicza stosuje notację wykładniczą do przedstawiania bardzo dużych liczb

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Próbny egzamin z matematyki dla uczniów klas II LO i III Technikum. w roku szkolnym 2012/2013

LOGIKA Klasyczny Rachunek Zdań

PODSTAWY SZTUCZNEJ INTELIGENCJI

Zadanie 1. Suma silni (11 pkt)

Przykłady zdań w matematyce. Jeśli a 2 + b 2 = c 2, to trójkąt o bokach długości a, b, c jest prostokątny (a, b, c oznaczają dane liczby dodatnie),

Klasyczny rachunek predykatów

Spacery losowe generowanie realizacji procesu losowego

Podstawy Sztucznej Inteligencji (PSZT)

Matematyka dyskretna dla informatyków

Zapisujemy:. Dla jednoczesnego podania funkcji (sposobu przyporządkowania) oraz zbiorów i piszemy:.

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Testowanie elementów programowalnych w systemie informatycznym

Zapis algorytmów: schematy blokowe i pseudokod 1

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Bukiety matematyczne dla gimnazjum

Kształcenie w zakresie podstawowym. Klasa 2

Krzywa uniwersalna Sierpińskiego

W. Guzicki Zadanie IV z Informatora Maturalnego poziom rozszerzony 1

Elementy logiki matematycznej

1. Algorytmy przeszukiwania. Przeszukiwanie wszerz i w głąb.

Lista zadań - Relacje

1. Wstęp do logiki. Matematyka jest nauką dedukcyjną. Nowe pojęcia definiujemy za pomocą pojęć pierwotnych lub pojęć uprzednio wprowadzonych.

CZEŚĆ PIERWSZA. Wymagania na poszczególne oceny,,matematyka wokół nas Klasa III I. POTĘGI

Internet Semantyczny i Logika II

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Projektowanie relacyjnych baz danych

Języki programowania zasady ich tworzenia

Rachunek logiczny. 1. Język rachunku logicznego.

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Zajęcia nr. 3 notatki

Kryteria ocen z matematyki w klasie drugiej gimnazjum.

Definicja odwzorowania ciągłego i niektóre przykłady

Np. Olsztyn leży nad Łyną - zdanie prawdziwe, wartość logiczna 1 4 jest większe od 5 - zdanie fałszywe, wartość logiczna 0

GEOMETRIA. Klasyfikacja kątów ze względu na

Jest to zasadniczo powtórka ze szkoły średniej, być może z niektórymi rzeczami nowymi.

Logika dla archeologów Część 5: Zaprzeczenie i negacja

4. Funkcje. Przykłady

Programowanie obiektowe - zadania

PROLOG INNE PRZYKŁADY MACIEJ KELM

Programowanie w Logice Gramatyki metamorficzne. Przemysław Kobylański na podstawie [CM2003] i [SS1994]

Odwrotna Notacja Polska

Funkcja jest różnowartościowa w zbiorze A wtedy i tylko wtedy, gdy różnym argumentom funkcja ta przyporządkowuje różne wartości.

Języki programowania Prolog

MATEMATYKA Wymagania edukacyjne i zakres materiału dla klasy drugiej poziom podstawowy w roku szkolnym 2013/2014 ZAKRES MATERIAŁU, TREŚCI NAUCZANIA

Podstawowe Pojęcia. Semantyczne KRZ

Lista 2 logika i zbiory. Zad 1. Dane są zbiory A i B. Sprawdź, czy zachodzi któraś z relacji:. Wyznacz.

Finanse i Rachunkowość studia niestacjonarne Wprowadzenie do teorii ciągów liczbowych (treść wykładu z 21 grudnia 2014)

Funkcje trygonometryczne w trójkącie prostokątnym

0. ELEMENTY LOGIKI. ALGEBRA BOOLE A

Transkrypt:

Programowanie w Logice Struktury danych (Lista 2) Przemysław Kobylański Wstęp Struktury danych wyraża się w Prologu w postaci termów, tj. symbolicznych wyrażeń. Dotychczas poznaliśmy proste termy takie jak zmienne i stałe. Do budowania termów złożonych służą funktory. Nazwą funktora jest alfanumeryczny identyfikator pisany z małej litery (dokładnie tak samo jak w przypadku stałej). Tak jak stałe interpretujemy jako konkretne obiekty z rzeczywistego albo abstrakcyjnego świata, tak funktory interpretujemy jako funkcje operujące na obiektach. Przykładami funktorów mogą być jednoargumentowe ojciec/1 i matka/1. Funktor ojciec będziemy interpretować jako funkcja, która przypisuje osobie jej ojca, natomiast funktor matka będziemy interpretować jako funkcja, która przypisuje osobie jej matkę. Oto przykładowe termy zbudowane z tych funktorów i ich interpretacje: janek matka(janek) ojciec(janek) matka(ojciec(janek)) ojciec(matka(janek)) chłopiec o imieniu Janek matka Janka ojciec Janka babcia Janka ze strony ojca dziadek Janka ze strony mamy Załóżmy, że stałą a będziemy interpretować jako liczba 0 a jednoargumentowy funktor s jako funkcja następnika. Dzięki nim można zdefiniować liczby naturalne i predykat add(x, Y, Z), który jest prawdziwy gdy Z jest sumą X i Y: add(a, X, X). add(s(x), Y, s(z)) :- add(x, Y, Z). Taka definicja pozwala Prologowi nie tylko wyliczyć sumę ale również odejmować a nawet dzielić całkowicie przez dwa: 1

?- add(s(s(a)), s(s(a)), X). X = s(s(s(s(a)))).?- add(s(s(a)), X, s(s(s(a)))). X = s(a).?- add(x, Y, s(s(s(a)))). X = a, Y = s(s(s(a))) ; X = s(a), Y = s(s(a)) ; X = s(s(a)), Y = s(a) ; X = s(s(s(a))), Y = a ;?- add(x, X, s(s(s(s(s(s(a))))))). X = s(s(s(a))) ; Szczególną rolę w Prologu odgrywa dwuargumentowy funktor kropka. Służy on do łączenia pierwszego elementu listy (głowa listy) z listą pozostałych elementów (ogon listy). Możemy go interpretować jako funkcja, która dla danego elementu X i danej listy Y, tworzy nową listę z głową taką jak X i ogonem takim jak Y. Listę pustą zapisuje się jako stała [] (dwa kwadratowe nawiasy). Oto przykłady termów i ich interpretacji: [] lista pusta.(a, []) lista złożona z jednego elementu a.(a,.(b, [])) lista złożona z dwóch elementów a i b.(x, _) lista o głowie X i nieistotnym ogonie.(x,.(x, _)) lista o identycznych dwóch pierwszych elementach Notacja list z użyciem funktora kropka jest uciążliwa. Dlatego stosuje się notację z kwadratowymi nawiasami. W notacji tej wymienia się elementy listy między kwadratowymi nawiasami oddzielając je przecinkami. Do oddzielenia początkowych elementów listy od listy pozostałych elementów używa się pionowej kreski: [1, 2, 3, 4, 5] = [1 [2, 3, 4, 5]] = [1, 2 [3, 4, 5]] = [1, 2, 3 [4, 5]] = [1, 2, 3, 4 [5]] = [1, 2, 3, 4, 5 []] 2

Na zakończenie wstępu podamy definicje trzech podstawowych predykatów operujących na listach: 1. member(x, L), który jest prawdziwy, gdy X jest elementem listy L, 2. append(l1, L2, L3), który jest prawdziwy, gdy lista L3 jest połączeniem (konkatenacją) list L1 i L2, 3. select(x, L1, L2), który jest prawdziwy, gdy lista L2 powstaje z listy L1 przez wyjęcie jednego elementu X. Oto definicje powyższych predykatów: member(x, [X _]). member(x, [_ L]) :- member(x, L). append([], L, L). append([x L1], L2, [X L3]) :- append(l1, L2, L3). select(x, [X L], L). select(x, [Y L1], [Y L2]) :- select(x, L1, L2). Zadania Zadanie 1 (1 pkt) Napisz predykat środkowy(l, X), który jest prawdziwy jeśli X jest środkowym elementem listy L. Jeśli lista L ma parzystą liczbę elementów, to warunek środkowy(l, X) powinien zawieść. Przykład?- środkowy([1, 2, 3, 4, 5], X). X = 3 ;?- środkowy([1, 2, 3, 4], X). Zadanie 2 (2 pkt) 1. Napisz predykat jednokrotnie(x, L), który jest spełniony, jeśli X występuje dokładnie jeden raz na liście L. 2. Napisz predykat dwukrotnie(x, L), który jest spełniony, jeśli X występuje dokładnie dwa razy na liście L. 3

Przykład?- jednokrotnie(x, [3, 2, 4, 1, 2, 3]). X = 4 ; X = 1 ;?- dwukrotnie(x, [3, 2, 4, 1, 2, 3]). X = 3 ; X = 2 ; Wskazówka W definicjach warunków jednokrotnie/2 i dwukrotnie/2 możesz korzystać z innych predykatów. Zadanie 3 (2 pkt) Dany jest graf skierowany w postaci faktów arc(x, Y), wyrażających, że jest łuk od węzła X do węzła Y. Napisz predykat osiągalny(x, Y), który jest spełniony gdy węzeł Y jest osiągalny z węzła X (tzn. jest ścieżka od X do Y). Przykład Załóżmy, że graf składa się z czterech łuków: arc(a, b). arc(b, a). arc(b, c). arc(c, d). Wówczas:?- osiągalny(a, X). X = a ; X = b ; X = c ;?- osiągalny(b, X). X = b ; X = a ; X = c ; 4

?- osiągalny(c, X). X = c ;?- osiągalny(d, X).?- osiągalny(x, a). X = a ; X = b ; Zadanie 4 (2 pkt) Fakty ma(kto, Co) opisują Kto Co ma w chwili początkowej (oznaczmy tę chwilę przez 0). Fakty daje(kiedy, Kto, Co, Komu) opisują Kto Co Komu daje w chwili Kiedy, gdzie Kiedy jest dodatnią liczbą całkowitą. Zakładamy, że osoba, która posiada jakiś przedmiot w chwili T może go przekazać innej osobie w chwili T > T, oczywiście pod warunkiem, że w chwili T jeszcze go posiadała. Napisz predykat ma(kiedy, Kto, Co), który jest spełniony gdy osoba Kto ma obiekt Co w chwili Kiedy (w pytaniach jako pierwszy argument będziemy podawać zmienną by dowiedzieć się kiedy osoba coś posiadała). Wskazówka Standardowe liczby całkowite mogą nie być najlepszym sposobem reprezentowania chwil. Być może trzeba będzie w tym celu zaprojektować własną strukturę danych. Zadanie 5 (3 pkt) Narysujmy na płaszczyźnie krzywą zamkniętą, przyjmijmy na niej punkt i ustalmy zwrot (jak na rysunku 1). Obchodząc krzywą zgodnie z przyjętym zwrotem, numerujmy kolejno odwiedzane przecięcia (gdy odwiedzamy je po raz pierwszy). W przykładzie z rysunku 1, krzywa przecina się w dziewięciu punktach a kolejność odwiedzania tych punktów jest następująca: 1, 2, 3, 4, 5, 3, 6, 7, 8, 1, 9, 5, 4, 6, 7, 9, 2, 8. Zauważ, że jeśli n jest liczbą przecięć, to ciąg taki ma 2 n elementów, przy czym każda liczba od 1 do n pojawia się w nim dokładnie dwa razy. 5

Rysunek 1: Krzywa zamknięta z ustalonym zwrotem Ciekawszą własnością takiego ciągu jest to, że między dwoma dowolnymi wystąpieniami tej samej liczby, zawsze znajduje się parzysta liczba elementów. W powyższym przykładzie, między pierwszym a drugim wystąpieniem liczby 4 znajduje się osiem innych liczb 5, 3, 6, 7, 8, 1, 9, 5. Napisz predykat lista(n, X), który jest spełniony, jeśli dla danego N, lista X: ma długość 2*N, każda liczba od 1 do N występuję na niej dokładnie dwa razy, między dwoma kolejnymi wystąpieniami tej samej liczby jest parzysta liczba innych liczb. Można wykazać, że jest N! różnych list X spełniających warunek lista(n, X). Przykład?- lista(3, X). X = [1, 1, 2, 2, 3, 3] ; X = [1, 1, 2, 3, 3, 2] ; X = [1, 2, 2, 1, 3, 3] ; X = [1, 2, 2, 3, 3, 1] ; X = [1, 2, 3, 3, 2, 1] ; X = [1, 2, 3, 1, 2, 3] ; Uwaga 0 Zwróć uwagę, że w powyższych odpowiedziach, jeśli na liście X pojawia się po raz pierwszy liczba k {1, 2,..., n}, to na wcześniejszych pozycjach listy X 6

Tabela 1: Średnia liczba kroków wnioskowania na znalezienie kolejnej listy spełniającej warunek lista/2 N N! inf avg 1 1 14 14.00 2 2 29 14.50 3 6 77 12.83 4 24 281 11.71 5 120 1356 11.30 6 720 8071 11.21 7 5040 56519 11.21 8 40320 453167 11.24 9 362880 4088366 11.27 10 3628800 40974845 11.29 11 39916800 451618977 11.31 12 479001600 5428949737 11.33 pojawiły się już wszystkie liczby 1, 2,..., k 1 (jeden lub dwa razy). Odpowiada to numerowaniu kolejnych nieodwiedzonych wcześniej przecięć kolejnymi numerami 1, 2,..., n (pierwsze pojawienia się liczb tworzą ciąg kolejnych liczb 1, 2,..., n). Jeśli odpowiedzi z Twojego predykatu nie spełniają tego warunku, to zadanie może zostać uznane za rozwiązane ale otrzymasz dużo więcej rozwiązań niż N! i być może nie doczekasz się na przejrzenie wszystkich odpowiedzi, już dla stosunkowo małych wartości N. Uwaga 1 Nie każdej liście X spełniającej warunek lista(n, X), odpowiada jakaś krzywa zamknięta o takich przecięciach. Dla przykładu, liście [1, 2, 3, 4, 5, 1, 4, 5, 2, 3] nie odpowiada żadna krzywa zamknięta o pięciu przecięciach. Uwaga 2 Pomyśl o jak najefektywniejszym znajdowaniu list spełniających warunek lista/2. W tabeli 1 podano dla kolejnych N = 1..12, liczbę kroków wnioskowania, uzyskaną w odpowiedzi na cel time((lista(n, _), fail)), i średnią liczbę kroków na jedno z N! rozwiązań. Jak widać średnia liczba kroków wnioskowania na wygenerowanie kolejnego rozwiązania (dla N > 3) jest poniżej 12. Przygotuj taką tabelkę dla Twojej implementacji predykatu lista/2. Jaką uzyskałeś średnią liczbę kroków wnioskowania na jedno rozwiązanie? 7