Programowanie w logice Wykład z baz danych dla



Podobne dokumenty
Programowanie deklaratywne

Programowanie w logice

Paradygmaty programowania

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

Programowanie deklaratywne

Składnia rachunku predykatów pierwszego rzędu

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

PODSTAWY SZTUCZNEJ INTELIGENCJI

Dedukcyjne bazy danych i rekursja

Dedukcyjne bazy danych i rekursja

Dedukcyjne bazy danych

Programowanie w logice

Projekt 4: Programowanie w logice

Wprowadzenie do Prologa

Języki programowania deklaratywnego

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

Adam Meissner SZTUCZNA INTELIGENCJA Problem spełnialności (SAT)

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykład 9. Koniunkcyjne postacie normalne i rezolucja w KRZ

Programowanie deklaratywne

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

Adam Meissner.

Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań.

Programowanie w Logice

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Laboratorium przedmiotu Paradygmaty Programowania

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Metoda Tablic Semantycznych

Podstawy programowania w Pythonie

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

Definicje. Algorytm to:

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Semantyka rachunku predykatów

Elementy logiki matematycznej

Programowanie logiczne a negacja

Języki programowania zasady ich tworzenia

Tautologia (wyrażenie uniwersalnie prawdziwe - prawo logiczne)

Języki programowania deklaratywnego

METODY DOWODZENIA TWIERDZEŃ I AUTOMATYZACJA ROZUMOWAŃ

III rok kognitywistyki UAM,

Prolog 2 (Filip Wroński, Łukasz Betkowski, Paweł Świerblewski, Konrad Kosmatka)

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

Programowanie deklaratywne i logika obliczeniowa

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Programowanie funkcyjne Wykład 13. Siła wyrazu rachunku lambda

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

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Elementy Teorii Obliczeń

Technologie baz danych

Uzgadnianie formuł rachunku predykatów

1 Wprowadzenie do algorytmiki

Reprezentacja wiedzy i wnioskowanie

Programowanie w logice

Wykład 8. Rekurencja. Iterować jest rzeczą ludzką, wykonywać rekursywnie boską. L. Peter Deutsch

Zastosowanie logiki matematycznej w procesie weryfikacji wymagań oprogramowania

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

Programowanie w języku C++ Grażyna Koba

STUDIUM PODYPLOMOWE INFORMATYKI SPI 51

Poprawność algorytmów

Rekurencyjna przeliczalność

Struktury formalne, czyli elementy Teorii Modeli

Elementy logiki. Algebra Boole a. Analiza i synteza układów logicznych

Logika stosowana. Ćwiczenia Programowanie w logice i PROLOG. Marcin Szczuka. Instytut Informatyki, Uniwersytet Warszawski

Podstawy Sztucznej Inteligencji (PSZT)

Programowanie w logice Prolog 2

Wykład 1. Informatyka Stosowana. 3 października Informatyka Stosowana Wykład 1 3 października / 26

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Reguły gry zaliczenie przedmiotu wymaga zdania dwóch testów, z logiki (za ok. 5 tygodni) i z filozofii (w sesji); warunkiem koniecznym podejścia do

Rachunek predykatów. Formuły rachunku predykatów. Plan wykładu. Relacje i predykaty - przykłady. Relacje i predykaty

Adam Meissner STUCZNA INTELIGENCJA

KONKURS MATEMATYCZNY KOMA 2018

Wykład 6. Reguły inferencyjne systemu aksjomatycznego Klasycznego Rachunku Zdań

Języki i metody programowania

4. Funkcje. Przykłady

Systemy ekspertowe. Wnioskowanie w systemach regułowych. Część piąta. Autor Roman Simiński.

JAVAScript w dokumentach HTML (1)

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Internet Semantyczny i Logika I

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

R. D. Tennent, The Denotational Semantics of Programming Languages [1976]

Podstawy języka PROLOG

Algorytmy zapisywane w pseudojęzyku programowania. Klasa 2 Lekcja 6

