(JESS wykład)id 1339


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