Programowanie w logice Prolog 1

Podobne dokumenty
Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi.

Programowanie w logice Prolog 2

Programowanie w logice

Programowanie w Logice

PODSTAWY SZTUCZNEJ INTELIGENCJI

Wprowadzenie do Prologa

Programowanie deklaratywne

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

Internet Semantyczny i Logika I

Programowanie deklaratywne

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

Projekt 4: Programowanie w logice

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

Programowanie deklaratywne

Programowanie w logice

Programowanie deklaratywne

Programowanie deklaratywne

Laboratorium przedmiotu Paradygmaty Programowania

Programowanie w logice Prolog 3

Programowanie w Logice Struktury danych (Lista 2)

Prezentacja do pobranie:

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

PROLOG INNE PRZYKŁADY MACIEJ KELM

Programowanie w Logice

Podstawy języka PROLOG

Języki programowania deklaratywnego

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

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

LOGIKA I TEORIA ZBIORÓW

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

Prolog przetwarzanie list. Maciej Krzywonos Łukasz Dajcz

Języki programowania deklaratywnego

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

Programowanie w logice Wykład z baz danych dla

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

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

RBD Relacyjne Bazy Danych

Technologie i systemy oparte na logice rozmytej

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

Paradygmaty programowania

Semantyka rachunku predykatów

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Przestrzenne bazy danych Podstawy języka SQL

Luty 2001 Algorytmy (7) 2000/2001

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wykład 2. Informatyka Stosowana. 8 października 2018, M. A-B. Informatyka Stosowana Wykład 2 8 października 2018, M. A-B 1 / 41

Definicje. Algorytm to:

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

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

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

LXI Olimpiada Matematyczna

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

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

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

FUNKCJE. (odwzorowania) Funkcje 1

Elementy logiki matematycznej

WYRAŻENIA ALGEBRAICZNE

Metoda Tablic Semantycznych

Algorytmy i struktury danych. Wykład 4

5. Algebra działania, grupy, grupy permutacji, pierścienie, ciała, pierścień wielomianów.

Przykładowe zadania z teorii liczb

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

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

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

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

Podstawy Sztucznej Inteligencji (PSZT)

Zbiory. Specjalnym zbiorem jest zbiór pusty nie zawierajacy żadnych elementów. Oznaczamy go symbolem.

Prolog. Programowanie

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

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

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

Języki programowania Prolog

Adam Meissner.

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

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

Definicje wyższego poziomu

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

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

Prolog struktury danych oraz obliczenia. 1. Arytmetyka?- Y is 2+2. Y = 4. ?- 5 is 3+3. false. ?- Z is (3.9 / 2.1). Z =

Elementy logiki i teorii mnogości

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

1 Działania na zbiorach

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

FUNKCJA LINIOWA - WYKRES

Poprawność semantyczna

Uwagi wprowadzajace do reguł wnioskowania w systemie tabel analitycznych logiki pierwszego rzędu

Wykład 0 Informacje Podstawowe

Obóz Naukowy Olimpiady Matematycznej Gimnazjalistów

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

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

Programowanie w logice

12.Rozwiązywanie równań i nierówności liniowych oraz ich układów.

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

MATLAB tworzenie własnych funkcji

Algorytmika i Programowanie VBA 1 - podstawy

W. Guzicki Zadanie 41 z Informatora Maturalnego poziom podstawowy 1

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Internet Semantyczny. Logika opisowa

Transkrypt:

Programowanie w logice Prolog 1

Prolog - zastosowania Zastosowania: relacyjne bazy danych. przetwarzanie języka naturalnego. logistyka. analiza struktur biochemicznych. wspomaganie projektowania. sztuczna inteligencja.

Co to jest Prolog? Prolog to język programowania. Pisanie programu w Prologu nie polega na opisywaniu algorytmu. Prolog jest językiem opisowym i deklaratywnym. Prolog służy do rozwiązywania problemów dotyczących obiektów i relacji między nimi. Chcąc rozwiązać problem opisujemy fakty i relacje dotyczące problemu.

Obiekty i relacje Rozważmy stwierdzenie: Paweł ma laptopa. Miedzy dwoma obiektami (Paweł, laptop) istnieje relacja posiadania (ma). Jest to relacja uporządkowana: Paweł ma laptopa a nie odwrotnie. Jeżeli chcemy dowiedzieć się czegoś o relacji możemy zadać pytanie: Czy Paweł ma laptopa?

Obiekty i relacje Rozwiązanie problemu polega właśnie na zadawaniu takich pytań. Odpowiedzi na pytania dostarczają nam informacji o obiektach i relacjach, które można wywnioskować z naszego programu. Załóżmy, że mając dane stwierdzenie z poprzedniego slajdu zadajemy pytanie: Jaka będzie odpowiedź? Czy Paweł ma komputer?

