JESS. Tomasz Rybak Applied Systems Division Software Departament Faculty of Computer Science Bialystok Technical University

Podobne dokumenty
Programowanie w CLIPS

JESS FAKTY, REGUŁY. czyli faktami. Rodzaje faktów, oraz sposoby ich implementacji w programie. Szablony do tworzenia faktów.

Programowanie obiektowe

Programowanie obiektowe

Db4o obiektowa baza danych wersja.net

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Programowanie Obiektowe GUI

Programowanie w CLIPS

Kurs WWW. Paweł Rajba.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Wprowadzenie do projektu QualitySpy

Zaawansowane aplikacje internetowe

Wykład 4: Klasy i Metody

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Podstawy i języki programowania

Oracle PL/SQL. Paweł Rajba.

Oczywiście plik musi mieć rozszerzenie *.php

Backend Administratora

Smarty PHP. Leksykon kieszonkowy

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Tworzenie i wykorzystanie usług sieciowych

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Dokumentacja do API Javy.

Wprowadzenie do Doctrine ORM

Programowanie w języku Python. Grażyna Koba

Zaawansowane aplikacje WWW - laboratorium

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Wywoływanie metod zdalnych

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Inżynieria wiedzy. Katedra Wytrzymałości Materiałów i Metod Komputerowych Mechaniki 1. Podstawy programowania w języku CLIPS

Podstawy Programowania Obiektowego

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Baza danych sql. 1. Wprowadzenie

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Wykład 8: klasy cz. 4

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Programowanie obiektowe

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Projekt Hurtownia, realizacja rejestracji dostaw produktów

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Wykład 2: Podstawy Języka

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

Obrazek 1: Interfejs DT. DT Help File v1.3

MentorGraphics ModelSim

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Bazy Danych i Usługi Sieciowe

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Język Java część 2 (przykładowa aplikacja)

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Instrukcja laboratoryjna nr.4

Java jako język programowania

Języki i techniki programowania Ćwiczenia 2

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Skanowanie OCR w aplikacji Kancelaria Komornika. Instrukcja dla użytkownika

Tytuły Wykonawcze. Opis systemu tworzenia dokumentacji TW-1

Umieszczanie kodu. kod skryptu

Metody dostępu do danych

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Programowanie obiektowe

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Aplikacje internetowe i rozproszone - laboratorium

Programowanie obiektowe

Krótki kurs obsługi środowiska programistycznego Turbo Pascal z 12 Opracował Jan T. Biernat. Wstęp

Systemy GIS Tworzenie zapytań w bazach danych

BACKUP BAZ DANYCH FIREBIRD

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Instrukcja laboratoryjna cz.3

Cw.12 JAVAScript w dokumentach HTML

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

MATERIAŁY DO ZAJĘĆ II

Programowanie obiektowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4

Transkrypt:

JESS Tomasz Rybak rybak@ii.pb.bialystok.pl Applied Systems Division Software Departament Faculty of Computer Science Bialystok Technical University Tomasz Rybak (PB) JESS 1 / 50

Table of content 1 Wprowadzenie 2 Eclipse Wyświetlanie sieci Rete 3 System przewoźnik 4 Zapytania 5 Wnioskowanie wstecz 6 Interfejs użytkownika Tomasz Rybak (PB) JESS 2 / 50

Wprowadzenie JESS Strona http://www.jessrules.com/ Szkieletowy system ekspertowy Język implementacji Java Język opisu reguł kompatybilny z CLIPS Używa algorytmy Rete http://herzberg.ca.sandia.gov/jess/docs/70/rete.html Wersja 7.0 umożliwia wnioskowanie w przód i wstecz Licencja komercyjna i bezpłatna, akademicka Wersja próbna działająca 30 dni Tomasz Rybak (PB) JESS 3 / 50

Wprowadzenie Krótki opis Możliwość dostępu do obiektów systemu korzystając z języka Java Możliwość tworzenia UI korzystając z biblioteki AWT Możliwość rozszerzania funkcjonalności wstawkami w języku Java Dokumentacja http://www.jessrules.com/jess/docs/index.shtml Wiki: http://www.jessrules.com/jesswiki/view Tomasz Rybak (PB) JESS 4 / 50

