111
Programowanie w logice Prolog 1

Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Embed Size (px)

Citation preview

Page 1: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Programowanie w logice Prolog

1

Page 2: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Prolog - zastosowania

Zastosowania:

• relacyjne bazy danych.

• przetwarzanie języka naturalnego.

• logistyka.

• analiza struktur biochemicznych.

• wspomaganie projektowania.

• sztuczna inteligencja.

Page 3: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Chcąc rozwiązać problem opisujemy fakty i relacje dotyczące problemu.

Prolog służy do rozwiązywania problemów dotyczących obiektów i relacji między nimi.

Page 4: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Obiekty i relacje

Rozważmy stwierdzenie:

Paweł ma laptopa.

Jest to relacja uporządkowana: Paweł ma laptopa a nie odwrotnie.

Miedzy dwoma obiektami (Paweł, laptop) istnieje relacja posiadania (ma).

Jeżeli chcemy dowiedzieć się czegoś o relacji możemy zadać pytanie:

Czy Paweł ma laptopa?

Page 5: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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:

Czy Paweł ma komputer?

Jaka będzie odpowiedź?

Page 6: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Obiekty i relacje

Jeżeli przyjmiemy, że:

wówczas odpowiedź jest oczywista (i wywnioskowana z dwóch stwierdzeń!).

Powyższe stwierdzenie jest pewną regułą.

Każdy laptop jest komputerem.

Zauważmy, że reguła nie dotyczy konkretnego laptopa czy komputera.

Page 7: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 8: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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ł

Page 9: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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?

Page 10: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Logika pierwszego rzędu (FOL)

Page 11: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Rozważmy teraz następujące zdanie:

"x x + 1 < x

• Jeżeli rozważmy najbardziej oczywistą intepretację wówczas odpowiedź jest negatywna – suma dowolnej liczby x i 1 nie jest mniejsza od x!

Czy formuła ta jest prawdziwa?

• 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ą!

Page 12: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Tautologią nie jest także zdanie:

2 + 3 = 5

• Przyjmijmy, że D=R oraz + interpretujemy jako mnożenie.

W jakiej interpretacji zdanie to nie jest prawdziwe?

Oczywiście formuła powyższa nie jest spełniona w powyższej interpretacji!

• Predykat = interpretujemy jako „równość” oraz stałe 2, 3 i 5 jako odpowiednie liczby.

Page 13: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

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

Page 14: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Zdania:

są spełnione przez następujące grafy:

Page 15: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Grafy powyższe spełniają także:

Ale nie każdy graf spełnia to zdanie:

Page 16: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

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:

Page 17: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Page 18: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

FOL – konsekwencja logiczna

Wykorzystująć predykaty F, P i B możemy zdefiniować inne predykaty np.:

Taką możliwość będziemy wykorzystywali w Prologu.

G(x,y) = ∃z(P(x, z)∧P(z, y))

M(x) =¬F(x)

SB(x,y) = ∃z(B(x, z)∧B(y, z))

Page 19: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Chcemy odpowiedzieć na pytanie:

Czy na niezielonym bloku leży blok zielony?

FOL – konsekwencja logiczna

Przykład

Page 20: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 21: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Fakty

Fakty opisują obiekty i relacje między nimi.

W Prologu fakty zapisujemy następująco:

mezczyzna(tomek).

kobieta(ala).

lubi(tomek,ala).

wiek(tomek,30).

rodzic(maria,renata,tomek).

predykat(argumenty).

Przykłady:

Page 22: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Fakty

tomek, ala, alicja, renata Nazwy:

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

a(b).

c(d).

e(b,d).

f(b,21).

g(h,i,b).

Poprzedni przykład, ale inaczej zapisany:

interpretacja a – mężczyzna b – Tomek ...

Zbiór faktów nazywamy bazą danych.

Page 23: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zapytania

Dysponując bazą danych możemy zadawać dotyczące jej zapytania.

W Prologu fakty zapisujemy następująco:

?-predykat(argumenty).

?-mezczyzna(tomek).

?-mezczyzna(ala).

?-lubi(tomek,ala).