Obiekty i relacje Jeżeli przyjmiemy, że: Każdy laptop jest komputerem. wówczas odpowiedź jest oczywista (i wywnioskowana z dwóch stwierdzeń!). Powyższe stwierdzenie jest pewną regułą. Zauważmy, że reguła nie dotyczy konkretnego laptopa czy komputera.

Obiekty, relacje i język Aby móc opisywać relacje między obiektami musimy zatem dysponować pewnym językiem. Język ten musi umożliwiać wnioskowanie, a zatem musi być oparty na logice.

Elementy składowe języka Co to jest język? Z jakich elementów się składa? składnia (syntax) musimy mieć do dyspozycji symbole oraz sposoby łączenia symboli. Musimy określić jakie ciągi symboli są zdaniami naszego języka. Na przykład w języku polskim zdanie: Tomek poszedł do sklepu jest zdaniem poprawnie zbudowanym, w przeciwieństwie do zdania: Sklepu Tomek do poszedł

Elementy składowe języka (cd) z jakich jeszcze elementów składa się język? semantyka musimy określić jakie jest znaczenie poprawnie zbudowanych wyrażeń języka (nośnikami jakiej informacji są te wyrażenia). Na przykład w języku polskim wyrażenie: Zamyślony liść jest poprawnie zbudowane. A co ze znaczeniem?

Logika pierwszego rzędu (FOL)

FOL konsekwencja logiczna Przykład Rozważmy teraz następujące zdanie: "x x + 1 < x Czy formuła ta jest prawdziwa? Jeżeli rozważmy najbardziej oczywistą intepretację wówczas odpowiedź jest negatywna suma dowolnej liczby x i 1 nie jest mniejsza od x! Załóżmy, że predykat < interpretujemy jako różny od. Wówczas powyższa formuła jest prawdziwa w zbiorze liczb rzeczywistych. Oczywiście formuła powyższa nie jest tautologią!

FOL konsekwencja logiczna Przykład Tautologią nie jest także zdanie: 2 + 3 = 5 W jakiej interpretacji zdanie to nie jest prawdziwe? Przyjmijmy, że D=R oraz + interpretujemy jako mnożenie. Predykat = interpretujemy jako równość oraz stałe 2, 3 i 5 jako odpowiednie liczby. Oczywiście formuła powyższa nie jest spełniona w powyższej interpretacji!

FOL konsekwencja logiczna Przykład Rozważmy następujące zdania: oraz następującą interpretację: D - zbiór wierzchołków pewnego grafu G Predykat R interpretujemy jako relację reprezentującą połączenie miedzy wierzchołkami np. R(a,b).

FOL konsekwencja logiczna Przykład Zdania: są spełnione przez następujące grafy:

FOL konsekwencja logiczna Przykład Grafy powyższe spełniają także: Ale nie każdy graf spełnia to zdanie:

FOL konsekwencja logiczna Przykład Rozważmy teraz następujące zdania: Interpretacja predykatów: F kobieta, P rodzic, B urodzony dnia Zdanie powyższe są prawdziwe dla zbioru D zawierającego wszystkie elementy z bazy danych:

FOL konsekwencja logiczna Przykład

FOL konsekwencja logiczna Przykład Wykorzystująć predykaty F, P i B możemy zdefiniować inne predykaty np.: G(x,y) = z(p(x, z) P(z, y)) M(x) = F(x) SB(x,y) = z(b(x, z) B(y, z)) Taką możliwość będziemy wykorzystywali w Prologu.

FOL konsekwencja logiczna Przykład Chcemy odpowiedzieć na pytanie: Czy na niezielonym bloku leży blok zielony?

Prolog Programowanie w Prologu składa się z: Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi. Zadawania zapytań o obiekty i związki między nimi.

Fakty Fakty opisują obiekty i relacje między nimi. W Prologu fakty zapisujemy następująco: Przykłady: predykat(argumenty). mezczyzna(tomek). kobieta(ala). lubi(tomek,ala). wiek(tomek,30). rodzic(maria,renata,tomek).

Fakty Nazwy: tomek, ala, alicja, renata dotyczące konkretnych obiektów pisane są z małej litery. Każdy obiekt musi posiadać interpretację. Nazwy relacji i obiektów są całkowicie dowolne*. Poprzedni przykład, ale inaczej zapisany: a(b). c(d). e(b,d). f(b,21). g(h,i,b). interpretacja a mężczyzna b Tomek... Zbiór faktów nazywamy bazą danych.

