Systemy ekspertowe na przykładzie implementacji w języku Prolog
SWI Prolog
Tak jak w trakcie poprzednich zajęć będziemy pracować w środowisku SWI-Prolog.
Jeżeli nie jest on zainstalowany, proszę pobrać plik programu.
W razie problemów można poszukać działu "Download" na stronie programu SWI-Prolog
Pisanie programu w Prologu (przypomnienie)
Przykład programu zapisanego w Prologu:
lubi(jan, tatry).
lubi(jan, beskidy).
lubi(jerzy, beskidy).
lubi(jerzy, bieszczady).
lubi(józef, sudety).
lubi(justyna, gświętokrzyskie).
bratniadusza(X, Y) :- lubi(X, S), lubi(Y, S), X \= Y.
Program składa się z
- szeregu klauzul (ang. clause), wyróżniamy:
- fakty (klauzule proste)
- reguły (klauzule złożone)
- oraz celu (ang. goal)
Uruchamianie programu
W celu uruchomienia programu należy załadować plik z kodem (rozszerzenie *.pl) w języku Prolog.
Możemy w tym celu wykorzystać polecenie:
- menu File->Consult… u góry ekranu (a następnie wybieramy plik z katalogu)
- ręcznie w konsoli wpisujemy predykat consult/1 (skrót [nazwa].)
Operację tę należy powtarzać po każdej modyfikacji kodu.
Notacja list
Lista to uporządkowany zbiór elementów. Elementem może być dowolna struktura danych w Prologu.
Listę zapisujemy:
[a,b,c]
[2,4,6,ala,ma,kota]
[]
Każda lista składa się z:
- głowy (ang. head), która jest zawsze 1. elementem listy, oraz
- ogona (ang. tail), który jest zawsze listą
Listę od ogona rozdzielamy operatorem | (pionowa kreska), np.:
?- [X|Y]=[a,b,c,d].
X = a
Y = [b, c, d] ;
Dekompozycja i strukturalizacja list jest realizowana głównie przez mechanizm unifikacji, a co za tym idzie w.w. notacja jest jej podstawą. Na przykład:
?- [X,Y|Z]=[a,b,c,d].
X = a
Y = b
Z = [c, d] ;
?- [X,Y,a]=[Z,b,Z].
X = a
Y = b
Z = a ;
Przynależność do listy
nalezy(X,[X|_]).
nalezy(X,[_|Yogon]) :-
nalezy(X,Yogon).
Liczenie elementów
dlugosc([],0).
dlugosc([_|Ogon],Dlug) :-
dlugosc(Ogon,X),
Dlug is X+1.
ĆWICZENIA
Ćwiczenie 1: Przynależność do listy
Dopisać predykat: nalezy() do przykładów operacji na listach i zapisać je w pliku listy.pl
Sprawdzić i umieć wytłumaczyć działanie poniższych:
?- nalezy(c,[a,b,c,d]).
?- nalezy(x,[a,b,c,d]).
?- nalezy(X,[a,b,c,d]).
?- nalezy(x,a).
?- nalezy(X,a).
Ćwiczenie 2: Liczenie elementów
Dopisać predykat: dlugosc() do pliku listy.pl
Sprawdzić i umieć wytłumaczyć działanie poniższych:
?- dlugosc([a,b,c],X).
Ćwiczenie 3: Definiowanie własnych operatorów w języku Prolog
- Proszę przeczytać pomoc SWI-Prolog odnośnie polenienia op .
po wpisaniu w powłokę:
?- help(op).
Zaproponuj zapisanie operatora lubi, 'jest bratnia dusza'
Ćwiczenie 4: Zapisanie przykładu lubi góry za pomocą zdefiniowanych operatorów
Zapisz za pomocą zdefiniowanego operatora lubi fakty z przykładu programu w Prologu Jan lubi Tatry.
Ćwiczenie 5: Definiowanie reguł przy użyciu własnych operatorów
Zdefiniuj regułę 'jest bratnia dusza' analogiczną do reguły bratniadusza(X,Y) z przykładu.
Co to jest System ekspertowy?
http://pl.wikipedia.org/wiki/System_ekspertowy
krótka historia systemów ekspertowych: http://www.aitech.pl/index.php?option=com_content&task=view&id=182&Itemid=142
Przykładowa prosta implementacja systemu eksperckiego
Proszę pobrać plik ekspert.pl. (tłumaczone źródło: Art of Prolog)