Dariusz Banasiak. Instytut Informatyki, Automatyki i Robotyki. Politechniki Wrocławskiej

Bazy danych Algebra relacji Wykład dla studentów matematyki

Zadanie 1. Suma silni (11 pkt)

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

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

Dana jest baza: kobieta(katarzyna). kobieta(anna). kobieta(maria). kobieta(marianna). kobieta(marta). Zdefiniujemy predykat kobiety/0 następująco:

Obliczenia inspirowane Naturą

Instalacja Pakietu R

Matematyczne Podstawy Informatyki

Rekurencja (rekursja)

Transkrypt:

Programowanie w logice Wykład z baz danych dla studentów matematyki 18 maja 2015

Programowanie w logice Programowanie w logice to podejście do programowania, w którym na program patrzymy nie jak na opis krok po kroku pewnego sekwencyjnego algorytmu, lecz jak na teorię logiczna. Przy tym podejściu koncentrujemy się na deklaratywnej specyfikacji co jest problemem do rozwiazania, a nie na proceduralnej specyfikacji jak ma on być rozwiazany. Takie języki programowania oparte sa na rachunku predykatów pierwszego rzędu, więc bliskie sa koncepcjom relacyjnych baz danych. Przy tym podejściu wywołanie procedury to twierdzenie do udowodnienia, przekazywane do interprtera jako zapytanie. Wykonanie programu odpowiada poszukiwaniu dowodu. W konsekwencji zmienne w programowaniu w logice maja bardziej matematyczny charakter można na nie przypisać wartość tylko raz.

Prolog Prolog jest najpopularniejszym językiem do programowania w logice. Oczywiście nie jest możliwe nauczenie programowania w Prologu w trakcie pojedynczego wykładu (ani nawet pełne opisanie go). Pobieżna znajomość pojęć programowania w logice pozwoli nam jednak lepiej zrozumieć źródła dedukcyjnych baz danych, którymi zajmiemy się na następnym wykładzie. Będziemy zatem poznawać Prolog głównie przez przykłady programów.

Warszawskie metro Warszawskie metro ma (na razie) tylko półtorej linii, ale w zupełności wystarczy to na pierwszy przykład użycia Prologu. Rozpoczniemy od zapisania faktów: informacji o kolejności stacji na linii connected(bielany,słodowiec). connected(słodowiec,marymont). connected(marymont,placwilsona). connected(placwilsona,dworzecgdański)....

Składnia Prolog używa dla literałów składni z rachunku predykatów predykat(term,...term) Nazwy zmiennych (identyfikatory) musza rozpoczynać się wielka litera lub znakiem podkreślenia ( _ ).

Zapytania Prologu można używać jak prostej bazy danych. Najpierw dowiemy się od interpretera, czy Marymont i Plac Wilsona sa ze soba połaczone.?- connected(marymont,placwilsona). yes Następnie zapytamy o stacje połaczone z Marymontem?- connected(marymont,x). X = placwilsona yes W zapytaniu użyliśmy zmiennej X. Interpreter zwrócił wartość zwiazan a ze zmienna X jako jedyna odpowiedź.

Zapytania Spytajmy teraz o wszystkie połaczenia?- connected(start,end). Start = bielany End = słodowiec? ; Start = słodowiec End = marymont? a Start = marymont End = placwilsona Start = placwilsona End = dworzecgdański no

Reguły Zdefiniujemy dwie stacje jako położone blisko jeśli sa one połaczone bezpośrednio lub pomiędzy nimi jest tylko jedna stacja. W rachunku predykatów wyglada to tak x y.connected(x, y) = blisko(x, y) x y. z.connected(x, z) connected(z, y)) = blisko(x, y) Możemy teraz zapisać te formuły jako reguły Prologu blisko(x,y) :- connected(x,y). blisko(x,y) :- connected(x,z),connected(z,y).