?-wiek(tomek,30).

?-rodzic(maria,ala,tomek).

Przykłady:

Page 24: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 25: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zapytania

Przykład

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

Rozważmy bazę danych:

?- lubi(tomek,ryby).

true.

?- lubi(tomek,frytki).

false.

?- lubi(ala,ksiazka).

true.

..i zapytania:

Page 26: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zapytania

Przykład

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

Rozważmy bazę danych:

?- lubi(ala,ksiazka).

true.

?- lubi(ala,rower).

false.

?- kobieta(ala).

ERROR: toplevel: Undefined procedure:

kobieta/1 (DWIM could not correct goal)

..i zapytania:

Page 27: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zapytania

W przypadku gdy zadamy zapytanie o relację (predykat), której nie ma w bazie danych zachowanie zależy od systemu.

W przypadku gdy zadamy zapytanie o obiekt, którego nie ma w bazie danych Prolog zwraca odpowiedź NO (FALSE).

W powyższym przykładzie system zwrócił informację o błędzie.

Page 28: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Potrafimy już tworzyć zapytania dotyczące konkretnych obiektów. Możemy np. zapytać:

Zapytania takie możemy formułować wykorzystując zmienne.

Czy możemy jedna zapytać nie o to czy Tomek lubi konkretną rzecz, ale o to co lubi w ogóle?.

?- lubi(tomek,ryby).

Zmienne pisane są z dużej litery.

Zmienna może być ukonkretniona lub nieukonkre-tniona.

Page 29: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpić zmienną.

?- lubi(tomek,X).

A zatem wyszukiwane są wszystkie obiekty, które lubi Tomek.

gdzie X jest zmienną.

Rozważmy zapytanie:

Page 30: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpić zmienną.

?- lubi(Kto,ksiazka).

A zatem wyszukiwane są wszystkie obiekty, które lubią książkę.

gdzie Kto jest zmienną.

Rozważmy zapytanie:

Page 31: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

…i zapytanie:

Rozważmy ponownie bazę danych:

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

?- lubi(tomek,X).

Page 32: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 33: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 34: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 35: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Prolog przeszukuje bazę danych w takiej kolejności jak ją wpisano.

Wciskamy klawisz ;

Page 36: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

…i zapytanie:

Rozważmy ponownie bazę danych:

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

?- lubi(Kto,ksiazka).

Page 37: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

?- lubi(Kto,ksiazka).

Kto = ala .

Prolog zwraca:

Wciskamy klawisz Enter

?- lubi(Kto,ksiazka).

Kto = ala ;

Kto = tomek.

Prolog zwraca:

Wciskamy klawisz ;

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

Page 38: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

Wynik:

Dla tej samej bazy danych rozważmy zapytanie z dwiema zmiennymi (Kto i Co):

?- lubi(Kto,Co).

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

?- lubi(Kto,Co).

Kto = tomek,

Co = ryby ;

Kto = tomek,

Co = ala ;

Kto = ala,

Co = ksiazka ;

Kto = tomek,

Co = ksiazka .

Wciskamy klawisz ;

Page 39: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Koniunkcje

Wiemy już jak budować proste zapytania.

Wykorzystujemy w tym celu koniunkcję zapytań oznaczaną przecinkiem.

Możemy zapytać np. o rzeczy, które są lubiane i przez Tomka i przez Alę.

Zapytania możemy łączyć i uzyskiwać w ten sposób zapytania bardziej złożone.

Problem składa się wówczas z dwóch odrębnych celów.

Page 40: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

Wynik:

Dla powyższej bazy danych rozważmy zapytanie:

?- lubi(tomek,ala),lubi(ala,tomek).

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

?- lubi(tomek,ala),lubi(ala,tomek).

false.

koniunkcja

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.

Page 41: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

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.

Dla powyższej bazy danych rozważmy zapytanie z jedną zmienną:

?- lubi(tomek,Co),lubi(ala,Co).

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

Page 42: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Zmienne

Przykład

otrzymujemy:

…a zatem dla zapytania:

?- lubi(tomek,Co),lubi(ala,Co).

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

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