Wprowadzenie Struktura katalogu Program rozprowadzany jako archiwum zip bin skrypty służące do uruchownienia programu w Uniksach i pod Windows docs dokumentacja eclipse wtyczki do Eclipse examples przykładowe programy lib implementaja systemu, pliki jar z kodem Tomasz Rybak (PB) JESS 5 / 50

Wprowadzenie Przykłady Przykłady zapisane są zarówno w języku CLIPS jak i w kodzie XML Dylemat więźnia Bierki Małpa i banan Rozwiązywanie równań literowych Tomasz Rybak (PB) JESS 6 / 50

Eclipse Współpraca z Eclipse Eclipse to open-source IDE, napisane w języku Java Strona http://www.eclipse.org/ Umożliwia pisane programów w językach C++ i Java Można je rozszerzać dodając wtyczki Istnieją wtyczki do Perla, Pythona, PHP, Lispa i Scheme i innych Tomasz Rybak (PB) JESS 7 / 50

Eclipse Konfiguracja wtyczek Pliki zip z wtyczkami znajdują się w katalogu eclipse/ Należy je wszystkie rozpakować do katalogu w którym W tym katalogu tworzymi plik.eclipseextension Następnie Help >Software Updates >Manage Configuration Wyiramy Add an Extension Location Dodajemy katalog do którego rozpakowaliśmy wtyczki Tomasz Rybak (PB) JESS 8 / 50

Plik.eclipseextension Eclipse id=org.eclipse.platform name=eclipse Platform version=3.2.1 3.2.1 to wersja Eclipse z której korzystamy Tomasz Rybak (PB) JESS 9 / 50

Eclipse Wtyczki gov.sandia.jess 7.0.0.zip łączące Eclipse i Jess gov.sandia.jess.debug 7.0.0.zip używana przy wyszukiwaniu błędów gov.sandia.jess.editor 7.0.0.zip używana przez edytor kodu Jess gov.sandia.jess.feature 7.0.0.zip gov.sandia.jess.reteview 7.0.0.zip używana do wyświetlania sieci Rete Tomasz Rybak (PB) JESS 10 / 50

Eclipse Widok okna Eclipse 1 Widok wszystkich istniejących projektów, zarówno otwartych jak i zamkniętych 2 Okno edytora 3 Widok wszyskich istniejących obiektów systemu Jess 4 Konsola z wynikiem działania systemu Tomasz Rybak (PB) JESS 12 / 50

Eclipse Wyświetlanie sieci Rete Konfiguracja Eclipse Aby móc wyświetlić sieć Rete, potrzebne jest rozszerzenie Graphical Editing Framework (GEF) Adres http://www.eclipse.org/gef/ Eclipse w wersji 3.2 jest połączony z kilkoma najpopularniejszymi rozszerzeniami, w tym z GEF To połączenie nazywane jest Callisto Adres http://www.eclipse.org/callisto/ Tomasz Rybak (PB) JESS 13 / 50

Widok okna Eclipse Eclipse Wyświetlanie sieci Rete 1 Okno wyboru widoku sieci Rete (Window >View >Other) Tomasz Rybak (PB) JESS 15 / 50

Eclipse Wyświetlanie sieci Rete Widok okna Eclipse 1 Okno edytora z zaznaczoną regułą której sieć Rete jest wyświetlana 2 Ta sama reguła podświetlona w oknie widoku obiektów systemu Jess 3 Sieć Rete dla tej reguły Tomasz Rybak (PB) JESS 17 / 50

System przewoźnik System przewoźnik System na którego przykładzie zostanie przedstawiony system Jess Istnieje wiele firm przewozowych Istnieją różne typy towarów Istnieje wielu klientów którzy chcą przewozić towary między miastami Dla każdego klienta należy wybrać najtańszego przewoźnika spośród tych, którzy są w stanie podołać zleceniu Tomasz Rybak (PB) JESS 18 / 50

System przewoźnik Wzorce Definiują typy z których korzystamy w systemie Wzorzec (ang. template) nazywany jest często ramą (ang. frame) Wzorce mogą dziedziczyć z innych wzorców Wzorzec składa się z nazwanych slotów Każdy slot może mieć typ, i przechowuje jedną wartość Jeśli chcemy przechowywać więcej wartości, zamiast slotu używamy multislotukonieczny jest Slot nie może przechowywać odwołania do ram ani faktów Aby opisać powiązania między obiektami, posługujemy się techniką znaną z baz danych, korzystając z identyfikatorów Tomasz Rybak (PB) JESS 19 / 50

