Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:piw:2010:systemy_ekspertowe:hekate_iii [2011/04/05 14:01] kkr |
pl:dydaktyka:piw:2010:systemy_ekspertowe:hekate_iii [2011/04/05 19:02] kkr |
</code> | </code> |
| |
=== Ćwiczenie === | === Exercise === |
Porównaj plik HMR z modelem XTT2: | Compare the HMR file with XTT model: |
* Plik HMR: | * HMR file: |
{{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} | {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} |
* Termostat w XTT: | * XTT file: |
{{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-xtt.png|}} | {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-xtt.png|}} |
| |
====== Callbacks w HMR ====== | ====== Callbacks in HMR ====== |
Callbacki to funkcje wywoływane podczas przetwarzania tabel XTT w celu pobrania danych spoza systemu lub do zaprezentowania tych danych. Przykładową funkcję callbacków przedstawia rysunek poniżej. W systemie symulującym zachowanie bankomatu callbacki będą wykorzystywane do wyświetlenia okna pobierającego PIN i do wyświetlania komunikatów dla użytkownika. | Callbacks are the functions that are executed during the XTT tables evaluation in order to get a value or to present a value. |
| The example of the callbacks execution results are showed in the picture below. |
| In the cashpoint system, the callbacks are used for calling a enter PIN dialog as well as for displaying messages to the user. |
| |
{{:pl:dydaktyka:piw:2010:systemy_ekspertowe:callbacks.png|}} | {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:callbacks.png|}} |
| |
| There are two types of callbacks: |
| * //in// - are executed before (or during) inference process in order to get attributes value. |
| * //out// - are executed for values of attributes presentation, when the inference process is finished. |
| The type of a callback is determined by value of the attribute //comm// property. |
| |
Wyróżnia się dwa typy callbacków: | HMR syntax provides a **callback** property of the XTT attribute that indicates which callback function should be called. |
* //in// - wywołują się one przed rozpoczęciem (lub w trakcie działania) wnioskowania w celu pobrania wartości atrybutów wymaganych do przeprowadzenia inferencji. | The property has a list structure, where the first element is the name of the callback function and the second is a list of parameters. |
* //out// - wywołują się już po zakończeniu wnioskowania w celu prezentacji wartości atrybutów. | |
| |
Typ callbacku zależy od wartości elementu //comm// w definicji atrybutu w języku HMR. | |
| |
Elementem określającym jaki callback ma być wywołany dla danego atrybutu, jest pole **callback**. Jets ono postaci listy, której pierwszy element jest nazwą callbaku do wywołania a drugi jest listą parametrów jakie chcemy przekazać callbackowi: | |
<code> | <code> |
xattr [name: day, | xattr [name: day, |
]. | ]. |
</code> | </code> |
Powyższy kod oznacza, że dla atrybutu w którym się on pojawi będzie wywołany callback typu //in// o nazwie //ask_symbolic_GUI//, pobierający jako parametr jedną wartość //day//. | The above example defines an attribute //day//. |
| The value of the property //comm// of this attribute is **in** what defines the type of the callback to be **in**. |
| For this attribute the **ask_console** callback function will be called, which will get the value of the attribute **day**. |
| |
==== Atrybuty a callbacki ==== | ==== Callbacks and attributes ==== |
Callbacki związane są z atrybutami w języku HMR - każdy atrybut ma dwa pola niezbędne do ustalenia jeśli chcemy korzystać z callbacków: | In HMR, callbacks are related to attributes. For each attribute two properties must be defined in order to use callbacks: |
* //comm// - określające kiedy callback zostanie wywołany (//in// albo //out//) | * //comm// - defines when the callback is executed (possible values: //in// or //out//) |
* //callback// - nazwa i lista parametrów do wywołania | * //callback// - the name and the list of parameters of the required callback. |
| |
Za definicję callbacku odpowiedni jest predykat //xcall// umieszczany w pliku HMR. Na poniższym przykładzie pokazano wykorzystanie mechanizmu JPL do utworzenia callbacku napisanego w Javie. | |
| |
| HMR provides //xcall// predicate that allows for callback definition. |
| The following example shows the JPL mechnism, which is used to create a callback written in Java. |
<code> | <code> |
xcall ask_symbolic_GUI : [AttName] >>> (jpl_new('skeleton.RequestInterface',[],T), | xcall ask_symbolic_GUI : [AttName] >>> (jpl_new('skeleton.RequestInterface',[],T), |
</code> | </code> |
| |
==== Języki programowania ==== | ==== Programming languages ==== |
Callbacki dla interpretera HeaRT mogą być zaimplementowane w jednym z następujących języków: | HeaRT supports the callbacks written in: |
* Prolog | * Prolog |
* XPCE | * XPCE |
* Java | * Java |
=== Prolog === | === Prolog === |
Są to zwykłe predykaty w języku Prolog: | Prolog-based callbacks are an ordinary Prolog predicates. |
<code> | <code> |
xcall ask_console : [AttName] >>> (write('Type value for attribute: '), | xcall ask_console : [AttName] >>> (write('Type value for attribute: '), |
</code> | </code> |
| |
**Ćwiczenie** | **Exercise** \\ |
Aby uruchomić wnioskowanie bezpośrednio z interpretera HeaRT, należy pobrać kod interpretera: {{:hekate:heart-m3.tar.gz}} i uruchomić go poleceniem //heart//. W celu skompilowania modelu XTT zapisanego w pliku HMR należy po uruchomieniu HeaRT wpisać w konsoli Prologa //[nazwa-pliku-hmr]// - zwyczajnie skompilować ten plik tak jak każdy inny kod Prologu. Następnie w celu uruchomienia wnioskowania należy wpisać polecenie <code>gox(current, ListaTabelDoPrzetworzenia, ddi)</code>. | In order to run inference process directly from HeaRT interpreter you must: |
Uruchom wnioskowanie dla poniższego modelu: {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} | * download the source code of HeaRT {{:hekate:heart-m3.tar.gz}}, |
| * run it by typing //heart//, |
| * in order to complie XTT model in the form of HMR type in console: //[name-of-hmr-file]//, |
| * run the //gox// command:<code>gox(current, ListOfProcessedTables, ddi)</code> |
| Run the inference for the following model: {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} |
| |
=== XPCE === | === XPCE === |
Są to predykaty w języku Prolog wzbogacone o funkcje XPCE. Aby zapewnić jednak oprawne działanie interpretera HeaRT nalezy korzystać z tego szkieletu: | The XPCE-based callbacks consist of the ordinary Prolog predicates that are enriched by XPCE functions. |
| In order to assure the correct integration with HaeRT, the following schema must be used: |
<code> | <code> |
xcall xpce_ask_numeric: [AttName] >>> ( | xcall xpce_ask_numeric: [AttName] >>> ( |
dynamic(end), | dynamic(end), |
% Ciało callbacku przygotowujace okienko do wyświetlenia i wyświetlające je | % The body of the callback, which prepares a dialog to appear. |
repeat, | repeat, |
%Oczekiwanie na wciśnięcie przez użytkownika przycisku OK | % Waiting for OK button |
send(@display,dispatch), | send(@display,dispatch), |
end,!, | end,!, |
</code> | </code> |
| |
Przykład callbacku wczytującego liczbę z określonego zakresu pokazany jest poniżej: | |
| |
| The example of the callback that reads a value from the range [Min; Max] is presented below: |
<code> | <code> |
xcall xpce_ask_numeric: [AttName] >>> (alsv_domain(AttName,[Min to Max],numeric), | xcall xpce_ask_numeric: [AttName] >>> (alsv_domain(AttName,[Min to Max],numeric), |
</code> | </code> |
| |
**Ćwiczenie** | **Exercise** \\ |
Uruchom wnioskowanie dla przykładu z bankomatem i prześledź działanie callbacków: | Run the inference mechanism for the ATM example and trace the callback mechanism: |
* {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|}} | * {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|}} |
| |
=== Java === | === Java === |
Są to programy napisane w języku Java uruchamiane przez prolog przy użyciu JPL. Aby wykorzystać ten mechanizm należy korzystać ze specjalnie przygotowanych do tego klasy: | The Java-based callbacks are the Java programs that are executed by prolog with the help of JPL. |
* DataFetcher.java - klasa abstrakcyjna którą muszą rozszerzać wszystkie callbacki | To exploit this mechanism, the following classes mysu be used: |
* RequestInterface.java - Kontroler | * DataFetcher.java - an abstract class that must be inherited by all the callbacks |
* Response.java - klasa przechowująca dane odebrane od użytkownika. | * RequestInterface.java - controller |
| * Response.java - class that stores a data retrieved from a user. |
| |
W celu ulatwienia implementacji niektórych callbacków, przygotowano zbiór podstawowych komponentów do pobierania danych od użytkownika: | The set of basic components, which can be used to the retrieval data from a user, is prepared to facilitate the callbacks implementation. |
* ComboBoxFetcher.java - przyjmuje listę wartości z jakich można wybierać. Zwraca jedną wybraną wartość | * **ComboBoxFetcher.java** - creates a list of selectable values. It returns one (selected) value. |
* SliderFetcher.java - przyjmuje przedział wartości numerycznych między którymi można wybierać. Zwraca jedna wybraną wartość. | * **SliderFetcher.java** - allowf for selecting a value from a given range of values. It returns one (selected) value. |
* TwoListsFetcher.java - przyjmuje listę wartości jakich można wybierać i zwraca również listę wybranych wartości. | * **TwoListsFetcher.java** - creates a list of selectable values. It returns list of all selected values. |
* ComboGUI.java - GUI dla ComboBoxFetcher | * **ComboGUI.java** - GUI for ComboBoxFetcher |
* SliderGUI.java - GUI dla SliderFetcher | * **SliderGUI.java** - GUI for SliderFetcher |
* TwoListsGUI.java - GUI dla TwoListsFetcher | * **TwoListsGUI.java** - GUI for TwoListsFetcher |
| Download a source code {{:hekate:callbackslibrary.zip|here}}. |
Kod źródłowy klas do pobrania {{:hekate:callbackslibrary.zip|tutaj}}. | |
| |
==Przykład== | == Example == |
Aby wykorzystać któryś z komponentów Java do napisania callbacku, należy wykonać następujące kroki: | In order to use some of the above components to create callback, you must go through the following steps: |
- Skompilować kod źródłowy <code>javac callbacks/input/*.java skeleton/*.java</code> i umieścić go w katalogu z plikiem HMR | - Compile the source code <code>javac callbacks/input/*.java skeleton/*.java</code> and move it to the HMR file directory. |
- Odpowiednio zmodyfikować plik HMR dopisując atrybutom pole //callback// i uzupełniając go nazwą i listą parametrów jakie callback przyjmuje, np. <code>callback: [ask_symbolic_GUI,[day]]</code> | - Modify the HMR file by adding the //callback// filed to the appropriate attributes. |
- Dopisać predykaty //xcall// do pliku HMR, definiujące wywołanie callbacka, np.:<code> | - Define the value of this filed by entering the name of the callback as well as a list of parameters i.e. <code>callback: [ask_symbolic_GUI,[day]]</code> |
| - Add the //xcall// predicates to the HMR file, which execute a given callback:<code> |
xcall ask_symbolic_GUI : [AttName] >>> ( | xcall ask_symbolic_GUI : [AttName] >>> ( |
%Tworzymy obiekt kontrolera: | % Creating controller |
jpl_new('skeleton.RequestInterface',[],T), | jpl_new('skeleton.RequestInterface',[],T), |
%Przygotowujemy listę parametrów | % Creating a list of params |
alsv_domain(AttName,Domain,symbolic), | alsv_domain(AttName,Domain,symbolic), |
Params = [AttName|Domain], | Params = [AttName|Domain], |
term_to_atom(Params, AtomParams), | term_to_atom(Params, AtomParams), |
%Wywołujemy callback i podajemu my listę parametrów znajdującą sie | % Execute the callback with the params contained by AtomPArams term. |
%w termie AtomPArams. Wartosc zwrócona przez callback znajdzie się | % The result will be stored in Answer term. |
%w termie Answer. | |
jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer), | jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer), |
%Zamieniamy zwróconą wartość na term i dodajemy go do bazy faktów | % Map the returned value into term and add it the the factbase |
atom_to_term(Answer,Answer2,_), | atom_to_term(Answer,Answer2,_), |
alsv_new_val(AttName,Answer2)). | alsv_new_val(AttName,Answer2)). |
</code> | </code> |
- Uruchomić HeaRT w katalogu z plikiem HMR, skompilować ten plik i uruchomić wnioskowanie. Callbacki powinny zostać uruchomione. | - Go to HMR file directory. |
| - Run HeaRT tool. |
| - Compile HMR file. |
| - Run the inference mechanism. |
| - The callback should be executed. |
| |
**Ćwiczenie** | **Exercise 1** \\ |
Pobierz poniższy kod {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:kardio.zip|}}. I dla pliku HMR znajdującego się w archiwum uruchom wnioskowanie. | Download the file {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:kardio.zip|}} and run the inference for the HMR file. |
| |
=== Ćwiczenie === | **Exercise 2** \\ |
- Uruchom interpreter HeaRT, wczytaj {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|plik}} HMR i uruchom wnioskowanie predykatem (//gox/3//). Dopisz callback wyświetlający wynik wnioskowania w XPCE. | - Run HeaRT and load HMR {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|file}}. |
- Pobierz ten {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|plik}} HMR i dopisz (zmodyfikuj istniejące wersje prologowe) do niego callbacki w Javie bazując na przykładzie z poprzedniej sekcji. | - Then run the infenrence mechnism using predicate (//gox/3//). |
| - Add a new XPCE-based callback, which would present the results of the inference. |
| - Download HMR {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|file}}. |
| - Add (modify an existing Prolog-based) a new JAVA-based callbacks in the same way as in the previous section. |
| |
| |