Strona główna

Laboratorium sztucznej inteligencji Laboratorium nr 1


Pobieranie 43.69 Kb.
Data18.06.2016
Rozmiar43.69 Kb.


Laboratorium sztucznej inteligencji

Laboratorium nr 1

Podstawy programowania w Prologu. Fakty, reguły, ukonkretnianie zmiennych, nawracanie.



opracowanie: mgr. inż. Magdalena Wilkołazka

  1. Czym jest język Prolog

Prolog1 (od francuskiego Programmation en Logique) - jeden z najpopularniejszych języków programowania logicznego. Prolog powstał jako język programowania służący do automatycznej analizy języków naturalnych, jest jednak językiem ogólnego zastosowania, szczególnie dobrze sprawdzającym się w programach związanych ze sztuczną inteligencją. Prolog w przeciwieństwie do większości popularnych języków jest językiem deklaratywnym.

Program w Prologu składa się z faktów oraz reguł wnioskowania. Aby go uruchomić, należy wprowadzić odpowiednie zapytanie. Prolog został stworzony w 1971 roku przez Alaina Colmeraurera i Phillipe'a Roussela. Prolog opiera się o rachunek predykatowy pierwszego rzędu, jednak ogranicza się tylko do klauzul Horna2. Istnieją jednak wbudowane predykaty wyższego rzędu.



Pierwsze uruchomienie


Rysunek 1 Ekran startowy SWI-Prolog

Po uruchomieniu SWI-Prolog użytkownik może zobaczyć tekst na powitanie oraz gotową konsolę do pracy. W tejże konsoli użytkownik może zadawać pytania sformułowane w składni Prolog'a. Każde pytanie należy zakończyć kropką oraz nacisnąć ENTER.


  1. Podstawy teoretyczne

    1. Atomy, zmienne, liczby

Atomy są ciągami znaków złożonymi z dużych, małych liter, cyfr, znaku podkreślenia i zaczynającymi się wyłącznie od małej litery. Na przykład: jan, kwiat_3, pies3, litera_x, zmienna, ojciec. Są to też sekwencje znaków objęte pojedynczymi apostrofami np: 'Vincent', 'Przygoda Tomka', '$^^&*@# *' i ' '. Znak zawarty między apostrofami jest nazwą atomu, można też używać wtedy spacji. Atom to też ciąg specjalnych znaków np: @= , ====> i ; oraz :-.

Zmienne są ciągami znaków zawierających duże litery, małe litery, cyfry i podkreślenia, które zaczynają się zawsze dużą literą bądź znakiem podkreślenia. Na przykład: X, Y, Zmienna, _coś, X_1, Lista, Lista23, Wyjście. Zmienna _ jest zmienną specjalną nazywaną zmienną anonimową. Używana jest wtedy, gdy nie zależy nam na wyświetleniu jej wartości (gdy informacja zawarta w niej nie jest istotna), ale potrzebna jest ona w regule, aby reguła miała tyle zmiennych ile potrzeba.

Liczby – liczby rzeczywiste nie są tak istotne w programowaniu w prologu. Natomiast liczby całkowite są użyteczne w operacjach na listach, w liczeniu ilości ich elementów. Przykłady: 0,-4,234, itd.


    1. Reguły i fakty

Prolog jest językiem, w którym, to co jest wiadome zapisuje się w postaci faktów i reguł. Można też używać rekurencji. Prolog swoje działanie opiera na systemie wnioskowania na podstawie zapisanych w bazie faktów i reguł.

Opisując fakty w prologu przyjmuje się następujący schemat opisu informacji :



( , ) – w efekcie powinna powstać konstrukcja zdaniowa: W języku prologu fakty i reguły określone są jako złożone termy, składające się z funktora oraz argumentów. np:

lubi(jan, kwiaty) - Jan lubi kwiaty (funktorem jest term lubi, a argumentem termy: jan i kwiaty)

kolor(fiat, czerwony) - Fiat ma kolor czerwony

mezczyzna(Jan) - Jan jest mężczyzną.

!! Funktorem nie może być zmienna.

Zapytania które można tu zadać mogą być następujące:

- Czy prawdą jest, ze Jan lubi kwiaty?



?-lubi(jan, kwiaty).