Zapytania Dysponując bazą danych możemy zadawać dotyczące jej zapytania. W Prologu fakty zapisujemy następująco: Przykłady:?-predykat(argumenty).?-mezczyzna(tomek).?-mezczyzna(ala).?-lubi(tomek,ala).?-wiek(tomek,30).?-rodzic(maria,ala,tomek).

Zapytania Jeżeli zadajemy zapytanie Prolog przeszukuje bazę danych i szuka faktów pasujących do faktu podanego w zapytaniu. Dwa fakty pasują do siebie jeżeli mają te same predykaty (tak samo pisane) i te same argumenty. Jeżeli poszukiwanie zakończy się sukcesem Prolog odpowiada YES (TRUE), w przeciwnym razie NO (FALSE).

Zapytania Przykład Rozważmy bazę danych: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka)...i zapytania:?- lubi(tomek,ryby). true.?- lubi(tomek,frytki). false.?- lubi(ala,ksiazka). true.

Zapytania Przykład Rozważmy bazę danych:..i zapytania: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(ala,ksiazka). true.?- lubi(ala,rower). false.?- kobieta(ala). ERROR: toplevel: Undefined procedure: kobieta/1 (DWIM could not correct goal)

Zapytania W przypadku gdy zadamy zapytanie o relację (predykat), której nie ma w bazie danych zachowanie zależy od systemu. W powyższym przykładzie system zwrócił informację o błędzie. W przypadku gdy zadamy zapytanie o obiekt, którego nie ma w bazie danych Prolog zwraca odpowiedź NO (FALSE).

Zmienne Potrafimy już tworzyć zapytania dotyczące konkretnych obiektów. Możemy np. zapytać:?- lubi(tomek,ryby). Czy możemy jedna zapytać nie o to czy Tomek lubi konkretną rzecz, ale o to co lubi w ogóle?. Zapytania takie możemy formułować wykorzystując zmienne. Zmienne pisane są z dużej litery. Zmienna może być ukonkretniona lub nieukonkretniona.

Zmienne Przykład Rozważmy zapytanie: gdzie X jest zmienną.?- lubi(tomek,x). Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpić zmienną. A zatem wyszukiwane są wszystkie obiekty, które lubi Tomek.

Zmienne Przykład Rozważmy zapytanie: gdzie Kto jest zmienną.?- lubi(kto,ksiazka). Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpić zmienną. A zatem wyszukiwane są wszystkie obiekty, które lubią książkę.

Zmienne Przykład Rozważmy ponownie bazę danych: i zapytanie: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(tomek,x).

Zmienne Przykład Początkowo zmienna X nie jest ukonkretniona. Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpić zmienną. Precyzyjniej Prolog wyszukuje dowolne fakty z predykatem lubi i pierwszym argumentem tomek, drugi argument może być dowolny. Kiedy fakt taki zostaje znaleziony wówczas X staje się zmienną ukonkretnioną i przyjmuje wartość drugiego argumentu ze znalezionego faktu.

Zmienne Przykład Dla bazy danych: Prolog zwraca: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(tomek,x). X = ryby Prolog przeszukuje bazę danych w takiej kolejności jak ją wpisano.

Zmienne Przykład Kiedy Prolog znajduje fakt pasujący do zapytania oznacza to miejsce w bazie danych i czeka na dalsze polecenia. Wciśnięcie klawisza Enter powoduje zakończenie wyszukiwania. Wciśnięcie klawisza ; (spacji) powoduje dalsze przeszukiwanie bazy danych od miejsca oznaczonego wcześniej.

Zmienne Przykład Dla bazy danych: Prolog zwraca: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(tomek,x). X = ryby ; X = ala ; X = ksiazka. Wciskamy klawisz ; Prolog przeszukuje bazę danych w takiej kolejności jak ją wpisano.

Zmienne Przykład Rozważmy ponownie bazę danych: i zapytanie: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(kto,ksiazka).

Zmienne Przykład Prolog zwraca: Prolog zwraca: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(kto,ksiazka). Kto = ala.?- lubi(kto,ksiazka). Kto = ala ; Kto = tomek. Wciskamy klawisz Enter Wciskamy klawisz ;

Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla tej samej bazy danych rozważmy zapytanie z dwiema zmiennymi (Kto i Co): Wynik:?- lubi(kto,co).?- lubi(kto,co). Kto = tomek, Co = ryby ; Kto = tomek, Co = ala ; Kto = ala, Co = ksiazka ; Kto = tomek, Co = ksiazka. Wciskamy klawisz ;