Page 43: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Kolejne etapy znajdowania rozwiązania:

Rozważmy zapytanie:

?- lubi(tomek,X),lubi(ala,X).

1. Uzgodniony jest cel pierwszy – zmienna X przyjmuje wartość ryby.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ryby ryby

Page 44: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

2. Następuje próba uzgodnienia drugiego celu.

3. Następuje nawrót – poprzednia wartość zmiennej X jest odrzucona. Próbujemy ponownie uzgodnić pierwszy cel.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ryby ryby

3. Drugi cel zawodzi.

Page 45: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

4. Ponownie uzgodniony jest cel pierwszy – zmienna X przyjmuje wartość ksiazka.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ksiazka ksiazka

5. Ponownie następuje próba uzgodnienia drugiego celu.

Page 46: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

7. Prolog informuje o udanym uzgodnieniu koniunkcji i czeka na odpowiedź.

6. Drugi cel jest uzgodniony.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ksiazka ksiazka

Page 47: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 48: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Reguły

Reguły mogą być wykorzystywane do zapisywania definicji np.

X jest ptakiem jeżeli:

X jest zwierzęciem i

X ma pióra

Inny przykład:

X jest ojcem Y jeżeli:

X jest mężczyzną i

X jest rodzicem Y

Page 49: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Reguły

W prologu każda reguła składa się z głowy i treści.

fakt1 :- fakt2,fakt3,…,fakt n.

głowa treść

Przykład

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

Treść zawiera koniunkcję celów, które muszą być spełnione, aby głowa była prawdziwa.

Page 50: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 51: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Reguły

Przykład

Zapytanie:

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

lubi(ala,X):-lubi(X,ksiazka).

?- lubi(tomek,X).

Wynik:

?- lubi(tomek,X).

X = ryby ;

X = ala ;

X = ksiazka.

Page 52: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Reguły

Przykład

Zapytanie:

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

lubi(ala,X):-lubi(X,ksiazka).

?- lubi(ala,X).

Wynik:

?- lubi(ala,X).

X = ksiazka ;

X = ala ;

X = tomek ;

false.

Page 53: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

Zapytanie:

lubi(tomek,ryby).

lubi(tomek,ala).

lubi(ala,X):-lubi(X,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ksiazka).

?- lubi(ala,X).

Wynik:

?- lubi(ala,X).

X = ala ;

X = tomek ;

X = ksiazka.

Reguły

Page 54: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 55: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Interesuje nas zapytanie:

?- siostra(renata,tomek).

Przykład

Reguły

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.

siostra(X,Y):-

kobieta(X),rodzic(X,A,B),rodzic(Y,A,B).

Page 56: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

Reguły

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.

siostra(X,Y):-

kobieta(X),rodzic(X,A,B),rodzic(Y,A,B).

3. Prolog szuka faktu rodzic(renata,A,B).

Znaleziony zostaje fakt

rodzice(renata,alicja,pawel).

Page 57: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Przykład

Reguły

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.

siostra(X,Y):-

kobieta(X),rodzic(X,A,B),rodzic(Y,A,B).

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.

Page 58: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Przykłady atomów:

mama, brat, adam, ?-, :-, ‘Dom’

Przykłady liczb:

10, 9.99, 6.01e-27, 13456

Atomy zaczynają się małą literą. Jeżeli musimy użyć wielkiej litery zapisujemy nazwę w apostrofach.

Page 59: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 60: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 61: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 62: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 63: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Równość i unifikacja

• Liczby całkowite i atomy:

?- mama=mama.

true.

?- mama=tata.

false.

?- 1234=1234.

true.

?- 1234=1230.

false.

Page 64: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 65: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 66: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 67: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 68: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Page 69: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 70: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Arytmetyka

Przykład Rozważmy następującą bazę danych:

Wówczas: ?- bok(X,Y).

X=k,

Y=2.

?- pole(k,X).

X=4.

?- obwod(k,X).

X=8.

bok(k,2).

pole(Y,X):-bok(Y,Z),X is Z*Z.

obwod(Y,X):-bok(Y,Z),X is 4*Z.

Page 71: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 72: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Listy