Reguły Najpierw łatwe zapytanie?- blisko(bielany,marymont). yes Teraz oczekujemy kilku odpowiedzi?- blisko(bielany,what). What = słodowiec? ; What = marymont yes

Definiowanie silni Wprowadzenie do języka programowania nie liczy się, jeśli nie obejmuje silni (albo największego wspólnego dzielnika). Pora więc na nia Najpierw definicja funkcyjna 0! = 1 n! = n (n 1)! dla n > 0. która przekształcimy na relację factorial factorial(0, 1) ( n)( f )n > 0 factorial(n 1, f ) = factorial(n, n f )

Definiowanie silni Pora na Prolog factorial(0,1). factorial(n,f) :- N > 0, N1 is N - 1, factorial(n1,f1), F is N * F1. Nieco testów?- factorial(0,1). true? (1 ms) yes?- factorial(3,x). X = 6? (1 ms) yes

Wyrażenia w Prologu Nasz program składa się z dwóch klauzul. Pierwsza z nich to klauzula unarna: tylko nagłówek, bez treści. Jest to skrót następujacego zapisu: factorial(0,1) :- true. Klauzule unarne bez zmiennych służa do zapisywania pojedynczych faktów. Druga klauzula to reguła, ponieważ posiada niepusta treść. Treść to wszystkie literały następujace po :- (możemy go czytać jeśli ). Literały w treści oddzielamy przecinkami, przecinek pełni rolę operatora koniunkcji. Argumenty literałów nazyweamy termami. Jeśli identyfikator zawarty w termie rozpoczyna się wielka litera, to jest to zmienna, w przeciwnym razie jest to stała.

Wyrażenia w Prologu Klauzule maja intepretację deklaratywna Klauzula pierwsza mówi: silnia 0 wynosi 1. Klauzula druga mówi: silnia N wynosi F jeśli N > 0 oraz jeśli N1 oznacza N 1, to silnia N1 wynosi F1 i F = N F1.

Zapytania Chcac obliczyć silnię od 3 musimy podać w zapytaniu zmienna, na której ma znaleźć się wynik niech to będzie W:?- factorial(3,w). W=6

Graf obliczeń

Zapytania W zapytaniu nie musza wystapić zmienne:?- factorial(3,6). yes?- factorial(5,2). no

Inna definicja silni silnia(n,f) :- silnia1(n,1,f). silnia1(0,f,f). silnia1(n,a,f) :- N > 0, A1 is N * A, N1 is N - 1, silnia1(n1,a1,f).

Inna definicja silni Wprowadziliśmy dodatkowy parametr pełniacy rolę akumulatora. Dzięki temu nasza definicja ma postać iteracyjna, ponieważ wywołanie rekurencyjne jest redukcyjne. Ale nic za darmo: płacimy za to zmniejszona czytelnościa.

Kolorowanie map Zasada: Żadne dwa sasiaduj ace regiony nie moga mieć tego samego koloru.

Mapa

Sasiedztwo Informacje o sasiedztwie można w Prologu zapisać następujaco: adjacent(1,2). adjacent(1,3). adjacent(1,4). adjacent(1,5). adjacent(2,3). adjacent(2,4). adjacent(3,4). adjacent(4,5). adjacent(2,1). adjacent(3,1). adjacent(4,1). adjacent(5,1). adjacent(3,2). adjacent(4,2). adjacent(4,3). adjacent(5,4).

Sasiedztwo Po załadowaniu faktów do interpretera można badać sasiedztwo regionów:?- adjacent(2,3). yes?- adjacent(5,3). no?- adjacent(3,r). R = 1 ; R = 2 ; R = 4 ; no

Kolorowania Kolorowania także możemy opisać klauzulami unarnymi. color(1,red,a). color(2,blue,a). color(3,green,a). color(4,yellow,a). color(5,blue,a). color(1,red,b). color(2,blue,b). color(3,green,b). color(4,blue,b). color(5,green,b). Kolorowania oznaczyliśmy symbolami a i b.

Kolorowania

