System ekspertowy JESS 1. Informacje wst epne System ekspertowy Jess jest w ca lości napisany w j ezyku Java. Jest to tzw. business rules engine, czyli biznesowy silnik regu l. Inaczej, jest to oprogramowanie, które pozwala waczyć do systemu dowolne regu ly biznesowe do bazy wiedzy systemu, a nast epnie przeprowadzić wnioskowanie dla podanych aktualnych danych. Jest to system szkieletowy, który umożliwia budowanie dowolnych systemów ekspertowych, w tym nawet bardzo z lożonych. System Jess w wersji 7.0 jest kompatybilny ze wszystkimi wersjami Javy, zaczynajac od JDK 1.4, aż do wersji JDK 1.6. Do używania zintegrowanego środowiska programistycznego, nazwanego w tym przypadku JessDE, wymaga Eclipse SDK. Standardowo jest on dostarczany na platform e Eclipse. Sam j ezyk Jess bardzo przypomina postać j ezyka Lisp. Stad Jess może być używany jako samodzielny program. Np. napisane C:\Jess70p1>jess.bat uzyskuje si e znak zach ety Jess> Jess> (+ 2 3) 5 Istnieje też możliwość dost epu do funkcji Jessowych, co gwarantuje klasa jess.rete. Każdy obiekt jess.rete posiada swoja w lasn a przestrzeń pami eci roboczej, agend e, regu ly. Aby wkomponować Jessa w aplikacj e javowa wystarczy stworzyć jeden lub wi ecej wspomnianych powyżej obiektów i w laściwie nimi operować. Ilustruje to poniższy przyk lad: import jess.*; public class ExSquare { 1
} public static void main(string[] unused) { try { Rete r = new Rete(); r.eval( (deffunction square (?n) (return (*?n?n))) ); Value v = r.eval( (square 3) ); System.out.println(v.intValue(r.getGlobalContext())); } catch (JessException ex) { System.err.println(ex); } } Po uruchomieniu powyższego programu otrzymuje si e: C:\ > java ExSquare 9 2. Podstawy programowania w j ezyku Jess Symbole sa sednem koncepcji j ezyka Jess. Symbole moga zawierać wszystkie litery, cyfry, wszystkie znaki ASCII. Oprócz tego w symbolach sa rozróżnialne duże i ma le litery. Zaawansowane symbole u?ywaja zarówno liter, jak i cyfr. Lańcuchy znaków sa oznaczane przez podwójny cudzys lów. Symbol backslash (\) umożliwia zapisanie znaku cudzys lowia wewnatrz konstruowanego lańcucha. W lańcuchach nie ma znaków ucieczki, jak ma to miejsce w Javie. Ucieczk e uzyskuje si e przechodzac do nowej linii. Fundamentalnym elementem sk ladni j ezyka Jess jest lista. Lista zawsze zawiera nawiasy okrag le - lewy i prawy. Przyk lady listy sa zawarte poniżej: (+ 3 4) Komentarze zaczynaja si e od znaku średnika (;) i kończa si e wraz z końcem linii. Oprócz tego można stosować komentarze blokowe z j ezyka C. Wywo lania funkcji w j ezyku Jess sa prostymi listami, np. 2
Jess> (+ (+ 2 3) (* 3 3)) 14 Zmienne w j ezyku Jess sa identyfikatorami poprzedzonymi znakiem zapytania. Znak zapytania jest cz eści a nazwy zmiennej. Nazwa zmiennej może być dowolna kombinacja liter, cyfr, myślników itp. Na przyk lad Jess> (bind?x wartosc ) wartość Jess>?x wartość 3. Tworzenie w lasnych regu l W j ezyku Jess można tworzyć regu ly przypominajace dzia lanie if then. Przyk ladowa bardzo prosta regu la w tym j ezyku ma postać: Jess> (defrule powitanie-malucha Pozdrowienia dla dzieciaczków! (osoba {wiek < 3}) (printout t witaj maluszku crlf)) Powyższa regu la sk lada si e z dwóch cz eści, oddzielonych symbolem, który można odczytać jako then. Pierwza sk ladow a jest model sprawdzajacy, czy osoba jest poniżej 3 lat. Druga cz eści a jest odwo lanie do funkcji println. Obiekt osoba może być zdefiniowany nast epuj aco: Jess> (deftemplate osoba (slot Imie) (slot Nazwisko) (slot wiek) Napisany powyżej skrypt b edzie aktywowany, gdy ukaże obiekt osoba w obszarze pami eci roboczej. Przyk lad ilustrujacy dzia lanie regu l w Jess. Jess> (deftemplate osoba (slot Imie) (slot Nazwisko) (slot Wiek)) 3
TRUE Jess> (watch all) TRUE Jess> (reset) = Focus MAIN = f-0 (MAIN::initial-fact) TRUE Jess> (defrule witaj-malutki Specjalne pozdrowienie dla maluchow (osoba {wiek < 3} ) (printout t witam malutki! crlf)) MAIN::witaj-malutki: +1+1+1+t TRUE Jess> (assert (osoba (wiek 2))) = f-1 (MAIN::osoba (Imie nil) (Nazwisko nill) (wiek 2)) = Activation: MAIN::witaj-malutki : f-1 <Fact-1> Rozpocz ecie wykonywania skryptu rozpoczyna si e od komendy reset. Nast epnie, gdy zostanie dodana odpowiednia regu la (tutaj sprawdzanie wieku), system wyświetla informacj e o poprawnym wprowadzeniu definicji w postaci +1+1+t. Na końcu dodaje si e dane wg modelu osoba. Teraz można uruchomić t e aplikacj e, co nast epuje dzi eki poleceniu run. Zapisuje si e to w postaci: Jess> (run) FIRE 1 MAIN::witaj-malutki f-1 Witam malutki! <== Focus MAIN 1 4. Przebieg ćwiczenia 4
1) Uruchomić Jess. Sprawdzić jak dzia laj a listy z dzia laniami dodawania, mnożenia itp. Napisać komentarze, identyfikatory zmiennych itp. 2) Napisać w lasne regu ly oraz definicje szablonu. 3) Uruchomić przyk lad zamieszczony powyżej. Po jego uruchomieniu zmienić operator, np. Jess> (defrule nastolatek) (osoba {wiek > 12 && wiek < 20} (Imie?imie)) (print t?imie ma?wiek lat. crlf)) 4) Uruchomić przyk lad, który pozwala sprawdzić, kto jest kim w rodzinie. Jess> (reset) Jess>(clear) Jess> (deftemplate osoba (slot imie) (slot matka) (slot ojciec)) (slot plec) Jess>(assert (osoba (imie ania) (plec kobieta) (matka ewa) (ojciec adam))) (assert (osoba (imie kasia) (plec kobieta) (matka ania) (ojciec krzysztof))) (assert (osoba (imie pawel) (plec mezczyzna) (matka ewa) (ojciec adam))) (assert (osoba (imie piotr) (plec mezczyzna) (matka kasia) (ojciec pawel))) Jess>(defrule syn (or (osoba (imie?x) (plec mezczyzna) (ojciec?y)) (osoba (imie?x) (plec mezczyzna) (matka?y))) (printout t?x jest synem?y crlf)) Jess>(defrule corka (or (osoba (imie?x) (plec kobieta) (ojciec?y)) (osoba (imie?x) (plec kobieta) (matka?y))) 5
(printout t?x jest synem?y crlf)) Jess>(defrule babcia (and (osoba (imie?x) (matka?y)) (or (osoba (imie?z) (matka?x)) (osoba (imie?z) (ojciec?x))) (printout t?y jest babcia?z crlf)) Jess>(run) 6