Tworzenie ram System przewoźnik Jess (deftemplate firma (slot nazwa (type string)) (slot cena-przewozu (type float)) (slot cena-załadunku (type float)) (multislot zasięg (type string)) (multislot flota (type string)) (slot obsługuje-specjalne) (slot obsługuje-chłodnię) (slot ładowność (type float)) ) Tomasz Rybak (PB) JESS 20 / 50

Tworzenie ram System przewoźnik Java Rete r = new Rete(); Deftemplate dt = new Deftemplate("firma", "Komentarz", r); dt.addslot("nazwa", null, "STRING"); dt.addslot("cena-przewozu", null, "FLOAT"); dt.addslot("cena-załadunku", null, "FLOAT"); dt.addmultislot("zasięg", null, "STRING"); dt.addmultislot("flota", null, "STRING"); dt.addslot("obsługuje-specjalne)", null, "ANY"); dt.addslot("obsługuje-chłodnię)", null, "ANY"); dt.addslot("ładowność", new Value(0, RU.FLOAT), "FLOAT"); r.adddeftemplate(dt); Tomasz Rybak (PB) JESS 20 / 50

System przewoźnik Asercje Zwykle są to nazwane ciągi (listy) wartości Nie występują w Jess jako oddzielny typ Odpowiednikiem są wzorce uporządkowane Nie ma w niech slotów, a jedynie lista wartości Implementowane są jako wzorzec z jednym multislotem data W tym multislocie przechowywane są wszystkie wartości Tomasz Rybak (PB) JESS 21 / 50

Definiowanie asercji System przewoźnik Jess (deftemplate potencjalni (declare (ordered TRUE))) Java Rete r = new Rete(); Deftemplate dt = new Deftemplate("potencjalni", "Komentarz", r); dt.addmultislot(" data", null, "ANY"); r.adddeftemplate(dt); Tomasz Rybak (PB) JESS 22 / 50

System przewoźnik Fakty Fakty to instancje wzorców Wewnątrz systemu każdy fakt posiada liczbowy identyfikator Fakty mogą być zgrupowane w nazwane zbiory faktów Funkcja facts wypisuje wszystkie istniejące fakty Funkcja reset przywraca system do stanu początkowego, usuwając wszystkie tymczasowe fakty Tomasz Rybak (PB) JESS 23 / 50