Konflikty Błędne kolorowanie musi zawierać konflikt dwa sasiednie regiony pokolorowane tym samym kolorem: conflict(coloring) :- adjacent(x,y), color(x,color,coloring), color(y,color,coloring).

Konflikty Teraz możemy zbadać nasze kolorowania:?- conflict(a). no?- conflict(b). yes?- conflict(which). Which = b

Konflikty (3) Konfliktowość mozna też zdefiniować inaczej: conflict(r1,r2,coloring) :- adjacent(r1,r2), color(r1,color,coloring), color(r2,color,coloring).

Polimorfizm Prolog dopuszcza równoczesne definiowanie predykatów o tej samej nazwie i różnej liczbie parametrów, wewnętrznie nazywajac je conflict/1 i conflict/3.

Więcej o konfliktach Możemy poznać konfliktowe regiony, a nawet ich (wspólny) kolor?- conflict(r1,r2,b). R1 = 2 R2 = 4?- conflict(r1,r2,b),color(r1,c,b). R1 = 2 R2 = 4 C = blue

Rozpoznawanie zwierzat Spróbujmy na koniec napisać program rozpoznajacy gatunki zwierzat podstawie zaobserwowanych faktów oraz wiedzy zawartej w faktach i regułach. zoolog :- hypothesize(zwierzak), write( Przypuszczam, że ten zwierzak to: ), write(zwierzak), nl, undo.

Hipotezy hypothesize(gepard) :- gepard,!. hypothesize(tygrys) :- tygrys,!. hypothesize(żyrafa) :- żyrafa,!. hypothesize(zebra) :- zebra,!. hypothesize(struś) :- struś,!. hypothesize(pingwin) :- pingwin,!. hypothesize(albatros) :- albatros,!. hypothesize(nie_wiem). /* nie udało się */

Reguły identyfikacji gepard :- ssak, drapieżnik, verify(ma_płowy_kolor), verify(ma_ciemne_plamy). tygrys :- ssak, drapieżnik, verify(ma_płowy_kolor), verify(ma_czarne_paski). żyrafa :- kopytny, verify(ma_długą_szyję), verify(ma_długie_nogi). zebra :- kopytny, verify(ma_czarne_paski).

Reguły identyfikacji struś :- ptak, verify(nie_lata), verify(ma_długą_szyję). pingwin :- ptak, verify(nie_lata), verify(pływa), verify(jest_czarnobiały). albatros :- ptak, verify(występuje_w_opowieściach_morskich), verify(dobrze_lata).

Reguły klasyfikacji ssak :- verify(ma_sierść),!. ssak :- verify(daje_mleko). ptak :- verify(ma_pióra),!. ptak :- verify(lata), verify(znosi_jajka). drapieżnik :- verify(je_mięso),!. drapieżnik :- verify(ma_ostre_zęby), verify(ma_pazury), verify(ma_oczy_z_przodu). kopytny :- ssak, verify(ma_kopyta),!. kopytny :- ssak, verify(przeżuwacz).

Zadawanie pytań ask(pytanie) :- write( Czy zwierzak ma następującą cechę: ), write(pytanie), write(? ), read(odpowiedz), nl, ( (Odpowiedz == tak ; Odpowiedz == t) -> assert(tak(pytanie)) ; assert(nie(pytanie)), fail).

Weryfikacja verify(s) :- tak(s), true,!. verify(s) :- nie(s), fail,!. verify(s) :- ask(s).

Zapamiętywanie odpowiedzi Aby uniknać wielokrotonego zadawania tych samych pytań: Po otrzymaniu odpowiedzi tak na pytanie P zapisujemy tę informację jako fakt tak(p). Podobnie po otrzymaniu odpowiedzi nie na pytanie P zapisujemy tę informację jako fakt nie(p).

Czyszczenie faktów tak/nie Po zakończeniu konwersacji trochę ekologii trzeba po sobie posprzatać undo :- retract(tak(_)),fail. undo :- retract(nie(_)),fail. undo.