Koniunkcje Wiemy już jak budować proste zapytania. Zapytania możemy łączyć i uzyskiwać w ten sposób zapytania bardziej złożone. Możemy zapytać np. o rzeczy, które są lubiane i przez Tomka i przez Alę. Wykorzystujemy w tym celu koniunkcję zapytań oznaczaną przecinkiem. Problem składa się wówczas z dwóch odrębnych celów.

Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla powyższej bazy danych rozważmy zapytanie:?- lubi(tomek,ala),lubi(ala,tomek). Wynik: koniunkcja?- lubi(tomek,ala),lubi(ala,tomek). false. Aby spełniona była koniunkcja muszą być spełnione oba cele (wszystkie cele składowe). W przypadku rozważanej bazy danych cel pierwszy jest prawdziwy, cel drugi nie.

Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla powyższej bazy danych rozważmy zapytanie z jedną zmienną:?- lubi(tomek,co),lubi(ala,co). Prolog najpierw próbuje spełnić pierwszy cel zapytania. Jeżeli odpowiedni fakt zostanie znaleziony w bazie danych wówczas to miejsce w bazie zostanie oznaczone (znacznik 1) i Prolog próbuje spełnić drugi cel. Jeżeli to się uda wówczas drugie miejsce w bazie zostaje oznaczone (znacznik 2) i Prolog zwraca rozwiązanie.

Zmienne Przykład a zatem dla zapytania: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). otrzymujemy:?- lubi(tomek,co),lubi(ala,co).?- lubi(tomek,co),lubi(ala,co). Co = ksiazka. Jeżeli drugi cel nie zostanie spełniony wówczas Prolog stara się inaczej spełnić cel poprzedni. Prolog zaczyna ponownie przeszukiwać bazę danych od znacznika 1, a nie od początku (mechanizm nawracania).

Mechanizm nawracania Rozważmy zapytanie:?- lubi(tomek,x),lubi(ala,x). Kolejne etapy znajdowania rozwiązania: 1. Uzgodniony jest cel pierwszy zmienna X przyjmuje wartość ryby.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala).

Mechanizm nawracania 2. Następuje próba uzgodnienia drugiego celu. 3. Drugi cel zawodzi.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 3. Następuje nawrót poprzednia wartość zmiennej X jest odrzucona. Próbujemy ponownie uzgodnić pierwszy cel.

Mechanizm nawracania 4. Ponownie uzgodniony jest cel pierwszy zmienna X przyjmuje wartość ksiazka.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 5. Ponownie następuje próba uzgodnienia drugiego celu.

Mechanizm nawracania 6. Drugi cel jest uzgodniony.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 7. Prolog informuje o udanym uzgodnieniu koniunkcji i czeka na odpowiedź.

Reguły W Prologu reguły pozwalają nam zapisać, że jakiś fakt zależy od grupy innych faktów. Reguły odpowiadają w języku naturalnym sformułowaniom zawierającym słówko jeżeli np.: Używam parasola, jeżeli pada. Iza jeździ autobusem miejskim, jeżeli jest zima. Patryk chodzi do kina, jeżeli nie ma tłoku. Marek kupuje wino, jeżeli jest tańsze od piwa.

Reguły Reguły mogą być wykorzystywane do zapisywania definicji np. Inny przykład: X jest ptakiem jeżeli: X jest zwierzęciem i X ma pióra X jest ojcem Y jeżeli: X jest mężczyzną i X jest rodzicem Y

Reguły W prologu każda reguła składa się z głowy i treści. fakt1 :- fakt2,fakt3,,fakt n. głowa Przykład treść Treść zawiera koniunkcję celów, które muszą być spełnione, aby głowa była prawdziwa. lubi(ala,x):-lubi(x,ksiazka). lubi(tomek,x):-kobieta(x),lubi(x,ksiazka). siostra(x,y):-kobieta(x),rodzice(x,a,b), rodzice(y,a,b).

Reguły Jeżeli z regule występuje zmienna wówczas jeżeli jest ona ukonkretniona jakimś obiektem to jest ukonkretniona w całym swoim zakresie obowiązywania czyli od głowy do kropki na końcu reguły. Na przykład jeżeli w przypadku reguły: lubi(tomek,x):-kobieta(x),lubi(x,ksiazka). zmienna X będzie ukonkretniona przez Ala wówczas Prolog będzie starał się uzgodnić cele: kobieta(ala),lubi(ala,ksiazka).

Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). lubi(ala,x):-lubi(x,ksiazka). Zapytanie:?- lubi(tomek,x). Wynik:?- lubi(tomek,x). X = ryby ; X = ala ; X = ksiazka.

Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). lubi(ala,x):-lubi(x,ksiazka). Zapytanie:?- lubi(ala,x). Wynik:?- lubi(ala,x). X = ksiazka ; X = ala ; X = tomek ; false.

Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,x):-lubi(x,ksiazka). lubi(ala,ksiazka). lubi(tomek,ksiazka). Zapytanie:?- lubi(ala,x). Wynik:?- lubi(ala,x). X = ala ; X = tomek ; X = ksiazka.

