Informatyka - Uniwersytet Śląski w Katowicach - Kierunek zamawiany

PROLOG język programowania dla Sztucznej Inteligencji

Agnieszka Nowak-Brzezińska 27 kwietnia 2010
Programowanie 1 komentarz

Prolog – Programming In Logic

Dzięki zautomatyzowaniu procesu dowodzenia twierdzeń logicznych, a szczególnie dzięki opracowaniu przez Robinsona w 1965 roku tzw. zasady rezolucji – stało się możliwe automatyczne wywnioskowania rozwiązania na podstawie zbioru formuł logicznych opisujących problem. Język PROLOG należy do klasy języków deklaratywnych, gdzie opisuje się rozwiązywany problem, a nie tak jak przy językach imperatywnych (proceduralnych) – w których wskazuje się algorytm rozwiązania problemu. Programowanie w prologu składa się z:

  1. deklarowania Faktów dotyczących obiektów i związkow między nimi.
  2. Definiowania Reguł dotyczyczących obiektów i związków między nimi.
  3. Zadawania pytań o obiekty i związki między nimi.

Budowanie baz wiedzy w Prologu

Jak wiadomo baza wiedzy to zazwyczaj zbiór złożony z faktów i reguł.

Fakty proste

Przykładem prostego faktu odzwierciedlającego zdanie: Jest słonecznie. jest predykat zapiany następująco:sunny. W języku Prolog spytamy o prawdziwość tego stwierdzenie następująco:

?- sunny

A więc używamy przed nazwą predykatu znaków ?-, które oznaczają pytanie o prawdziwość danego faktu. Oczywiście stwierdzenia (fakty) nie muszą być jedynie funktorami jednoargumentowymi, ale mogą być również wieloargumnetowe. Ogólna składnia predykatu wygląda następująco:

relation(< argument1 >,< argument2 >,....,< argumentN >).

,gdzie relation oznacza po prostu nazwę funkcji pełnionej przez dany predykat, zaś parametry:

< argument1 >,< argument2 >,....,< argumentN > oznaczają

ko- lejne argumenty tej funkcji. I tak, w języku Prolog, stwierdzenie:

likes(john,mary).

oznacza, że John lubi mary.

Zadawanie pytań i interpretacja odopowiedzi na pytania ?

Kiedy już wiemy jak zapisywać stwierdzenia (fakty) zawsze możemy pytać o ich prawdziwość. Jeśli przykładowy program wygląda następująco:

eats(fred,oranges). /* Fred je pomarańcze */ 
eats(tony,apple). /* Tony je jabłko */ 
eats(john,apple). /* John je jabłko */

To jeśli teraz zapytamy:

?- eats(fred,oranges).

/* czy to pasuje do zapisów w bazie wiedzy w Prologu?.*/
Widać, iż tak, więc Prolog odpowie:

yes

/* yes, ponieważ dokładnie pokrywa się to z 1 zapisem w bazie. */
Podobnie zadając pytanie:

?- eats(john,apple).

Uzyskamy odpowiedź:

yes

Zaś jeśli spytamy:

?- eats(mike,apple).

PROLOG odpowie:no ponieważ nie ma żadnej relacji między mike i apple, gdyż w naszej bazie nie ma wcale informacji o mike.

Zmienne w Prologu

W prologu nie musimy zadawać konretnych pytań. Możemy na przykład zawsze zapytać w naszym przykładowym zbiorze Kto je jabłko? albo Co je Fred ? Jeśli więc dla naszego przykładowego programu:

eats(fred,oranges).

Jeśli zapytamy:

?- eats(fred,what).

Prolog odpowie ku naszemu zaskoczeniu:

no

Powodem tego jest fakt, że Prolog będzie szukał dopasowania w swojej bazie fred i what. Jeśli natomiast chcieliśmy użyć zmiennej w Prologu, to są one tutaj wyróżnione przez fakt, że zaczynają się zawsze od wielkiej litery.Przykładowo:

X

/* pojedyncza litera */

VaRiAbLe

/* wyraz zaczynający się od wielkiej litery */

Two˙words

/* dwa wyrazy oddzielone znakiem podkreślenia */

Zatem w naszym przypadku, gdy chcieliśmy spytać Co je Fred? powinniśmy użyć np składni:

?- eats(fred,What)

Wówczas Prolog odpowie:

What=oranges
yes

Podobnie możemy spytać: Kto je pomarańcze? zapisująco owo zapytanie tak:

?- eats(Who,oranges).

W tym wypadku, Prolog odpowie:

Who=fred
yes

Jeśli zaś spytamy:

?- eats(Who,apple).

Pierwszą odpowiedzią będzie:

[Who = tony]

ponieważ jest to pierwsze dopasowanie znalezione w bazie. Teraz Prolog będzie czekał aż wcisnieś jakiś znak. Jeśli wybierzesz znak

[enter]

Prolog będzie oczekiwał no nowe pytanie. Jeśli zaś użyjesz klawisza

[; ]

Prolog będzie dalej przeszukiwał swoją bazę w celu znalezienia kolejnych dopasowań (podstawień za zmienną).

Who

W ten sposób Prolog znajdzie kolejną odpowiedź

[Who = john]

Jeśli teraz ponownie wciśniemy znak:

[; ]

prolog ponownie będzie chciał szukać kolejnych dopasowań. Wynikiem jednak będzie odpowiedź:

[no]

ponieważ faktycznie w bazie nie ma więcej dopasowań (unifikacji) dla tego stwierdzenia.

?- eats(Who,apple).
Who=tony ;
Who=john ; 
no

Reguły w Prologu

Rozważmy zdanie: Wszystki jabłka to owoce. Takie zdanie możemy wyrazić również w Prologu, następująco:

fruit(X) :- apple(X).

Zdanie to można odczytać jako:

X jest owocem jeśli X jest jabłkiem

Teraz rozważmy zdanie (fakt):

Gloster jest typem jabłka.

W Prologu zapiszemy to tak:

fruit(X) :- apple(X).
apple(gloster).

Jeśli teraz spytamy w Prologu:

?- fruit(gloster).

Uzyksamy odpowiedź:

yes

Prolog użyje zdefiniowanej przez nas reguły, zgodnie z którą

X jest owocem, jeśli jest jabłkiem.

Zatem dzięki stwierdzeniu: apple(gloster), Prolog wygeneruje nowy fakt:

fruit(gloster)

W regułach również możemy stosować zmienne. Zatem możemy spytać: Jaki X jest owocem?:

?- fruit(X)

na co Prolog powinien odpowiedzieć:

X=gloster

Oczywiście reguły mogą mieć w części przesłankowej (warunkowej) więcej elementów połączonych operatorem logicznym and lub or. Czasami bowiem, do tego samego stwierdzenia możemy dojść różnymi drogami. Przykładowo, zdanie: Coś jest smaczne jeśli jest owocem i ma słodki smak lub jeśli zawiera cukier. To zdanie można następująco zapisać w Prologu:

tasty(X) :-

/* coś jest smaczne jeśli */

fruit(X),

/* jest owocem i */

is"˙sweet(X).

/* jest słodkie */

tasty(X) :-

/* albo coś jest smaczne jeśli */

has"˙sugar(X)

/* zawiera cukier */

Zatem w takim programie, są 2 drogi, aby dowiedzieć, się czy coś jest smaczne czy nie. Jeśli pierwsza reguła nie pozwoli wykazać prawdziwości tego stwierdzenia, to wówczas Prolog będzie probował wykazać prawdziwość drugiej reguły. Należy pamiętać, iż tak samo nazwane zmienne w regule są traktowane jako ta sama zmienna. Zatem takie same zmienne w różnych regułach są traktowane jako różne zmienne i są w tym względzie niezależne. Przykładowo w programie:

tasty(X) :-fruit(X), is˙sweet(X).
tasty(X) :-has˙sugar(X).

Prolog będzie traktował nasze zapisy jako:

tasty(X1) :-fruit(X1),is˙sweet(X1).
tasty(X2) :-has˙sugar(X2).

Środowisko do programowania w Prolog’u

Prolog jako język programowania dla sztucznej inteligencji został stworzony w 1971 roku przez Alaina Colmeraurera i Phillipe’a Roussela na Uniwersytecie w Marsylii, podczas pracy nad zastosowaniem logiki predykatow (klauzul Horna) do NLP.

Implementacje – Narzędzia darmowe i komercyjne

Narzędzia darmowe Narzędzia komercyjne Ciao Prolog ALS Prolog ECLIPSE Amzi! Prolog GNU Prolog IF Prolog SWI-Prolog LPA Prolog YAP Prolog MINERVA

Czym jest GNU Prolog ?

