Prolog
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 zapytao o obiekty i związki między nimi.
Fakty Fakty opisują obiekty i relacje między nimi. W Prologu fakty zapisujemy następująco: Przykłady: predykat(argumenty). mezczyzna(tomek). kobieta(ala). lubi(tomek,ala). wiek(tomek,30). rodzic(maria,renata,tomek).
Fakty Nazwy: tomek, ala, alicja, renata dotyczące konkretnych obiektów pisane są z małej litery. Każdy obiekt musi posiadad interpretację. Nazwy relacji i obiektów są całkowicie dowolne*. Poprzedni przykład, ale inaczej zapisany: a(b). c(d). e(b,d). f(b,21). g(h,i,b). interpretacja a mężczyzna b Tomek... Zbiór faktów nazywamy bazą danych.
Zapytania Dysponując bazą danych możemy zadawad dotyczące jej zapytania. W Prologu fakty zapisujemy następująco: Przykłady:?-predykat(argumenty).?-mezczyzna(tomek).?-mezczyzna(ala).?-lubi(tomek,ala).?-wiek(tomek,30).?-rodzic(maria,ala,tomek).
Zapytania Jeżeli zadajemy zapytanie Prolog przeszukuje bazę danych i szuka faktów pasujących do faktu podanego w zapytaniu. Dwa fakty pasują do siebie jeżeli mają te same predykaty (tak samo pisane) i te same argumenty. Jeżeli poszukiwanie zakooczy się sukcesem Prolog odpowiada YES (TRUE), w przeciwnym razie NO (FALSE).
Zapytania Przykład Rozważmy bazę danych: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka)...i zapytania:?- lubi(tomek,ryby). true.?- lubi(tomek,frytki). false.?- lubi(ala,ksiazka). true.
Zapytania Przykład Rozważmy bazę danych:..i zapytania: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(ala,ksiazka). true.?- lubi(ala,rower). false.?- kobieta(ala). ERROR: toplevel: Undefined procedure: kobieta/1 (DWIM could not correct goal)
Zapytania W przypadku gdy zadamy zapytanie o relację (predykat), której nie ma w bazie danych zachowanie zależy od systemu. W powyższym przykładzie system zwrócił informację o błędzie. W przypadku gdy zadamy zapytanie o obiekt, którego nie ma w bazie danych Prolog zwraca odpowiedź NO (FALSE).
Zmienne Potrafimy już tworzyd zapytania dotyczące konkretnych obiektów. Możemy np. zapytad:?- lubi(tomek,ryby). Czy możemy jedna zapytad nie o to czy Tomek lubi konkretną rzecz, ale o to co lubi w ogóle?. Zapytania takie możemy formułowad wykorzystując zmiennych. Zmienne pisane są z dużej litery. Zmienna może byd ukonkretniona lub nieukonkretniona.
Zmienne Przykład Rozważmy zapytanie: gdzie X jest zmienną.?- lubi(tomek,x). Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpid zmienną. A zatem wyszukiwane są wszystkie obiekty, które lubi Tomek.
Zmienne Przykład Rozważmy zapytanie: gdzie Kto jest zmienną.?- lubi(kto,ksiazka). Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpid zmienną. A zatem wyszukiwane są wszystkie obiekty, które lubią książkę.
Zmienne Przykład Rozważmy ponownie bazę danych: i zapytanie: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(tomek,x).
Zmienne Przykład Początkowo zmienna X nie jest ukonkretniona. Prolog przeszukuje wszystkie fakty z bazy danych w celu znalezienia obiektu, który może zastąpid zmienną. Precyzyjniej Prolog wyszukuje dowolne fakty z predykatem lubi i pierwszym argumentem tomek, drugi argument może byd dowolny. Kiedy fakt taki zostaje znaleziony wówczas X staje się zmienną ukonkretnioną i przyjmuje wartośd 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 zakooczenie wyszukiwania. Wciśnięcie klawisza ; (i Enter) powoduje dalsze przeszukiwanie bazy danych od miejsca oznaczonego wcześniej.
Zmienne Przykład Dla bazy danych: Prolog zwraca: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(tomek,x). X = ryby ; X = ala ; X = ksiazka. Wciskamy klawisz ; Prolog przeszukuje bazę danych w takiej kolejności jak ją wpisano.
Zmienne Przykład Rozważmy ponownie bazę danych: i zapytanie: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(kto,ksiazka).
Zmienne Przykład Prolog zwraca: Prolog zwraca: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka).?- lubi(kto,ksiazka). Kto = ala.?- lubi(kto,ksiazka). Kto = ala ; Kto = tomek. Wciskamy klawisz Enter Wciskamy klawisz ;
Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla tej samej bazy danych rozważmy zapytanie z dwiema zmiennymi (Kto i Co): Wynik:?- lubi(kto,co).?- lubi(kto,co). Kto = tomek, Co = ryby ; Kto = tomek, Co = ala ; Kto = ala, Co = ksiazka ; Kto = tomek, Co = ksiazka. Wciskamy klawisz ;
Koniunkcje Wiemy już jak budowad proste zapytania. Zapytania możemy łączyd i uzyskiwad w ten sposób zapytania bardziej złożone. Możemy zapytad np. o rzeczy, które są lubiane i przez Tomka i przez Alę. Wykorzystujemy w tym celu koniunkcję zapytao oznaczaną przecinkiem. Problem składa się wówczas z dwóch odrębnych celów.
Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla powyższej bazy danych rozważmy zapytanie:?- lubi(tomek,ala),lubi(ala,tomek). Wynik: koniunkcja?- lubi(tomek,ala),lubi(ala,tomek). false. Aby spełniona była koniunkcja muszą byd spełnione oba cele (wszystkie cele składowe). W przypadku rozważanej bazy danych cel pierwszy jest prawdziwy, cel drugi nie.
Zmienne Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). Dla powyższej bazy danych rozważmy zapytanie z jedną zmienną:?- lubi(tomek,co),lubi(ala,co). Prolog najpierw próbuje spełnid 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łnid drugi cel. Jeżeli to się uda wówczas drugie miejsce w bazie zostaje oznaczone (znacznik 2) i Prolog zwraca rozwiązanie.
Zmienne Przykład a zatem dla zapytania: lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). otrzymujemy:?- lubi(tomek,co),lubi(ala,co).?- lubi(tomek,co),lubi(ala,co). Co = ksiazka. Jeżeli drugi cel nie zostanie spełniony wówczas Prolog stara się inaczej spełnid cel poprzedni. Prolog zaczyna ponownie przeszukiwad bazę danych od znacznika 1, a nie od początku (mechanizm nawracania).
Mechanizm nawracania Rozważmy zapytanie:?- lubi(tomek,x),lubi(ala,x). Kolejne etapy znajdowania rozwiązania: 1. Uzgodniony jest cel pierwszy zmienna X przyjmuje wartośd ryby.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala).
Mechanizm nawracania 2. Następuje próba uzgodnienia drugiego celu. 3. Drugi cel zawodzi.?- lubi(tomek,x),lubi(ala,x). ryby ryby lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 3. Następuje nawrót poprzednia wartośd zmiennej X jest odrzucona. Próbujemy ponownie uzgodnid pierwszy cel.
Mechanizm nawracania 4. Ponownie uzgodniony jest cel pierwszy zmienna X przyjmuje wartośd ksiazka.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 5. Ponownie następuje próba uzgodnienia drugiego celu.
Mechanizm nawracania 6. Drugi cel jest uzgodniony.?- lubi(tomek,x),lubi(ala,x). ksiazka ksiazka lubi(tomek,ryby). lubi(tomek,ksiazka). lubi(ala,ksiazka). lubi(tomek,ala). 7. Prolog informuje o udanym uzgodnieniu koniunkcji i czeka na odpowiedź.
Reguły W Prologu reguły pozwalają nam zapisad, ż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 taosze od piwa.
Reguły Reguły mogą byd wykorzystywane do zapisywania definicji np. Inny przykład: X jest ptakiem jeżeli: X jest zwierzęciem i X ma pióra X jest ojcem Y jeżeli: X jest mężczyzną i X jest rodzicem Y
Reguły W prologu każda reguła składa się z głowy i treści. fakt1 :- fakt2,fakt3,,fakt n. głowa Przykład treśd Treśd zawiera koniunkcję celów, które muszą byd spełnione, aby głowa była prawdziwa. lubi(ala,x):-lubi(x,ksiazka). lubi(tomek,x):-kobieta(x),lubi(x,ksiazka). siostra(x,y):-kobieta(x),rodzice(x,a,b), rodzice(y,a,b).
Reguły Jeżeli z regule występuje zmienna wówczas jeżeli jest ona ukonkretniona jakimś obiektem to jest ukonkretniona w całym swoim zakresie obowiązywania czyli od głowy do kropki na koocu 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ę uzgodnid cele: kobieta(ala),lubi(ala,ksiazka).
Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). lubi(ala,x):-lubi(x,ksiazka). Zapytanie:?- lubi(tomek,x). Wynik:?- lubi(tomek,x). X = ryby ; X = ala ; X = ksiazka.
Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,ksiazka). lubi(tomek,ksiazka). lubi(ala,x):-lubi(x,ksiazka). Zapytanie:?- lubi(ala,x). Wynik:?- lubi(ala,x). X = ksiazka ; X = ala ; X = tomek ; false.
Reguły Przykład lubi(tomek,ryby). lubi(tomek,ala). lubi(ala,x):-lubi(x,ksiazka). lubi(ala,ksiazka). lubi(tomek,ksiazka). Zapytanie:?- lubi(ala,x). Wynik:?- lubi(ala,x). X = ala ; X = tomek ; X = ksiazka.
Reguły Przykład Rozpatrzmy bazę danych: mezczyzna(tomek). mezczyzna(pawel). kobieta(alicja). kobieta(renata). rodzice(renata,alicja,pawel). rodzice(tomek,alicja,pawel). siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b).
Reguły Przykład Interesuje nas zapytanie: siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b).?- siostra(renata,tomek). Prolog przetwarza je następująco: 1. Zapytanie jest dopasowane do głowy reguły siostra czyli X=renata i Y=tomek (ukonkretnienie). Znacznik odpowiadający zapytaniu ustawiony jest na regule. Prolog próbuje spełnid kolejno trzy cele z treści reguły.
Reguły Przykład siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b). 2. Celem jest kobieta(renata). Cel nie zawodzi jeżeli istnieje odpowiedni fakt w bazie danych. W tej sytuacji Prolog oznacza odpowiednie miejsce w bazie i przechodzi do uzgadniania następnych celów. 3. Prolog szuka faktu rodzic(renata,a,b). Znaleziony zostaje fakt rodzice(renata,alicja,pawel).
Reguły Przykład siostra(x,y):- kobieta(x),rodzic(x,a,b),rodzic(y,a,b). Zmienne A i B zostają ukonkretnione: A=alicja, B=pawel. Prolog oznacza w bazie następującą pozycję i przechodzi do uzgadniania następnego celu. 4. Prolog szuka faktu rodzic(tomek,alicja,pawel). i znajduje odpowiedni fakt w bazie. Cel udało się uzgodnid. Prolog odpowiada YES (TRUE).?- siostra(renata,tomek). true.
Klauzule predykatu Predykat definiujemy jako zbiór faktów i reguł. Nazywamy je klauzulami predykatu.
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 całkowite. Przykłady atomów: Przykłady liczb: mama, brat, adam,?-, :-, Dom 10, 9.99, 6.01e-27, 13456 zmienne (przez _ oznaczamy zmienną anonimową).
Elementy składowe programu struktury czyli terminy złożone. Struktury pozwalają traktowad grupę powiązanych informacji jako całośd. 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łnid cel:?- X=Y Prolog stara się dopasowad 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 nie jest powiązana z żadnym termem 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 są sobie zawsze równe.?- 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ównywad liczby. Argumentami tych predykatów mogą byd liczby zapisane jako stałe, zmienne ukonkretnione liczbami całkowitymi lub bardziej złożone wyrażenia algebraiczne. Predykaty te mogą byd zapisane jako operatory infiksowe.
Arytmetyka Mamy do dyspozycji operatory pozwalające porównywad 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>=Y X jest mniejsze lub równe Y X jest większe lub równe Y
Arytmetyka Przykład?- 2=:=2. true.?- 2=:=3. false.?- 2=\=3. true.?- 2=<3. true.?- 2>3. false.?- 2<X. ERROR: </2: Arguments are not sufficiently instantiated
Arytmetyka Przykład Rozważmy następującą bazę danych: wiek(tomek,21). wiek(pawel,45). starszy(x,y):-wiek(x,a),wiek(y,b),a>b. Wówczas:?- wiek(tomek,x). X = 21.?- starszy(pawel,tomek). true.?- starszy(pawel,x). X = tomek ; false.
Arytmetyka Przykład Rozważmy następującą bazę danych: wiek(tomek,21). wiek(pawel,45). starszy(x,y):-wiek(x,a),wiek(y,b),a>=b. Wówczas:?- wiek(tomek,x). X = 21.?- starszy(pawel,tomek). true.?- starszy(pawel,x). X = tomek ; X = pawel
Arytmetyka Przykład Rozważmy następującą bazę danych: bok(k,2). pole(y,x):-bok(y,z),x is Z*Z. obwod(y,x):-bok(y,z),x is 4*Z. Wówczas:?- bok(x,y). X=k, Y=2.?- pole(k,x). X=4.?- obwod(k,x). X=8.
Arytmetyka To jakich operatorów możemy użyd po prawej stronie operatora is zależy od systemu. Wszystkie implementacje Prologu obsługują: X+Y suma X i Y X-Y różnica X i Y X*Y iloczyn X i Y X/Y iloraz X i Y X//Y całkowity iloraz X przez Y X mod Y reszta z dzielenia X przez Y
Listy Lista to uporządkowany ciąg elementów. Elementami listy mogą byd dowolne terminy: stałe, zmienne i struktury W Prologu listę zapisujemy następująco: Przykłady: [element1,element2,,elementn] [a,b,cd,df,p,w] [ala,ma,kota,[a,x],y] [ ] Lista pusta
Listy Każda lista składa się z: głowy (ang. head) pierwszy element listy, ogona (ang. tail) będącego zawsze listą. Przykłady: [a,b,cd,df,p,w] - głowa: [a], ogon: [b,cd,df,p,w] [ala,ma,kota,[a,x]] - głowa: [ala], ogon: [ma,kota,[a,x]] [ ] - głowa: [ ], ogon: [ ] Listę o głowie X i ogonie Y zapisujemy: [X Y]
Listy Przykład?- [a,b,c]=[a,b,c]. true.?- [a,b,c]=[x,b,c]. X = a.?- [a,b,c]=[x,b,y]. X = a, Y = c.?- [a,b,c]=[x Y]. X = a, Y = [b, c].?- [a,b,c]=[x _]. X = a.?- [a,b,c]=[x g,h]. false.
Listy i rekurencja Rozważmy listę: [audi,ford,fiat,renault,opel,chrysler,chevrolet] Załóżmy, że chcemy dowiedzied, się czy jakaś marka samochodu jest elementem powyższej listy. W Prologu zaczynamy sprawdzad 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.
Listy i rekurencja Rozważmy następującą definicję: nalezy(x,[x _]). nalezy(x,[_ Yogon]):-nalezy(X,Yogon). Wówczas:?- nalezy(a,[b,c,d]). false.?- nalezy(a,[a,c,d]). true ; false.?- nalezy(x,[a,c,d]). X = a.?- nalezy(x,[a,[a,v]]). X = a ; X = [a, v] ; false.
Listy i rekurencja cd Wówczas: nalezy(x,[x _]). nalezy(x,[_ Y]):-nalezy(X,Y).?- nalezy(x,[_ a,b,c]). true ; false.?- nalezy(x,[a _]). X = a ; true ; true ; true ; zapętlenie true ; true ; true
Listy i rekurencja Chcemy teraz zdefiniowad predykat: sklej(l,m,n) oznaczający, że lista N jest sklejeniem listy L i listy M. Rozważmy następującą definicję rekurencyjną: sklej([],x,x). sklej([x L1],L2,[X L3]):-sklej(L1,L2,L3).
Rekurencja Wówczas:?- sklej([a],[b],[c]). false.?- sklej([a],[b],[a,b]). true.?- sklej([a,b],[c,d],x). X = [a, b, c, d].?- sklej([a,b],x,[c,d]). false.?- sklej([a,b],x,[a,b,c,d]). X = [c, d].?- sklej([a,b],[a c],[a X]). X = [b,a c].?- sklej([a,b],[a c],[x Y]). X = [a] Y = [b,a c].