Reguły Przykład Rozpatrzmy bazę danych: mezczyzna(tomek). mezczyzna(pawel). kobieta(alicja). kobieta(renata). rodzice(renata,alicja,pawel). rodzice(tomek,alicja,pawel). siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b).

Reguły Przykład Interesuje nas zapytanie: siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b).?- siostra(renata,tomek). Prolog przetwarza je następująco: 1. Zapytanie jest dopasowane do głowy reguły siostra czyli X=renata i Y=tomek (ukonkretnienie). Znacznik odpowiadający zapytaniu ustawiony jest na regule. Prolog próbuje spełnić kolejno trzy cele z treści reguły.

Reguły Przykład siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b). 2. Celem jest kobieta(renata). Cel nie zawodzi jeżeli istnieje odpowiedni fakt w bazie danych. W tej sytuacji Prolog oznacza odpowiednie miejsce w bazie i przechodzi do uzgadniania następnych celów. 3. Prolog szuka faktu rodzic(renata,a,b). Znaleziony zostaje fakt rodzice(renata,alicja,pawel).

Reguły Przykład siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b). Zmienne A i B zostają ukonkretnione: A=alicja, B=pawel. Prolog oznacza w bazie następującą pozycję i przechodzi do uzgadniania następnego celu. 4. Prolog szuka faktu rodzic(tomek,alicja,pawel). i znajduje odpowiedni fakt w bazie. Cel udało się uzgodnić. Prolog odpowiada YES (TRUE).?- siostra(renata,tomek). true.

Elementy składowe programu Elementy składniowe programu: stałe nazywające konkretne obiekty i relacje. Stałe dzielą się na dwie grupy: atomy i liczby. Atomy zaczynają się małą literą. Jeżeli musimy użyć wielkiej litery zapisujemy nazwę w apostrofach. Przykłady atomów: Przykłady liczb: mama, brat, adam,?-, :-, Dom 10, 9.99, 6.01e-27, 13456

Elementy składowe programu Elementy składniowe programu (cd): zmienne Nazwy stałych rozpoczynają się wielkimi literami.?- lubi(tomek,x).?- lubi(x,y). Często przydaje się tzw. zmienna anonimowa: _?- lubi(tomek,_).?- lubi(_,iza).

Elementy składowe programu struktury czyli terminy złożone. Struktury pozwalają traktować grupę powiązanych informacji jako całość. przykład posiada(jan,samochod). posiada(jan,samochod(toyota)). posiada(jan,samochod(toyota,avensis)). posiada(jan,zielony(samochod(toyota,avensis))).

Równość i unifikacja W prologu istnieje wbudowany predykat =. Kiedy staramy się spełnić cel:?- X=Y Prolog stara się dopasować X i Y. Próba uczynienia X i Y równymi to tzw. unifikacja.?- a=b. false.?- a=a. true.?- 7=7. true.

Równość i unifikacja Sprawdzenie celu X=Y odbywa się według następujących reguł: Jeżeli X jest zmienną nieukonkretnioną, a Y jest stałą bądź strukturą wówczas X i Y są równe i X jest ukonkretniona wartością Y.?- X=5. X = 5.?- mama(ania,marek)=y. Y = mama(ania,marek).

Równość i unifikacja Liczby całkowite i atomy:?- mama=mama. true.?- mama=tata. false.?- 1234=1234. true.?- 1234=1230. false.

Równość i unifikacja Dwie struktury są równe jeżeli mają taki sam funktor oraz taką samą liczbę składników a odpowiednie składniki są sobie równe.?- brat(tomek,marek)=brat(tomek,marek). true.?- brat(tomek,marek)=brat(tomek,adam). false.?- brat(tomek,marek)=brat(tomek,x). X = marek.?- brat(y,marek)=brat(tomek,x). X = marek, Y = tomek.?- 'lodz'=lodz. true.

Arytmetyka Prolog posiada predykaty wbudowane pozwalające porównywać liczby. Argumentami tych predykatów mogą być liczby zapisane jako stałe, zmienne ukonkretnione liczbami całkowitymi lub bardziej złożone wyrażenia algebraiczne.

Arytmetyka Mamy do dyspozycji operatory pozwalające porównywać liczby: X=:=Y X i Y są tą samą liczbą X\==Y X i Y są różnymi liczbami X<Y X jest mniejsze od Y X>Y X jest większe od Y X=<Y X jest mniejsze lub równe Y X>=Y X jest większe lub równe Y

