Programowanie w logice Prolog 1 -...
Transcript of Programowanie w logice Prolog 1 -...
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.
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.
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?
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ź?
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.
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)
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ą!
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.
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).
Przykład
FOL – konsekwencja logiczna
Zdania:
są spełnione przez następujące grafy:
Przykład
FOL – konsekwencja logiczna
Grafy powyższe spełniają także:
Ale nie każdy graf spełnia to zdanie:
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:
Przykład
FOL – konsekwencja logiczna
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))
Chcemy odpowiedzieć na pytanie:
Czy na niezielonym bloku leży blok zielony?
FOL – konsekwencja logiczna
Przykład
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:
mezczyzna(tomek).
kobieta(ala).
lubi(tomek,ala).
wiek(tomek,30).
rodzic(maria,renata,tomek).
predykat(argumenty).
Przykłady:
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.
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:
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
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:
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:
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.
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.
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:
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:
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).
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.
Prolog przeszukuje bazę danych w takiej kolejności jak ją wpisano.
Wciskamy klawisz ;
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).
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).
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 ;
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.
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.
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).
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).
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
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.
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.
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
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.
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
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.
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
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.
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.
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
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
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).
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).
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.
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.
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:
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.
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.
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
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]
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
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
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
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.
(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:
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
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).
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 :
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]
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)
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 :
nalezy(X,L):-sklej(L1,[X|L2],L).
Formalna definicja:
Graficznie:
L1
L
X L2
nalezy(X,L):-sklej(_,[X|_],L).
…lub:
Zastosowanie konkatenacji
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 :
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
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 :
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]
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
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
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 :
podlist(S,L):-sklej(L1,L2,L),sklej(S,L3,L2).
Formalna definicja:
Graficznie:
L1 L3
L
L2
S
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.
Podlisty
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 :
permut([],[]).
permut(L,[X|P]):-usun(X,L,L1),permut(L1,P).
Formalna definicja:
Graficznie:
X L1
L
P
permutacja
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.
Permutacja listy
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
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.
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.
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
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ę!
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
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!!!
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!
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!!!
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
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