Lista to uporządkowany ciąg elementów.

W Prologu listę zapisujemy następująco:

[a,b,cd,df,p,w]

[ala,ma,kota,[a,X],Y]

[element1,element2,…,elementN]

Przykłady

[ ] Lista pusta

Elementami listy mogą być dowolne terminy: stałe, zmienne i struktury

Page 73: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Listy

Każda lista składa się z:

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

Przykłady

[ ] - głowa: [ ], ogon: [ ]

• głowy (ang. head) – pierwszy element listy,

• ogona (ang. tail) – będącego zawsze listą.

Listę o głowie X i ogonie Y zapisujemy: [X|Y]

Page 74: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Lista jest strukturą rekurencyjną - jeżeli ogon jest niepusty, to również on składa się z głowy i z ogona.

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ą []).

Ważne:

Listy

Page 75: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Reprezentacja wewnętrzna listy odpowiada stru-kturze drzewiastej:

Rozważmy listę:

[element1,element2,…,elementN]

element1

element2

element3

elementN []

funktor termu tworzącego listę

lista pusta

Listy

Page 76: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 77: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Rozważmy listę:

Listy i rekurencja

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

Page 78: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

(A) nalezy(X,[X|_]).

(B) nalezy(X,[_|Yogon]):-nalezy(X,Yogon).

Formalna definicja:

Definicja :

Sprawdzenie przynależności

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

?- nalezy(a,[b,c,d]).

false.

?- nalezy(a,[a,c,d]).

true ;

false.

Przykład:

Page 79: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

nalezy(X,[X|_]).

nalezy(X,[_|Yogon]):-nalezy(X,Yogon).

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

Wówczas:

Sprawdzenie przynależności

Page 80: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

cd…

?- nalezy(X,[_|a,b,c]).

true ;

false.

?- nalezy(X,[a|_]).

X = a ;

true ;

true ;

true ;

true ;

true ;

true

Wówczas:

„zapętlenie”

Sprawdzenie przynależności

nalezy(X,[X|_]).

nalezy(X,[_|Yogon]):-nalezy(X,Yogon).

Page 81: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

sklej(L1,L2,L3).

Chcemy zdefiniować predykat:

Lista L3 jest sklejeniem list L1 i L2.

Łączenie (konkatenacja)

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

Definicja :

Page 82: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

sklej([],L,L).

sklej([H|T1],L2,[H|T2]):-sklej(T1,L2,T2).

Formalna definicja:

Graficznie:

Łączenie (konkatenacja)

H T1 L2

L1

T2

H T1 L2

[H|T2]

Page 83: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Łączenie (konkatenacja)

Page 84: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

nalezy(X,L).

Chcemy inaczej zdefiniować predykat:

Powyższa klauzula jest prawdziwa jeżeli element X należy do listy L.

Zastosowanie konkatenacji

X należy do listy L, o ile L jest

konkatenacją listy L1 i listy [X,L2].

Definicja :

Page 85: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

nalezy(X,L):-sklej(L1,[X|L2],L).

Formalna definicja:

Graficznie:

L1

L

X L2

nalezy(X,L):-sklej(_,[X|_],L).

…lub:

Zastosowanie konkatenacji

Page 86: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

dodaj(X,L1,L2).

Chcemy zdefiniować predykat:

Do listy L1 dodajemy jako głowę element X i otrzymujemy listę L2.

Dodanie elementu

Głową listy L2 jest element X, ogonem

lista L1.

Definicja :

Page 87: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

dodaj(X,L,[X|L])

Formalna definicja:

Przykład:

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

Dodanie elementu

Page 88: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

usun(X,L1,L2).

Chcemy zdefiniować predykat:

Powyższa klauzula jest prawdziwa jeżeli lista L2 powstaje przez usunięcie elementu X z listy L1.

Usunięcie elementu

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

Definicja :

Page 89: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

usun(X,[X|O],O).

usun(X,[Y|L],[Y|O]):-usun(X,L,O).

Formalna definicja:

Graficznie:

X O

L

Y

[Y|L]

Usunięcie elementu

X O Y