Arytmetyka Przykład?- 2=:=2. true.?- 2=:=3. false.?- 2=\=3. true.?- 2=<3. true.?- 2>3. false.?- 2<X. ERROR: </2: Arguments are not sufficiently instantiated

Arytmetyka Przykład Rozważmy następującą bazę danych: wiek(tomek,21). wiek(pawel,45). starszy(x,y):-wiek(x,a),wiek(y,b),a>b. Wówczas:?- wiek(tomek,x). X = 21.?- starszy(pawel,tomek). true.?- starszy(pawel,x). X = tomek ; false.

Arytmetyka Przykład Rozważmy następującą bazę danych: wiek(tomek,21). wiek(pawel,45). starszy(x,y):-wiek(x,a),wiek(y,b),a>=b. Wówczas:?- wiek(tomek,x). X = 21.?- starszy(pawel,tomek). true.?- starszy(pawel,x). X = tomek ; X = pawel

Arytmetyka Przykład Rozważmy następującą bazę danych: bok(k,2). pole(y,x):-bok(y,z),x is Z*Z. obwod(y,x):-bok(y,z),x is 4*Z. Wówczas:?- bok(x,y). X=k, Y=2.?- pole(k,x). X=4.?- obwod(k,x). X=8.

Arytmetyka To jakich operatorów możemy użyć po prawej stronie operatora is zależy od systemu. Wszystkie implementacje Prologu obsługują: X+Y suma X i Y X-Y różnica X i Y X*Y iloczyn X i Y X/Y iloraz X i Y X//Y całkowity iloraz X przez Y X mod Y reszta z dzielenia X przez Y

Listy Lista to uporządkowany ciąg elementów. Elementami listy mogą być dowolne terminy: stałe, zmienne i struktury W Prologu listę zapisujemy następująco: Przykłady [element1,element2,,elementn] [a,b,cd,df,p,w] [ala,ma,kota,[a,x],y] [ ] Lista pusta

Listy Każda lista składa się z: głowy (ang. head) pierwszy element listy, ogona (ang. tail) będącego zawsze listą. Przykłady [a,b,cd,df,p,w] - głowa: [a], ogon: [b,cd,df,p,w] [ala,ma,kota,[a,x]] - głowa: [ala], ogon: [ma,kota,[a,x]] [ ] - głowa: [ ], ogon: [ ] Listę o głowie X i ogonie Y zapisujemy: [X Y]

Listy Ważne: Głową listy może być dowolny obiekt języka Prolog np. inna lista, zmienna. Ogon listy jest zawsze listą (może być listą pustą []). Lista jest strukturą rekurencyjną - jeżeli ogon jest niepusty, to również on składa się z głowy i z ogona.

Listy Rozważmy listę: [element1,element2,,elementn] Reprezentacja wewnętrzna listy odpowiada strukturze drzewiastej: funktor termu tworzącego listę element1 element2 element3 elementn [] lista pusta

Listy Przykład?- [a,b,c]=[a,b,c]. true.?- [a,b,c]=[x,b,c]. X = a.?- [a,b,c]=[x,b,y]. X = a, Y = c.?- [a,b,c]=[x Y]. X = a, Y = [b, c].?- [a,b,c]=[x _]. X = a.?- [a,b,c]=[x g,h]. false.

Listy i rekurencja Rozważmy listę: [audi,ford,fiat,renault,opel,chrysler,chevrolet] Załóżmy, że chcemy dowiedzieć, się czy jakaś marka samochodu jest elementem powyższej listy? W Prologu zaczynamy sprawdzać od głowy listy. Jeżeli odpowiedź jest negatywna sprawdzamy czy element należy do ogona listy. Ogon listy jest także listą więc znowu zaczynamy od głowy listy będącej ogonem aż dojdziemy do listy pustej.

Sprawdzenie przynależności Definicja : X należy do listy L, o ile X jest głową listy L (punkt A) lub X należy do ogona listy L (punkt B). Formalna definicja: (A) nalezy(x,[x _]). (B) nalezy(x,[_ Yogon]):-nalezy(X,Yogon). Przykład:?- nalezy(a,[b,c,d]). false.?- nalezy(a,[a,c,d]). true ; false.

Sprawdzenie przynależności nalezy(x,[x _]). nalezy(x,[_ Yogon]):-nalezy(X,Yogon). Wówczas:?- nalezy(a,[b,c,d]). false.?- nalezy(a,[a,c,d]). true ; false.?- nalezy(x,[a,c,d]). X = a.?- nalezy(x,[a,[a,v]]). X = a ; X = [a, v] ; false.

Sprawdzenie przynależności cd nalezy(x,[x _]). nalezy(x,[_ Yogon]):-nalezy(X,Yogon). Wówczas:?- nalezy(x,[_ a,b,c]). true ; false.?- nalezy(x,[a _]). X = a ; true ; true ; true ; true ; true ; true zapętlenie

