programowanie w logice prolog 1 -...

Post on 28-Feb-2019

298 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related