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 2019
wyślij wiadomość

    Strona główna
Komunikat prasowy
przedmiotu zamówienia
najkorzystniejszej oferty
Informacja prasowa
wyborze najkorzystniejszej
warunków zamówienia
istotnych warunków
sprawie powołania
Regulamin konkursu
udzielenie zamówienia
przetargu nieograniczonego
zamówienia publicznego
Nazwa przedmiotu
Specyfikacja istotnych
modułu kształcenia
Rozporządzenie komisji
studia stacjonarne
wyborze oferty
Zapytanie ofertowe
Szkolny zestaw
Ochrony rodowiska
ramach projektu
prasowy posiedzenie
trybie przetargu
obwodowych komisji
zagospodarowania przestrzennego
komisji wyborczych
komisji wyborczej
Program konferencji
Wymagania edukacyjne
Lista kandydatów
szkoły podstawowej
która odbyła
Województwa ląskiego
Decyzja komisji
przedmiotu modułu
poszczególne oceny
Sylabus przedmiotu
szkół podstawowych
semestr letni
Postanowienia ogólne
przedsi biorców
produktu leczniczego
Karta przedmiotu
Scenariusz lekcji
Lista uczestników
Program nauczania
Projekt współfinansowany
Informacje ogólne
biblioteka wojewódzka
semestr zimowy