Łączenie (konkatenacja) Chcemy zdefiniować predykat: sklej(l1,l2,l3). Lista L3 jest sklejeniem list L1 i L2. Definicja : Jeżeli lista L1 jest pusta, to lista L3 jest taka sama jak lista L2. Jeżeli lista L1 jest niepusta i ma postać [H T1], to lista L3 ma postać [H T2], gdzie T2 jest połączeniem list T1 i L2.

Łączenie (konkatenacja) Formalna definicja: sklej([],l,l). sklej([h T1],L2,[H T2]):-sklej(T1,L2,T2). Graficznie: L1 H T1 L2 T2 H T1 L2 [H T2]

Łączenie (konkatenacja) Przykład:?- sklej([a],[b,c],[a,b,c]). true.?- sklej([a],[b,c],[a,b,c,d]). false.?- sklej([a],[b,c],x). X = [a, b, c].?- sklej(y,[b,c],x). Y = [], X = [b, c] ; Y = [_G377], X = [_G377, b, c] ; Y = [_G377, _G383], X = [_G377, _G383, b, c] ; Y = [_G377, _G383, _G389], X = [_G377, _G383, _G389, b, c].

Zastosowanie konkatenacji Chcemy inaczej zdefiniować predykat: nalezy(x,l). Powyższa klauzula jest prawdziwa jeżeli element X należy do listy L. Definicja : X należy do listy L, o ile L jest konkatenacją listy L1 i listy [X,L2].

Zastosowanie konkatenacji Formalna definicja: lub: nalezy(x,l):-sklej(l1,[x L2],L). nalezy(x,l):-sklej(_,[x _],L). Graficznie: L L1 X L2

Dodanie elementu Chcemy zdefiniować predykat: dodaj(x,l1,l2). Do listy L1 dodajemy jako głowę element X i otrzymujemy listę L2. Definicja : Głową listy L2 jest element X, ogonem lista L1.

Dodanie elementu Formalna definicja: Przykład: dodaj(x,l,[x L])?- dodaj(a,[b,c,dfgf],x). X = [a, b, c, dfgf].?- dodaj(a,[b,c,dfgf],[a,b,c,dfgf]). true.?- dodaj(x,[b,c,dfgf],[a,b,c,dfgf]). X = a.?- dodaj(x,[b,c,dfgf],y). Y = [X, b, c, dfgf].

Usunięcie elementu Chcemy zdefiniować predykat: usun(x,l1,l2). Powyższa klauzula jest prawdziwa jeżeli lista L2 powstaje przez usunięcie elementu X z listy L1. Definicja : Jeżeli X jest głową listy L1, to lista L2 jest ogonem listy L1. Jeżeli X należy do ogona listy L1, to usuń stamtąd X.

Usunięcie elementu Formalna definicja: usun(x,[x O],O). usun(x,[y L],[Y O]):-usun(X,L,O). Graficznie: L Y X O [Y L] Y X O [Y O]

Usunięcie elementu Przykład:?- usun(a,[b,c,dfgf],y). false.?- usun(a,[b,a,dfgf],y). Y = [b, dfgf].?- usun(a,[b,a,d],y). Y = [b, d]?- usun(a,[b,a,d,a],y). Y = [b, d, a] ; Y = [b, a, d] ; false.?- usun(a,x,[b,c]). X = [a, b, c] ; X = [b, a, c] ; X = [b, c, a] ; false.

Lista odwrotna Przykład:?- odwr([a,b,c,d],[d,c,a,b]). false.?- odwr([a,b,c,d],[d,c,b,a]). true.?- odwr([a,b,c,d],x). X = [d, c, b, a].

Podlisty Chcemy zdefiniować predykat: podlist(l1,l2). Powyższa klauzula jest prawdziwa jeżeli lista zawiera się w liście L2. L1 Definicja : Lista S należy do listy L, o ile lista L składa się z dwóch list L1 i L2, a lista L2 jest połączeniem list S i L3.

Podlisty Formalna definicja: podlist(s,l):-sklej(l1,l2,l),sklej(s,l3,l2). Graficznie: L L1 S L3 L2

Podlisty Przykład:?- podlist([a],[a,b]). true.?- podlist([a,c],[a,b,c,d]). false.?- podlist([a,b,c],[a,b,c,d]). true.?- podlist([c,d],[a,b,c,d]). true.?- podlist(x,[a,b]). X = [] ; X = [a] ; X = [a, b] ; X = [] ; X = [b] ; X = [] ; false.

