Zajęcia 3

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)

© A. Czoska, M. Komosiński, B. Kroll, A. Kupś, A. Mensfelt, B. Szopka