[Y|O]

Page 90: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Usunięcie elementu

Page 91: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Lista odwrotna

Page 92: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

podlist(L1,L2).

Chcemy zdefiniować predykat:

Powyższa klauzula jest prawdziwa jeżeli lista L1 zawiera się w liście L2.

Podlisty

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.

Definicja :

Page 93: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

podlist(S,L):-sklej(L1,L2,L),sklej(S,L3,L2).

Formalna definicja:

Graficznie:

L1 L3

L

L2

S

Podlisty

Page 94: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Podlisty

Page 95: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

permut(L1,L2).

Chcemy zdefiniować predykat:

Powyższa klauzula jest prawdziwa, jeśli lista L2 jest permutacją listy L1.

Permutacja listy

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

Definicja :

Page 96: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

permut([],[]).

permut(L,[X|P]):-usun(X,L,L1),permut(L1,P).

Formalna definicja:

Graficznie:

X L1

L

P

permutacja

Permutacja listy

Page 97: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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.

Permutacja listy

Page 98: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Kolejne etapy znajdowania rozwiązania:

Rozważmy zapytanie:

?- lubi(tomek,X),lubi(ala,X)

1. Uzgodniony jest cel pierwszy – zmienna X przyjmuje wartość ryby.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ryby ryby

Page 99: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

2. Następuje próba uzgodnienia drugiego celu.

3. Następuje nawrót – poprzednia wartość zmiennej X jest odrzucona. Próbujemy ponownie uzgodnić pierwszy cel.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ryby ryby

3. Drugi cel zawodzi.

Page 100: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

4. Ponownie uzgodniony jest cel pierwszy – zmienna X przyjmuje wartość ksiazka.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ksiazka ksiazka

5. Ponownie następuje próba uzgodnienia drugiego celu.

Page 101: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

7. Prolog informuje o udanym uzgodnieniu koniunkcji i czeka na naszą reakcję.

6. Drugi cel jest uzgodniony.

?- lubi(tomek,X),lubi(ala,X).

lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(tomek,ala).

ksiazka ksiazka

Page 102: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Przykład: ?- lubi(tomek,X),lubi(ala,X).

X = ksiazka;

false.

?- lubi(tomek,X),lubi(ala,X).

X = ryby ;

X = ksiazka ;

false.

..ale przypadku bazy: lubi(tomek,ryby).

lubi(tomek,ksiazka).

lubi(ala,ksiazka).

lubi(ala,ryby).

lubi(tomek,ala).

otrzymamy:

Ponowne uzgodnienie celu nie powiodło się!

Page 103: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Rozważmy następującą definicję funkcji:

Wykres:

Page 104: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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ę!

Page 105: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Przeanalizujmy szczegółowo powyższy przykład:

?- ?- f(5,X).

2

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

Ale 5>2!!!

?- ?- f(5,X).

1

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

Ale 5>4!!!

Cel nieosiągnięty!!!

Cel nieosiągnięty!!!

Page 106: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

Przeanalizujmy szczególnie powyższy przykład:

?- ?- f(5,X).

0

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

OK 5>4!!! Cel osiągnięty!!!

?- f(5,X).

X = 0.

W efekcie otrzymujemy:

…a ponieważ to ostatnia reguła nic więcej nie otrzymujemy!

Page 107: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

A teraz inne zapytanie:

?- ?- f(3,X).

2

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

Ale 3>2!!!

?- ?- f(3,X).

1

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

OK 2<3<=4

Cel nieosiągnięty!!!

Cel osiągnięty!!!

Page 108: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Mechanizm nawracania

W efekcie otrzymujemy:

Cel nieosiągnięty!!!

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

f(X,2):-X=<2.

f(X,1):-2<X,X=<4.

f(X,0):-4<X.

Ale 3<4

Page 109: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 110: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

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

Page 111: Programowanie w logice Prolog 1 - merlin.fic.uni.lodz.plmerlin.fic.uni.lodz.pl/MSkulimowski/prolog/Prolog_1_2017.pdf · Programowanie w logice Prolog 1 . Prolog - zastosowania Zastosowania:

Koniec