- Co lubi Jan?



?-lubi(jan,X).

- Kto jest mężczyzną?



?-mezczyzna(X). itd

Reguły składają się z faktów, które muszą być spełnione, aby reguła była prawdziwa. Ich struktura wygląda następująco:



nazwa_reguły(zmienna1,zmienna2):-fakt1, fakt2, wyrażenie arytmetyczne...itd.

Każda reguła musi kończyć się kropką. Zmienne w definicji reguły są podobne do zmiennych w definicji funkcji. Regułę można odczytać następująco:



Zmienna 1 nazwa reguły zmienna2 jest spełniona jeśli spełnione są wszystkie fakty w ciele reguły np:

ojciec(X,Y):-mezczyzna(X), rodzice(X,_,Y) czyli

X jest ojcem Y jeśli X jest mężczyzną i X z jakąś kobietą są rodzicami Y.

Oczywiście fakty mezczyzna i rodzice muszą być wcześniej zdefiniowane. W ciele reguły mogą też być odwołania do innych zadeklarowanych reguł.



Jeśli trzeba w regule fakty połączyć spójnikiem „lub” to zamiast przecinka należy użyć średnika

Do tej reguły można zadać takie pytania:

- Czyim ojcem jest Karol?

?-ojciec(karol,X).

- Kto jest ojcem Michala:



?-ojciec(X,michal).

- Czy Karol jest ojcem Michala?



?-ojciec(karol, michal).

Przykład 1:

Podane są fakty:



lubi(jan, koty).

lubi(jan,psy).

maja(koty, miekkie_futro).

maja(psy, super_wech).

odgłos(psy,szczekaja).

odgłos(koty,miaucza).

Jest pytanie na przykład dlaczego jan lubi psy? Zapisać należy regułę, która będzie łączyła fakt lubienia i fakt posiadania przez psy określonej cechy.



dlaczego(X,Y, Z):-lubi(X,Y), maja(Y,Z).

?-dlaczego(jan, psy, Z), wtedy za X jest wstawiana zmienna jan, za Y zmienna psy i prolog odszukuje wartość zmiennej Z, która odpowie na to pyt anie.

Kolejne pytanie: Kto za co lubi psy?



?-dlaczego(X,psy,Z). Wtedy prolog wyświetli dwie zmienne: X i Z., jeżeli istnieje więcej wpisów odnośnie lubienia psów lub posiadania innych cech to wtedy prolog tworzy iloczyn kartezjański obu zbiorów.

Dodając wpisy:



lubi(maria,psy)

maja(psy, czujnosc)

w odpowiedzi na pytanie: „Kto za co lubi psy?” uzyskane będą cztery odpowiedzi:



?- dlaczego(X,psy,Z).

X = jan,

X = jan,

X = maria,

X = maria,

Z = czujnosc ;

Z = super_wech ;

Z = czujnosc ;

Z = super_wech ;

Predykaty

Prolog ma także wiele wbudowanych predykatów tzn. poleceń, których nie trzeba określać w postaci reguł. Należą tu między innymi:

listing – wyświetla zawartość pliku .pl

is(S, X wyraż. arytm. Y) oznacza S jest wynikiem wyrażenia arytmetycznego zmiennych X i Y

np:


is(S, 1-3) 2\=3

?-S=-2 ?-False



Przykład 2. Program Hello World
Aby wyświetlić w konsoli napis Hello World wystarczy wykorzystać jeden z wbudowanych predykatów write/1. Jedynka po slashu oznacza liczbę argumentów tegoż predykatu. Tak więc predykat write będzie posiadał jeden argument, tekst. (Jest także wersja dwuargumentowa3). Tak więc zadajemy pytanie: write('Hello World'). W wyniku, czego otrzymamy odpowiedź:

?- write('Hello World').

Hello World

true.


W drugiej linii otrzymaliśmy efekt działania predykatu, natomiast w ostatniej informację na temat poprawności użycia.

  1. Praca z programem Swi-prolog:

Po zainstalowaniu Swi-prologa w jego folderze instalacyjnym C:\Program Files\pl należy znaleźć folder demo, w którym znajduje się plik likes.pl. Można go otworzyć klikając na niego dwa razy lub też w prologu wybierając z menu File polecenie consult i następnie wybierając plik lub wpisując następujące polecenie:

?- [‘ścieżka do pliku lub nazwa pliku’].

Działanie opisane poniżej testujemy wybierająć plik demo/likes.pl poprzez polecenie:

[swi(‘demo/likes.pl’)].

Po tym jak zostanie załadowany program i wyświetli się informacja:



% c:/Program Files/pl/demo/likes.pl compiled 0.00 sec, 10,632 bytes

można zadawać zapytania dotyczące bazy wiedzy zawartej w tym pliku. Można to zrobić wpisując nazwę reguły lub faktu, a zamiast konkretnej wartości w nawiasach wpisując nazwę zmiennej np:

- jest w bazie fakt: likes(sam,dahl)., więc można zadać pytanie:

?-likes(sam,X). czyli Co lubi Sam?

Program odpowie:

X=dahl czyli poda wartość zmiennej X.

Jeżeli odpowiedź na to pytanie jest więcej niż jedna to można po linijce z pierwszym rozwiązaniem wpisać średnik i nacisnąć enter. Jeżeli prolog nie znajdzie żadnego rozwiązania wyświetli No.

można też zadawać pytania logiczne: Czy prawdą jest że sam lubi tandoori?

?-likes(sam, tandoori)., wyświetla się wtedy komunikat True



Prolog przeszukując bazę wiedzy dopasowuje nazwę faktu z reguły, z której korzysta się w zapytaniu i dopasowuje sobie ten fakt do faktu w bazie, jeśli dopasuje przechodzi do następnego faktu w regule i ponownie przeszukuje bazę czyli wraca do punktu wyjścia. Jeśli spełnione zostaną wszystkie fakty z reguły i naciśnięty zostanie średnik prolog powraca do miejsca znajdującego się za ostatnim znalezionym faktem i próbuje dopasować kolejne fakty do ostatniego w regule. Gdy już wyczerpie te odpowiedzi wraca do przedostatniego faktu i szuka rozwiązań dla dwóch ostatnich faktów. itd. W ten sposób szuka kolejnych rozwiązań zadanego pytania. Taki mechanizm nazywa się w prologu nawracaniem. Oto przykład przeszukiwania bazy wiedzy z przykładu z części teoretycznej:

[trace] 28 ?- dlaczego(X,psy,Z).

Call: (6) dlaczego(_G854, psy, _G856) ? creep

Call: (7) lubi(_G854, psy) ? creep

Exit: (7) lubi(jan, psy) ? creep

Call: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, czujnosc) ? creep

Exit: (6) dlaczego(jan, psy, czujnosc) ? creep

X = jan,

Z = czujnosc ;

Redo: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, super_wech) ? creep

Exit: (6) dlaczego(jan, psy, super_wech) ? creep

X = jan,

Z = super_wech ;

Redo: (7) lubi(_G854, psy) ? creep

Exit: (7) lubi(maria, psy) ? creep

Call: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, czujnosc) ? creep

Exit: (6) dlaczego(maria, psy, czujnosc) ? creep

X = maria,

Z = czujnosc ;

Redo: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, super_wech) ? creep

Exit: (6) dlaczego(maria, psy, super_wech) ? creep

X = maria,

Z = super_wech.Ȉ

[trace] 28 ?- dlaczego(X,psy,Z).

Call: (6) dlaczego(_G854, psy, _G856) ? creep

Call: (7) lubi(_G854, psy) ? creep

Exit: (7) lubi(jan, psy) ? creep

Call: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, czujnosc) ? creep

Exit: (6) dlaczego(jan, psy, czujnosc) ? creep

X = jan,

Z = czujnosc ;

Redo: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, super_wech) ? creep

Exit: (6) dlaczego(jan, psy, super_wech) ? creep

X = jan,

Z = super_wech ;

Redo: (7) lubi(_G854, psy) ? creep

Exit: (7) lubi(maria, psy) ? creep

Call: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, czujnosc) ? creep

Exit: (6) dlaczego(maria, psy, czujnosc) ? creep

X = maria,

Z = czujnosc ;

Redo: (7) maja(psy, _G856) ? creep

Exit: (7) maja(psy, super_wech) ? creep