GNU Prolog (gprolog), to otwarte oprogramowanie pod GNU General Public License. Źródło: [ http://gnu-prolog.inria.fr]. Jest to narzędzie w pełni darmowe, autorem jest Daniel Diaz, napisane w języku C. Prócz wbudowanego kompilatora, zawiera także interpreter typu (top-level) i debugger.

Rysunek 1: Konsola GNU Prolog

Czym jest SWI Prolog ?

SWI-Prolog to również samodzielne darmowe środowisko do programowania w Prologu. Źródło: [ http://www.swi-prolog.org]. Zawiera edytor i program uruchomieniowy. Wraz z narzędziem XPCE pozwala na edycje programów w Prologu nie w notatniku, a właśnie w edytorze XPCE, pozwalającym m.in. na kolorowanie składni programu.

Rysunek 2: Konsola SWI Prolog

Prolog w przykładach

Przykład nr 1: wprowadzenie do Prologu

Przykład nr 1:

Lubi(Jarek, ryby) 
Lubi(Jarek, Maria)
Lubi(Maria, ksiazka)
Lubi(Jan, ksiazka) 
Lubi(Jan,Francja)

Teraz gdybyśmy chcieli wywnioskować z tych faktów czy Jarek lubi pieniądze:

?- lubi(Jarek, pieniadze)

Odp Prologu:

no
?- lubi(Maria, Jarek)

Odp Prologu:

no ?- lubi(Jarek, Maria)

Odp Prologu:

yes

Przykład :

Lubi(Jan, kwiaty)
Lubi(Jan, Maria)
Lubi(Pawel, Maria)

Teraz gdybyśmy chcieli wywnioskować z tych faktów co lubi Jan? PYTANIE:

?- lubi(Jan, X)

Odp Prologu:

X= kwiaty

(zmienna X jest odtąd UKONKRETNIONA !) PYTANIE:

?- lubi(x, Maria)

Odp Prologu:

X= Jan; X=Pawel; No;

co oznacza ze nie ma już więcej odpowiedzi możliwych ! KONIUNKCJE: Przykład :

Lubi(Maria, czekolada) 
Lubi(Maria, wino)
Lubi(Jan, wino) 
Lubi(Jan, Maria)

Wówczas pytanie:

?- lubi(Jan, Maria), lubi(Maria, Jan)

Odp Prologu:

no;

Pytanie:

?- lubi(Maria,X),lubi(Jan,X)

czyli czy istnieje coś co jednocześnie lubią i Maria i Jan Odp Prologu:

X=wino;
no;

REGUŁY:
Jan lubi każdego kto lubi wino:

Lubi(Jan,X) :-Lubi (X,wino).

Jan lubi kobiety, które lubią wino:

Lubi(Jan,X) :-Kobieta(X),Lubi (X,wino).

Zgodnie z metodą założeniową dowód rozpoczynać powinno wypisanie założeń, którymi są przesłanki dowodzonego schematu i poprzednik jej wniosku. Komentarze umieszczone na boku mówią o tym, z których wierszy wcześniejszych kolejne wiersze są otrzymane przy pomocy reguły odrywania. Dowód jest zakończony, gdyż otrzymaliśmy następnik wniosku.

Literatura

  1. Pawlak Z., (1983) Systemy informacyjne – podstawy teoretyczne, WNT, W-wa.
  2. Pogorzelski W.A., (1973), Klasyczny rachunek zdan. Zarys teorii, PWN, Warszawa, Poland
  3. Cholewa W., Pedrycz W., (1987), Systemy doradcze, skrypt Politechniki Śląskiej nr 1447, Gliwice, Poland
  4. Cichosz P.,(2001), Systemy uczące się, WNT,Warszawa, Poland
  5. Grzegorczyk A., (1969), Zarys logiki matematycznej, PWN, Warszawa, Poland
  6. Paprzycka K., Samouczek logiki zdań i logiki kwantyfikatorów – dostępny na stronie: http://www.filozofia.uw.edu.pl/kpaprzycka/Publ/xSamouczek.html
  7. Nilsson U., Małuszyński J.,(2000), Logic, programming and Prolog (2ED), http://www.ida.liu.se/~ulfni/lpp
  8. Flach P., (1994), University of Bristol, United Kingdom Simply Logical – Intelligent Reasoning by Example
Jeden komentarz do “PROLOG język programowania dla Sztucznej Inteligencji”
  1. Flakankslonee mówi:

    nalezy sprawdzic:)

Dodaj komentarz

(wymagane)

(wymagane)