System przewoźnik Shadow facts Shadow facts to wskzanie na obiekty Java nie będące częścią systemu Jess, tj. nie znajdujące się w pamięci roboczej Umożliwiają one operacje na tych obiektach z poziomu systemu Nie jest konieczne ręczne definiowanie slotów; jeśli klasa jest zgodna z JavaBeans Jess stworzy je automatycznie dla każdej własności posiadającej metody get* i set* (deftemplate nazwa (declare (from-class nazwa-klasy)) (defclass nazwa nazwa-klasy) W odróżnieniu od deftemplete defclass jest funkcją i może być użyta w dowolnym miejscu systemu defclass nie oferuje jednak wszystkich możliwości deftemplete Zalecane jest użycie defclass jeśli tylko jest to możliwe Tomasz Rybak (PB) JESS 24 / 50

System przewoźnik Shadow facts tworzenie i użycie (new nazwa-klasy) tworzy obiekt i zwraca referencję Referencję można traktować jak każdą inną wartość; najczęściej przypisuje się ją do zmiennej przy użyciu bind Aby dla obiektu do którego posiadamy referencję został stworzony shadow fact, musimy użyć funkcji add Funkcja ta doda nowy fakt do pamięci roboczej, dzięki czemu będzie można z niego skorzystać w regułach Tomasz Rybak (PB) JESS 25 / 50

System przewoźnik Shadow facts zmiany wartości Jeśli zmienimy shadow fact, zmiana ta zostanie przeniesiona również do obiektu Jeśli zmienimy obiekt bezpośrednio. shadow fact w pamięci roboczej nadal będzie przechowywał starą wartość Aby zaktualizować pojedynczy shadow fact należy użyć funkcji update Funkcja ta odczyta wartości z obiektu i przepisze je do faktu w pamięci roboczej Funkcja reset aktualizuje wszystkie shadow facts Jeśli chcemy aby Jess automatycznie aktualizował shadow facts, klasa którą mapujemy musi wspierać java.beans.propertychangelistener Dzięki temu Jess może dodać się do listy modułów powiadamianych o zmianie i będzie mógł automatycznie aktualizować pamięć roboczą Tomasz Rybak (PB) JESS 26 / 50

System przewoźnik Tworzenie faktów Fakt może być stworzony przy użyciu funkcji assert; wówczas będzie faktem tymczasowym Fakty zgromadzone w zbiorach stworzonych przy użyciu funkcji deffacts są trwałe i nie są usuwane przez funkcją reset Tomasz Rybak (PB) JESS 27 / 50

Tworzenie faktów System przewoźnik Jess (assert (towar-nietrwały (nazwa "raki") (masa-jednostkowa 1.2))) Java Rete r = new Rete(); Fact f = new Fact("towar-nietrwały", r); Value v0 = new Value("raki", RU.STRING); f.setslotvalue("nazwa", v0); Value v1 = new Value(1.2, RU.STRING); f.setslotvalue("masa-jednostkowa", v1); r.assertfact(f); Tomasz Rybak (PB) JESS 28 / 50

Tworzenie faktów System przewoźnik Jess (deffacts system-przewoźnik (faktura (skąd "Białystok") (dokąd "Mońki") (odległość 45) (ekspress tak) (ilość 3) (towar "raki") (numer "11/99")) (towar-nietrwały (nazwa "ryby") (masa-jednostkowa 2.9))) Tomasz Rybak (PB) JESS 29 / 50

Tworzenie asercji System przewoźnik Java (assert (potencjalni?f?n?cena)) Java Rete r = new Rete(); Fact f = new Fact("potencjalni", r); ValueVector vv = new ValueVector(); vv.add("?f").add("?n").add("?cena"); f.setslotvalue(" data", new Value(vv, RU.LIST)); r.assertfact(f); Tomasz Rybak (PB) JESS 30 / 50

System przewoźnik Reguły Reguła składa się z dwóch części, oddzielonych => Pierwsza część opisuje warunki jakie muszą być spełnione aby reguła została uruchomiona Zwykle są w niej opisane fakty z jakich korzysta reguła i warunki jakie muszą być spełnione przez te fakty Druga część opisuje działanie jakie musi zostać podjęte jeśli reguła jest ucuchamiana Może to być stworzenie, usunięcie lub zmiana faktu, wypisanie komunikatu,... W drugiej części można również stworzyć nowe zmienne i/lub przypisać im wartości przy użyciu funkcji bind Funkcji tej nie można użyć w pierwszej części Reguła może mieć priorytet, opisany przez własność salience Tomasz Rybak (PB) JESS 31 / 50

System przewoźnik Dopasowywanie faktów Dany fragment sprawdza typ faktu Reguła jest sprawdzana i wywoływana dla każdej kombinacji faktów zgodnych z przedstawionymi wzorcami Sprawdzany jest typ (wzorzec) faktu i dodatkowe warunki podane przez użytkownika Jeśli chcemy pobrać wskazanie na fakt, używamy operatort < :?f < (wzorzec... ) Tomasz Rybak (PB) JESS 32 / 50

System przewoźnik Warunki dotyczące wartości slotów Aby warunek opisujący fakt był prawdziwy, muszą być spełnione wszystkie warunki dotyczące jego slotów Pobranie wartości slotu odbywa się poprzez napisanie w nawiasach nazwy slotu i zmiennej pod którą podstawiamy wartość: (slot?zmienna) Trzy sposoby zapisu warunków 1 Po pobraniu wszystkich faktów i ich wartości użycie funkcji test 2 Wyrażenie otoczone nawiasami klamrowycmi umieszczone wewnątrz opisu faktu. W wyrażeniu tym można posługiwać się nazwami slotów i istniejących zmiennych. Nie tworzy ono żadnych nowych obiektów ani zmiennych 3 Łącznie z pobieraniem wartości, umieszczając wyrażenie w notacji uproszczonej tuż po nazwie zmiennej Jeśli chcemy upewnić się, że wartość istnieje nie pobierając jej, zamiast?zmienna używamy tylko?. Tomasz Rybak (PB) JESS 33 / 50

System przewoźnik Notacja uproszczona negacja & koniunkcja alternatywa :(wyrażenie) wykonanie wyrażenia zwracającego wartość logiczną =(wyrażenie) wykonanie wyrażenia zwracającego wartość /wyrażenie/ użycie wyrażenia regularnego Tomasz Rybak (PB) JESS 34 / 50

System przewoźnik Dopasowywanie multislotów Multislot przechowuje listę wartości Jest ona uporządkowana; należy o tym pamiętać podczas pobierania wartości i testów Jeśli chcemy pobrać nie pojedynczą wartość a listę, wyrażenie należy poprzedzić znakiem dolara $ Dotyczy to również pojedynczego znaku zapytania; tu zamiast? piszemy $? Aby sprawdzić czy wartość należy do listy należy użyć funkcji (member$ wartość lista) Tomasz Rybak (PB) JESS 35 / 50

System przewoźnik Operacje na faktach Aby móc wykonać operacje na faktach w części reguły po operatorze => należy znać tożsamość faktu Pobieramy ją w pierwszej części reguły za pomocą operatora > Nowy fakt tworzymy za pomocą funkcji assert, której jako parametr podajemy listę składającą się z nazwy ramy i listy par slot-wartość Fakty usuwane są za pomocą funkcji retract której jako parametr podajemy wskazania na fakt Aby zmienić wartości w slotach należy użyć funkcji modify, której pierwszym argumentem jest wskazanie na fakt, a jako kolejne argumenty występują pary slot-nowa wartość Tomasz Rybak (PB) JESS 36 / 50

Tworzenie reguł System przewoźnik Jess (defrule sprawdź-wszystko?w <- (wykonawcy (masa $??n $?) (zasięg $?zasięg) (specjalne $?specjalne) (ekspress $?ekspress) (wszystko $?slot)) (test (and (not (member$?n $?slot)) (member$?n $?zasięg) (member$?n $?ekspress) (member$?n $?specjalne) )) => (modify?w (wszystko $?slot?n)) (printout t "Firma "?n " jest w " $?slot crlf) ) Tomasz Rybak (PB) JESS 37 / 50

Tworzenie reguł System przewoźnik Java Tworzenie reguł w języku Java nie jest zalecane. Jest to nowa jeszcze nieudokumentowana funkcjonalność. Wraz z rozwojem systemu sposób tworzenia i obsługi reguł z poziomu języka Java może się zmianić. Autorzy zaznaczają również, że istotą systemu ekspertowego jest oddzielenie reguł od kodu i danych, zaś użycie języka Java do tworzenia reguł może skomplikować system. Tomasz Rybak (PB) JESS 37 / 50

System przewoźnik Wczytywanie pliku z kodem Jess Java Rete engine = new Rete(); FileReader file = new FileReader("myfile.clp"); try { Jesp parser = new Jesp(file, engine); parser.parse(false); } finally { file.close(); } Tomasz Rybak (PB) JESS 38 / 50

System przewoźnik Wczytywanie pliku z kodem Jess Java Rete engine = new Rete(); FileReader file = new FileReader("myfile.clp"); Context context = engine.getglobalcontext(); try { Jesp parser = new Jesp(file, engine); Object result = Funcall.TRUE; while (!result.equals(funcall.eof)) { result = parser.parseexpression(context, false);... } } finally { file.close(); } Tomasz Rybak (PB) JESS 39 / 50

System przewoźnik Uruchomienie systemu Aby uruchomić system, należy użyć funkcji run System będzie przeglądał reguły i wywoływał te, które mogą być wywołane Działanie skończy się gdy nie będzie możliwości wywołania żadnej reguły Przed run zwykle wywoływana jest funkcja reset, aby powrócić do stanu początkowego usuwając tymczasowe fakty Dzięki temu każde uruchomienie będzie rozpoczynało od tego samego stanu, co powinno zapewnić powtarzalność obserwacji Tomasz Rybak (PB) JESS 40 / 50

Zapytania Baza wiedzy Zbiór faktów może być widziany jako baza danych Zatem możemy pobrać część obiektów Najprostsze wyjście to pobrać obiekty danego typu Tomasz Rybak (PB) JESS 41 / 50

Pobranie obiektów Zapytania Java Rete engine = new Rete(); engine.batch("plik.clp"); Iterator it = engine.getobjects(new Filter() { public boolean accept(object o) { return o instanceof Typ; } }); while (it.hasnext()) { ((Payment) it.next()).process(); } Tomasz Rybak (PB) JESS 42 / 50

Zapytania Zapytania Aby pobrać obiekty spełniające określone warunki należy użyć zapytań Zapytania służą do zwracania wyników Reguły pozwalają na zmianę, zapytania tylko na odczyt Zapytanie może posiadać parametry Tomasz Rybak (PB) JESS 43 / 50

Stworzenie zapytania Zapytania Jess (defquery znajdź-firmy-obsługujące (declare (variables?m)) (firma (nazwa?n) (zasięg??m?) (ładowność?l))) Java Podobnie jak w przypadku reguł, tworzenie zapytań w języku Java nie jest zalecane. Tomasz Rybak (PB) JESS 44 / 50

Użycie zapytań Zapytania Jess (bind?result (run-query* znajdź-firmy-obsługujące "Białystok")) (while (?result next) (printout t (?result getstring n) " " (?result getstring n) " " (?result getfloat l))) Java QueryResult result = engine.runquerystar("znajdx-firmy", new ValueVector().add("Białystok")); while (result.next()) { System.out.println(result.getString("n") + " " + result.getstring("m") + " " + result.getfloat("l")); } Tomasz Rybak (PB) JESS 45 / 50

Wnioskowanie wstecz Wnioskowanie wstecz Aby rama była użyta podczas wnioskowania wstecz, musi posiadać atrybut backchain-reactive ustawiony na true Ewentualnie, można włączyć po definicji przez użycie funkcji (do-backward-chaining wzorzec) Włączenie atrybutu wnioskowania wstecz zmienia strukturę reguł korzystających z takich ram i faktów W związku z tym należy zaznaczyć użycie ram we wnioskowania wstecz przed definicją reguł korzystających z nich korzystających Tomasz Rybak (PB) JESS 46 / 50

Wnioskowanie wstecz Reguły we wnioskowaniu wstecz Jeśli reguła usiłuje pobrać nieistniejący fakt którego wzorzec umożliwia wnioskowanie wstecz, tworzony jest nowy fakt Ten nowy fakt jest kopią niezbędnego faktu, gdzie zamiast nieznanych wartości umieszczana jest wartość nil, zaś jego nazwa powstaje poprzez dodanie na początku need- Aby zaimplementować wnioskowanie wstecz, należy stworzyć reguły które na podstawie faktów need-* stworzą niezbędne fakty W systemie będą zatem dwie klasy reguł do wnioskowania w przód i do wnioskowania wstecz Tomasz Rybak (PB) JESS 47 / 50

Interfejs użytkownika Interfejs użytkownika Domyślnie system pracuje w trybie tekstowych, wypisując komunikaty na ekran i oczekując wprowadzenia wartości z klawiatury Istnieje możliwość implementacji interfejsu okienkowego Interfejs tworzony jest za pomocą biblioteki AWT, do której można odwołać się z poziomy języka Jess Przykład examples/jess/jframe.clp Stworzenie okna i przycisków Dodanie akcji wywoływanych po naciśnięciu przycisku Pokazanie okna Tomasz Rybak (PB) JESS 48 / 50

Tworzenie okna Interfejs użytkownika Jess (deffunction create-frame () (bind?*f* (new JFrame "Jess Reflection Demo")) (bind?*c* (?*f* getcontentpane)) (set?*c* background (Color.magenta))) (deffunction add-widgets () (?*c* add (new JLabel "This is: ") (BorderLayout.CENTER)) (bind?*m* (new JComboBox)) (?*m* additem "Cool") (?*m* additem "Really Cool") (?*m* additem "Awesome") (?*c* add?*m* (BorderLayout.SOUTH))) Tomasz Rybak (PB) JESS 49 / 50

Wyświeltanie, akcje Interfejs użytkownika Jess (deffunction add-behaviours () (?*f* setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE)) (?*m* addactionlistener (implement ActionListener using (lambda (?name?event) (printout t "You chose: " (get?*m* selecteditem) crlf))))) (deffunction show-frame () (?*f* pack) (?*f* setvisible TRUE)) (create-frame) (add-widgets) (add-behaviours) (show-frame) Tomasz Rybak (PB) JESS 50 / 50