Exit: (6) dlaczego(maria, psy, super_wech) ? creep

X = maria,

Z = super_wech.



Bazę wiedzy zawartą w pliku likes.pl, aby poznać nazwy reguł i faktów tam występujących, można zobaczyć otwierając plik w edytorze tekstowym lub wpisując listing. w prologu po skompilowaniu pliku.

Po każdym zapytaniu powinna być umieszczona kropka, gdy zostanie pominięta prolog wyświetli | na początku wiersza. Aby wyjść z tego trybu należy wpisać kropkę, wtedy zapytanie jest wykonywane.

Jeżeli plik nie chce się skompilować, lub jeśli prolog wyświetla nieprawidłową odpowiedź najpierw należy sprawdzić czy po wszystkich faktach i regułach są postawione kropki, czy informacje w faktach i regułach są zapisane małą literą (nawet imiona), dopiero wtedy można szukać błędu w rozumowaniu logicznym. Pomocnym poleceniem jest polecenie trace, które pozwala określić, gdzie może tkwić błąd. Wyłączenie polecenia trace następuje po wpisaniu nodebug i dwukrotnym wciśnięciu enter.

Zadanie ćwiczeniowe:

Wprowadzić do pliku: fakty i reguły zawarte w części teoretycznej i przećwiczyć pytania, które tam się znajdują. Zaobserwować, jakie odpowiedzi i dlaczego, się pokazują.


  1. Realizacja ćwiczenia:

Laboratorium można wykonywać w parach. Zaliczenie danego laboratorium odbywa się na podstawie oddanego sprawozdania z wykonanych zadań. Sprawozdanie zawiera dane osób, które je wykonywały oraz rozwiazania problemów zadanych przez prowadzącą ćwiczenia.
Zad.1. Zapoznaj się z programem SWI-Prolog. Oprogramowanie jest zainstalowane na PUBLIC. Można także pobrać wersję portable. Zapoznaj się z:

a) Podręcznik: http://www.swi-prolog.org/download/stable/doc/SWI-Prolog-6.6.4.pdf

b) Strona domowa SWI-Prolog: http://www.swi-prolog.org/

c) SWI-Portable Portable: http://portableapps.com/apps/development/swi-prolog_portable

d)* SWI-Prolog Online: http://swish.swi-prolog.org/

Zad.2. Stwórz program, który sprawdzi czy p jest konsekwencją zbioru klauzul:

p<-q


q

Sprawdź przy wykorzystaniu SWI-Prolog czy p jest konsekwencją zbioru powyższych klauzul.


Zad.3 Zaprogramuj zbiór klauzul S={p ; q ; r ; w<-p,r ; v<-w,q,s ; s<-w}.

a) Czy klauzula v jest konsekwencją zbioru S?

b) Czy formuła jest konsekwencją? W jaki sposób użyć SWI-Prolog do odpowiedzi na to pytanie?

Zad.4. Wykorzystując zbiór klauzul S z poprzedniego zadania określ czy klauzula t będzie konsekwencją tegoż zbioru. Jaka będzie odpowiedź SWI-Prolog oraz co ona oznacza?
Zad.5. Czy możemy odpowiedzieć na pytanie z Tutorial'a nr 1 dotyczące Moniki i Magdy przy wykorzystaniu SWI-Prolog? Jeżeli tak to skonstruuj program. Uzasadnij odpowiedź.

4. Literatura.

http://cs.union.edu/~striegnk/courses/esslli04prolog/practical.day2.php?s=practical.day2.node5



http://www.ii.pwsz.bialapodlaska.pl/~lz/p_l_1.pdf

1 Źródło definicji: Wikipedia, http://pl.wikipedia.org/wiki/Prolog_(j%C4%99zyk_programowania) (Stan z dnia 04-03-2015)

2 Klauzula Horna - to klauzula, w której co najwyżej jeden element jest niezanegowany. Przykładami takich klauzul są {p,¬r,¬q} i {¬r,¬q}. Klauzule Horna zapisuje się zwykle w postaci implikacyjnej.  Źródło definicji: Wikipedia


3 link: http://www.swi-prolog.org/pldoc/doc_for?object=write/2 (Stan z dnia 04-03-2015)


©snauka.pl 2016
wyślij wiadomość