Permutacja listy Chcemy zdefiniować predykat: permut(l1,l2). Powyższa klauzula jest prawdziwa, jeśli lista L2 jest permutacją listy L1. Definicja : Jeżeli pierwsza lista (L1) jest pusta, to druga lista (L2) również jest pusta. Najpierw usuwamy element X, na pozostałej reszcie L1 dokonujemy permutacji i wstawiamy element X na początek poddanej już permutacji reszcie listy (czyli P).

Permutacja listy Formalna definicja: permut([],[]). permut(l,[x P]):-usun(X,L,L1),permut(L1,P). Graficznie: L X L1 permutacja P

Permutacja listy Przykład:?- permut([a,b,c],[a,c,b]). true.?- permut([a,b,c],[a,c,d]). false.?- permut([a,b,c],x). X = [a, b, c] ; X = [a, c, b] ; X = [b, a, c] ; X = [b, c, a] ; X = [c, a, b] ; X = [c, b, a] ; false.

Mechanizm nawracania Rozważmy zapytanie:?- lubi(tomek,x),lubi(ala,x) Kolejne etapy znajdowania rozwiązania: 1. Uzgodniony jest cel pierwszy zmienna X przyjmuje wartość ryby.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala).

Mechanizm nawracania 2. Następuje próba uzgodnienia drugiego celu. 3. Drugi cel zawodzi.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 3. Następuje nawrót poprzednia wartość zmiennej X jest odrzucona. Próbujemy ponownie uzgodnić pierwszy cel.

Mechanizm nawracania 4. Ponownie uzgodniony jest cel pierwszy zmienna X przyjmuje wartość ksiazka.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 5. Ponownie następuje próba uzgodnienia drugiego celu.

Mechanizm nawracania 6. Drugi cel jest uzgodniony.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 7. Prolog informuje o udanym uzgodnieniu koniunkcji i czeka na naszą reakcję.

Mechanizm nawracania Przykład:?- lubi(tomek,x),lubi(ala,x). X = ksiazka; false...ale przypadku bazy: otrzymamy: lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(ala,ryby). lubi(tomek,ala).?- lubi(tomek,x),lubi(ala,x). X = ryby ; X = ksiazka ; false. Ponowne uzgodnienie celu nie powiodło się!

Mechanizm nawracania Rozważmy następującą definicję funkcji: Wykres:

Mechanizm nawracania Definicja funkcji w Prologu: Przykład: f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x.?- f(5,x). X = 0.?- f(3,x). X = 1 ; false.?- f(-1,x). X = 2 ; false. Ponowne uzgodnienie celu nie powiodło się!

Mechanizm nawracania Przeanalizujmy szczegółowo powyższy przykład:?-?- f(5,x). 2 Ale 5>2!!! f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel nieosiągnięty!!!?-?- f(5,x). 1 Ale 5>4!!! f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel nieosiągnięty!!!

Mechanizm nawracania Przeanalizujmy szczególnie powyższy przykład:?-?- f(5,x). W efekcie otrzymujemy: 0 OK 5>4!!! f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel osiągnięty!!!?- f(5,x). X = 0. a ponieważ to ostatnia reguła nic więcej nie otrzymujemy!

Mechanizm nawracania A teraz inne zapytanie:?-?- f(3,x). 2 Ale 3>2!!! f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel nieosiągnięty!!!?-?- f(3,x). 1 OK 2<3<=4 f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel osiągnięty!!!

Mechanizm nawracania W efekcie otrzymujemy:?- f(3,x). X = 1; Ale nie doszliśmy jeszcze do ostatniej reguły w bazie. Wybieramy zatem ; czyli próbujemy ponownie osiągnąć cel.?-?- f(3,x). 1 Ale 3<4 f(x,2):-x=<2. f(x,1):-2<x,x=<4. f(x,0):-4<x. Cel nieosiągnięty!!!

Mechanizm nawracania To była ostatnia reguła w bazie zatem otrzymujemy:?- f(3,x). X = 1 ; false. Cel osiągnięty!!! Nieudana próba ponownego osiągnięcia celu!!! Z podobną sytuacją mamy do czynienia w przypadku zapytania:?- f(-1,x). X = 2 ; false. Cel osiągnięty!!! Nieudana próba ponownego osiągnięcia celu!!!

Mechanizm nawracania Zauważmy, że: W rozważanej definicji funkcji mamy do czynienia z trzema rozłącznymi warunkami (z trzema przedziałami). Jeżeli spełniony jest któryś z warunków wówczas nie ma potrzeby sprawdzać warunków pozostałych. Mechanizm nawracania prowadzi do sytuacji w której po osiągnięciu celu rozważane są przypadki, które nie mogą być spełnione. Rozwiązaniem jest tzw. mechanizm cięć.

Koniec