Programowanie w
JESS
Podstawy tworzenia systemów ekspertowych.
mgr inż. Marynowski Przemysław
pmarynow@agh.edu.pl , A2-53H.
1
JEES - pojęcie
JESS jest to system ekspertowy opracowany w języku Sun Java przez Ernest Friedman-
Hillat Sandia National Laboratories.
Pierwsza wersja JESS została stworzona w 1995 roku i rozwija się nieustannie.
Programowanie w tym języku również może być wsparte językiem Java.
Używany może być zarówno pod Windowsem, a także pod UNIXem. Kompatybilny
jest z wszystkimi wersjami Java.
JESS można wykorzystać do programowania systemów ekspertowych, których
zadaniem jest wierne naśladowanie ludzkiego eksperta.
JESS może również spełnić role języka ogólnego programowania. Przy wykorzystaniu
bibliotek Java może mieć bardzo szerokie zastosowanie.
2
System ekspertowy - pojęcie
System ekspertowy - jest to program lub zestaw programów komputerowych
wspomagający korzystanie z wiedzy i ułatwiający podejmowanie decyzji. Systemy
ekspertowe mogą wspomagać bądz zastępować ludzkich ekspertów w danej dziedzinie,
mogą dostarczać rad, zaleceń i diagnoz dotyczących problemów tej dziedziny co
zostało przedstawione na pierwszym wykładzie.
3
Z czego składa się system ekspertowy ?
1.Explanation facility wyjaśnia proces wnioskowania, który doprowadził do danej
konkluzji.
2.Knowledge acquisition facility dostarcza sposobów do pozyskania i
przechowywania wiedzy pozyskanej od eksperta w bazie wiedzy (knowledge base).
3.Knowledge base - przechowuje wiedzę w postaci reguł.
4.Working memory - baza faktów wykorzystywanych przez reguły.
5.Inference engine - decyduje które reguły, i w jakiej kolejności zostaną
uruchomione.
6.Agenda - lista reguł, których warunki spełnione są przez fakty znajdujące się w
pamięci roboczej (working memory)
7.Pattern matcher - porównuje reguły i fakty.
4
System ekspertowy
5
Fakty i reguły
Fakt: Stal jest stopem żelaza i węgla
Reguła: Jeśli w stali jest domieszka niklu to hartowanie jest ułatwione
Fakt: Adam jest studentem metalurgii
Reguła: Jeśli student jest studentem metalurgii to wie co to jest
hartowanie
6
Programowanie w JESS fakty i reguły
Fakt:
(assert (stal (stop zelazo-wegiel ))
Reguła:
(defrule regula1
(stal {domieszka-niklu})
=>
(printout file " Hartowanie jest ułatwione " crlf))
7
Programowanie w JESS fakty i reguły
Fakt:
(assert (student (Adam metalurgia))
Reguła:
(defrule regula1
(student {metalurgia})
=>
(printout file " Jeśli student jest studentem metalurgii to wie co
to jest hartowanie " crlf))
8
Programowanie w JESS fakty i reguły
Fakt:
(assert (mechanizm (mech pekanie))
Reguła:
(defrule regula1
(stal {gatunek == ST5})
=>
(printout file "Gatunek stali to ST5" crlf))
9
Programowanie w JESS fakty i reguły
Fakty:
- niemodyfikowalne (modyfikacja faktu oznacza jego usunięcie i stworzenie
nowego)
- mogą być tworzone
- mogą byś usuwane
Reguły:
- składają się z poprzedników i następstw
- reguła zostaje uruchomiona gdy spełniony jest poprzednik/poprzednicy
- następstwem reguły jest najczęściej modyfikacja lub dodanie nowych faktów
do pamięci roboczej (working memory)
10
Programowanie w JESS fakty i reguły
Produkcja faktów:
Fakty uruchamiają reguły, które produkują nowe fakty, które uruchamiają reguły,
które... itd. itd.
Program kończy się gdy nie ma już reguł, które można by uruchomić. Wynikiem
działania programu jest lista faktów w pamięci roboczej.
Wiedza reprezentowana jest przez:
- unordered facts (fakty nieuporządkowane)
- ordered facts (fakty uporządkowane)
- rules (reguły)
11
Programowanie w JESS fakty
Fakty uporządkowane
Są one prostymi listami, gdzie pierwszym polem jest rodzaj kategorii faktu.
(jan kowalski)
(pogoda słoneczna)
(stal niklowana)
(data-godzina 12.12.2011 19:30)
(lista-numerow 2 32 3 5 6 7 34 32 4)
Fakty nieuporządkowane
Ich podstawową charakterystyką jest to, że posiadają określoną strukturę.
(deftemplate person
(name Jan Kowalski)
(age 23 )
(eye-color blue)
(hair-color brown))
12
Programowanie w JESS fakty
W przypadku faktów uporządkowanych by odnieść się do
danego pola/symbolu należy znać jego pozycję.
W przypadku faktów nieuporządkowanych używa się nazwy
slotu.
13
Programowanie w JESS fakty
Fakty nieuporządkowane (unordered facts):
Struktura (definicja faktu):
Typ faktu: person
(deftemplate person "An example deftemplate"
(slot name)
(slot age)
(slot eye-color)
(slot hair-color))
14
Programowanie w JESS fakty
Fakty nieuporządkowane (unordered facts):
Tworzenie (dodawanie) faktów:
(assert (person (name John Q. Public)
(age 23 )
(eye-color blue)
(hair-color brown)))
15
Programowanie w JESS fakty
(deftemplate question
(slot factor (default none))
(slot question-to-ask (default none))
(slot has-pre-condition (type SYMBOL) (default no))
(multislot choices (default yes no))
(multislot range (type INTEGER)))
Słowa kluczowe:
- deftemplate: definicja faktu
- slot: pojedynczy symbol
- multislot: wiele symboli
- type: typ symbolu
- default: wartość domyślna
16
Programowanie w JESS fakty
Dodawanie faktów:
(assert
)
Usuwanie faktów:
(retract )
Wyświetlenie faktów:
(facts)
Załadowanie faktów do pamięci roboczej JESS:
(reset)
Usunięcie faktów oraz reguł!:
(clear)
17
Programowanie w JESS fakty
Hurtowe dodawanie faktów danego typu (unordered facts):
(deffacts people "Znajomi"
(person (name "Adam Kowalski") (age 24)
(eye-color blue) (hair-color black))
(person (name "Jan Kowalski") (age 24)
(eye-color blue) (hair-color black))
(person (name "Katarzyna Nowak") (age 36)
(eye-color green) (hair-color red)))
Przydatne, gdy chcemy na początku programu dodać zbiór faktów, których wiemy, że
są prawdziwe (tzw. Initial knowledge)
18
Programowanie w JESS reguły
Składnia:
(defrule nazwa
Left-Hand-Side (LHS) (antecedent/poprzednik)
=>
Right-Hand-Side (RHS) (consequent/konsekwencja)
)
LHS musi być spełnione (true), by reguła została umieszczona na agendzie.
RHS określa czynności wykonywane przez regułę.
19
Programowanie w JESS reguły
IF alarm pożarowy
THEN podejmij-akcje uaktywnij zraszacze
Uwaga: przed zdefiniowaniem reguły wszystkie używane przez nią fakty
nieuporządkowane (deftemplate) muszą być zdefiniowane.
(deftemplate alarm (slot typ))
(deftemplate wykonaj-akcje (slot akcja))
(defrule akcja-p.pożarowa Przykład reguły"
(alarm (typ pożarowy))
=>
(assert (podejmij-akcje (akcja uaktywnij-zraszacze))))
20
Programowanie w JESS reguły
(defrule akcja-p.pożarowa Przykład reguły"
(alarm (typ pożarowy))
=>
(assert (wykonaj-akcje (akcja uaktywnij-zraszacze)))
)
Czy tak stworzona reguła zostanie umieszczona na agendzie (wykonana)? Nie.
Stanie się to dopiero, gdy dodamy fakt:
(assert alarm (typ pożarowy))
Rezultat wykonania reguły? Dodanie (produkcja) nowego faktu:
(wykonaj-akcje (akcja uaktywnij-zraszacze))
21
Programowanie w JESS reguły
Składnia LHS:
(defrule nazwa
(and
(warunek 1)
(warunek 2) &
)
=>
&
(defrule nazwa
(or
(warunek 1)
(warunek 2) &
)
=>
...
22
Programowanie w JESS reguły
Składnia RHS:
(defrule nazwa
...
=>
(tworzenie/usuwanie faktu; wypisanie; ..)
(tworzenie/usuwanie faktu; wypisanie; ..)
...
23
Programowanie w JESS reguły
Ciąg zdarzeń:
(defrule akcja-p.pożarowa Przykład reguły"
(alarm (typ pożarowy))
=>
(assert (wykonaj-akcje (akcja uaktywnij-zraszacze)))
)
(defrule uruchamianie-zraszaczy
(wykonaj-akcje (akcja uaktywnij-zraszacze)
(prąd wyłączony)
=>
(assert (uruchom dopływ wody))
(assert (odblokuj zraszacze))
24
Programowanie w JESS reguły
Zmienne reguł i zakresy:
(defrule start-up
(osoba (wiek ?a&:(> ?a 30)&:(< ?a 40)) (imie $?n) )
=>
(printout t "Witaj " ?n ". Masz" ?a "lat" crlf))
Zmienne:
?a jeden slot, ?n wiele slotów (multislot), bo zdefiniowana jako $?n (pole imie w
deftemplate osoba jest multislot może mieć wiele symboli)
Zakres:
?a&:(> ?a 30)&:(< ?a 40) zmienna ?a, taka że ?a > 30 oraz ?a < 40
25
Programowanie w JESS reguły
(defrule start-up
(osoba (wiek ?a&:(> ?a 30)&:(< ?a 40)) (imie $?n) )
=>
(printout t "Witaj " ?n ". Masz" ?a "lat" crlf))
Reguła nie zadziała:
(assert (osoba (wiek 22) (imie Jan Kowalski))
Reguła zadziała:
(assert (osoba (wiek 34) (imie Jan Kowalski))
26
Programowanie w JESS wiedza początkowa
Reguły oraz fakty początkowe dodane na początku programu za pomocą
deffacts.
(deffacts people "Znajomi"
(person (name "Adam Kowalski") (age 24)
(eye-color blue) (hair-color black))
(person (name "Jan Kowalski") (age 24)
(eye-color blue) (hair-color black))
(person (name "Katarzyna Nowak") (age 36)
(eye-color green) (hair-color red)))
27
Programowanie w JESS odczyt z terminala
Polecenia: bind (załadowanie do zmiennej), read (odczyt jednego pola)
(defrule regula1
(initial-fact)
=>
(printout t Jak masz na imie? )
(bind ?imie (read))
(assert (imie ?imie))
?imie zmienna lokalna reguły
28
Programowanie w JESS odczyt z terminala
(defrule regula1
(initial-fact)
=>
(printout t Jak masz na imie? )
(bind ?imie (read))
(assert (imie ?imie))
(defrule regula2
(imie ?imie)
=>
(printout t Witaj, ?imie ! crlf crlf)
(printout t Wybierz opcje: (a/b/c) crlf)
(printout t a) crlf)
(printout t b) crlf)
(printout t c) crlf)
(bind ?odp (read))
(assert (odp ?odp))
)
29
Programowanie w JESS odczyt z terminala
(defrule regula_a
(odp a)
=>
(printout t Wybrales odpowiedz a crlf))
(defrule regula_b
(odp b)
=>
(printout t Wybrales odpowiedz b crlf))
(defrule regula_c
(odp c)
=>
(printout t Wybrales odpowiedz c crlf))
30
Programowanie w JESS operacje matematyczne
W JESS można stosować różne operacje matematyczne:
+, -, *, / :
np.
(+ ?x ?y ?z) : ?x + ?y + ?z
(- ?x ?y ?z) : ?x - ?y - ?z
(+ (- ?x ?y) (* ?x 2)) : (?x - ?y) + (?x * 2)
(- (+ ?x (* ?y ?z)) (/ ?x ?z)) : (?x + ?y * ?z) - ?x / ?z
31
Programowanie w JESS operacje matematyczne
(defrule start
(initial-fact)
=>
(printout t Program oblicza pierwiastki r. kwadratowego: crlf)
(printout t Podaj a : ) (bind ?a (read))
(printout t Podaj b : ) (bind ?b (read))
(printout t Podaj c : ) (bind ?c (read))
(assert (a ?a) (b ?b) (c ?c)))
(defrule licz-delte
(a ?a) (b ?b) (c ?c)
=>
(bind ?delta (- (* ?b ?b) (* 4 ?a ?c)))
(assert (delta ?delta)))
32
Programowanie w JESS operacje matematyczne
(defrule licz-pierwiastki_delta_zero
(delta ?delta) (a ?a) (b ?b)
(test (= ?delta 0))
=>
(bind ?x1 (/ (- 0 ?b) (* 2 ?a)))
(bind ?x2 ?x1)
(assert (x1 ?x1) (x2 ?x2)))
(defrule licz-pierwiastki_deltawiekszaodzera & itd.
(defrule pisz-wynik
(x1 ?x1) (x2 ?x2)
=>
(printout t X1 = ?x1 ,X2 = ?x2 crlf))
33
Programowanie w JESS funkcja test
(test (funkcja_porównująca argumenty)) - porównuje liczby, łańcuchy, zmienne.
Zawsze po lewej stronie reguły (LHS)!
Reguła, która ma po lewej stronie funkcję (test ...), zostanie uaktywniona tylko,
gdy będzie spełniony warunek w tej funkcji (oraz inne fakty w LHS).
Funkcje porównujące:
=, <>, >=, >, <=, <
Można używać funkcji logicznych (and, or & )
Np.
(test (> ?delta 0))
(test (<> wynik -1))
34
Programowanie w JESS funkcje definiowane przez użytkownika
Składnia:
(deffunction nazwa_funkcji
(?arg1 ?arg2 & ?argN)
(akcja1)
(akcja2)
&
(akcjaM)) ;
TYLKO OSTATNIA AKCJA ZWRACA WARTOŚĆ!
35
Programowanie w JESS funkcje definiowane przez użytkownika
(deffunction ostatnia-akcja
(?a ?b) ;argumenty
(printout t Wartości wejściowe: ?a ?b crlf)
(+ ?a ?b)
(- ?a ?b)
(* ?a ?b))
JESS> (ostatnia-akcja 4 2)
Wartości wejściowe: 4 2
JESS>> 8
36
Programowanie w JESS funkcje definiowane przez użytkownika
(deffunction pole_romb (?x ?y)
(bind ?pole (/ (* ?x ?y) 2))
(printout t "Pole wynosi " ?pole crlf))
JESS>> (pole_rombu 2 3)
Funkcja odpowiada za obliczenie pola rombu.
Do funkcji przesyłane są 2 parametry długości przekątnych.
Funkcja w ciele ma napisaną formułę obliczającą pole i zwracającą wynik.
Wywołujemy funkcję z parametrami i otrzymujemy odpowiedni wynik.
37
Programowanie w JESS funkcje definiowane przez użytkownika
(deffunction dodawanie (?x ?y)
(bind ?suma (+ ?x ?y))
(printout t "suma wynosi " ?suma crlf))
JESS>> (dodawanie 2 3)
Funkcja dodająca dwie liczby do siebie.
Liczby 2 i 3 są to parametry przesłane do funkcji, która wykona na
nich dodawanie.
Jako parametry można przesłać zdefiniowane wcześniej zmienne
lokalne np.: ?a, ?b, gdzie ?a i ?b zostały utworzone poleceniem
(bind) i przypisano im konkretne wartości.
38
Programowanie w JESS zmienne globalne
Wszystkie zmienne, których do tej pory używaliśmy były zmiennymi
lokalnymi poszczególnych reguł.
Zmienna lokalna jest znana tylko w regule, w której jest zdefiniowana.
Zmienne globalne mają zakres całego programu są znane we
wszystkich regułach.
Uwaga!: Wszędzie tam gdzie to możliwe należy używać faktów, a nie
zmienny globalnych!
39
Programowanie w JESS zmienne globalne
Definicja:
(defglobal
?*zmienna1* = wartość1
?*zmienna2* = wartość2
&
)
40
Programowanie w JESS zmienne globalne
np.
JESS> (defglobal ?*a* = 1)
JESS> ?*a*
1
JESS> (bind ?*a* 5)
JESS> ?*a*
5
JESS> (reset)
JESS> ?*a*
1
41
Programowanie w JESS zmienne globalne
Użycie w regułach:
yLE!:
(defrule zla-regula
(y ?*x*)
=>
& )
OK:
(defrule regula-ok
(y ?y)
(test (= ?y ?*x*)
=>
...)
42
Programowanie w JESS pętle
W programowaniu pętla to jedna z trzech podstawowych konstrukcji
programowania strukturalnego (obok instrukcji warunkowej i instrukcji
wyboru).
Umożliwia cykliczne wykonywanie ciągu instrukcji określoną liczbę razy,
do momentu zajścia pewnych warunków, dla każdego elementu listy lub
w nieskończoność.
W JESS istnieje możliwość zastosowania następujących pętli:
" foreach
" while
" if / then/ else
43
Programowanie w JESS pętle
FOREACH:
Pętla foreach, pętla "po kolekcji", to w programowaniu rodzaj pętli, której
wykonanie polega na powtarzaniu kolejnych iteracji dla wszystkich elementów
wybranych danych, takich jak, np. tablica, lista.
Pętla ta jest przydatna w sytuacji kiedy mamy już listę zmiennych.
Ma ona postać:
(foreach +)
JESS>> (bind ?lista (create$ imie nazwisko adres))
JESS>> (foreach ?e ?lista (printout t ?e crlf))
Wypisane zostaną wszystkie elementy z listy.
44
Programowanie w JESS pętle
WHILE:
Wykonuje instrukcję tak długo, dopóki jej warunek jest spełniony (ma wartość
prawdziwą).
Instrukcja sprawdza warunek przed wykonaniem ciała pętli.
Pętla while może wykonywać się nieskończoną ilość razy, gdy wyrażenie nigdy nie
przyjmie wartości 0 (fałsz), może także nie wykonać się nigdy, gdy wartość przed
pierwszym przebiegiem będzie FALSE.
Ma ona postać:
(while do +)
JESS>> (bind ?i 1)
JESS>> (bind ?sum 0)
JESS>> (while (<= ?i 10) do
(bind ?sum (+ ?sum ?i))
(bind ?i (+i ?i 1)))
JESS>> ?sum
45
Programowanie w JESS pętle
IF/THEN/ELSE:
Pętla ta pozwala na wybór, który fragment kodu ma się wykonać.
Instrukcja if (ang. jeśli) to podstawowa instrukcja warunkowa.
Gdy spełniony jest jej warunek - wykonany zostanie kod zawarty po słowie then.
Fragment else jest opcjonalny.
Ma ona postać:
(if then + [else +])
JESS>> (bind ?lista (create$ imie nazwisko Krakow))
JESS>> (if (member$ Krakow ?lista) then
(printout t Ten ktoś mieszka w Krakowie crlf)
else
(printout t Ten ktoś mieszka poza Krakowem crlf))
Jeżeli w liście podamy Kraków to zostanie wykonane polecenie po słowie then, jeżeli
podamy inne niż Kraków to wykonany zostanie kod po słowie else.
46
47
Wyszukiwarka
Podobne podstrony:
listscript fcgi id=39
listscript cgi id=39
WYKLAD 2 id 2231861 Nieznany
(CHEMIA WYKŁAD 3)id41
WYKLAD 1 id 2231860 Nieznany
bd wyklad2 id 2157435 Nieznany
39) TSiP Wyklad powloki
1 wykład mech tech(1)id088
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja
WYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznej
CISAX01GBD id 2064757 Nieznany
więcej podobnych podstron