====== HMR language ====== The HMR language has been designed to textual human and machine redable representation of XTT2 models. The syntax of the HMR is a subset of Prolog syntax where a number of operators have been defined. Each HMR file consists of the following parts: * [requied] Types definitions (predicate //xtype//), * [optional] Types groups definitions (predicate //xtpgr//), * [requied] Attributes definitions (predicate //xattr//), * [optional] Attributes groups definitions (predicate //xatgr//), * [requied]Definicje schematów (tabel) (predicate //xschm//), * [requied] Rules definitions (predicate //xrule//), * [optional] States definitions (predicate //xstat//). * [optional] Callbacks definitions (predicate //xcall//) Each of predicates (besides //xschm// and //xrule//) is a Prolog list, which defines the properities of a XTT object. In example, the definitions of type //weekdays// and an attribute //day// is as follows: xtype [name: weekdays, base: symbolic, desc: 'A set of days of the week', domain: ['Monday'/1,'Tuesday'/2,'Wednesday'/3,'Thursday'/4,'Friday'/5,'Saturday'/6,'Sunday'/7], ordered: yes ]. xattr [name: day, abbrev: day, class: simple, type: weekdays, comm: in, callback: [ask_symbolic_GUI,[day]], desc: 'The current day' ]. xcall ask_symbolic_GUI : [AttName] >>> (jpl_new('skeleton.RequestInterface',[],T), alsv_domain(AttName,Domain,symbolic), Params = [AttName|Domain], term_to_atom(Params, AtomParams), jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer), atom_to_term(Answer,Answer2,_), alsv_new_val(AttName,Answer2)). === Exercise === Compare the HMR file with XTT model: * HMR file: {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} * XTT file: {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-xtt.png|}} ====== Callbacks in HMR ====== 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|}} 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. HMR syntax provides a **callback** property of the XTT attribute that indicates which callback function should be called. 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. xattr [name: day, abbrev: day, class: simple, type: day, comm: in, callback: [ask_console,[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**. ==== Callbacks and attributes ==== In HMR, callbacks are related to attributes. For each attribute two properties must be defined in order to use callbacks: * //comm// - defines when the callback is executed (possible values: //in// or //out//) * //callback// - the name and the list of parameters of the required callback. 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. xcall ask_symbolic_GUI : [AttName] >>> (jpl_new('skeleton.RequestInterface',[],T), alsv_domain(AttName,Domain,symbolic), Params = [AttName|Domain], term_to_atom(Params, AtomParams), jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer), atom_to_term(Answer,Answer2,_), alsv_new_val(AttName,Answer2)). ==== Programming languages ==== HeaRT supports the callbacks written in: * Prolog * XPCE * Java === Prolog === Prolog-based callbacks are an ordinary Prolog predicates. xcall ask_console : [AttName] >>> (write('Type value for attribute: '), write(AttName),nl, read(Answer), alsv_new_val(AttName,Answer)). **Exercise** \\ In order to run inference process directly from HeaRT interpreter you must: * 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:gox(current, ListOfProcessedTables, ddi) Run the inference for the following model: {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:thermostat-clb-pl.pl|}} === XPCE === 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: xcall xpce_ask_numeric: [AttName] >>> ( dynamic(end), % The body of the callback, which prepares a dialog to appear. repeat, % Waiting for OK button send(@display,dispatch), end,!, retractall(end)). The example of the callback that reads a value from the range [Min; Max] is presented below: xcall xpce_ask_numeric: [AttName] >>> (alsv_domain(AttName,[Min to Max],numeric), dynamic(end), new(@dialog,dialog('Select a value')), send_list(@dialog,append, [new(I,int_item(AttName,low := Min, high := Max)), new(_,button('Select',and(message(@prolog,assert,end),and(message(@prolog,alsv_new_val,AttName,I?selection),message(@dialog,destroy)))))]), send(@dialog,open), repeat, send(@display,dispatch), end,!, retractall(end)). **Exercise** \\ Run the inference mechanism for the ATM example and trace the callback mechanism: * {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|}} === Java === The Java-based callbacks are the Java programs that are executed by prolog with the help of JPL. To exploit this mechanism, the following classes mysu be used: * DataFetcher.java - an abstract class that must be inherited by all the callbacks * RequestInterface.java - controller * Response.java - class that stores a data retrieved from a user. 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** - creates a list of selectable values. It returns one (selected) value. * **SliderFetcher.java** - allowf for selecting a value from a given range of values. It returns one (selected) value. * **TwoListsFetcher.java** - creates a list of selectable values. It returns list of all selected values. * **ComboGUI.java** - GUI for ComboBoxFetcher * **SliderGUI.java** - GUI for SliderFetcher * **TwoListsGUI.java** - GUI for TwoListsFetcher Download a source code {{:hekate:callbackslibrary.zip|here}}. == Example == In order to use some of the above components to create callback, you must go through the following steps: - Compile the source code javac callbacks/input/*.java skeleton/*.java and move it to the HMR file directory. - Modify the HMR file by adding the //callback// filed to the appropriate attributes. - Define the value of this filed by entering the name of the callback as well as a list of parameters i.e. callback: [ask_symbolic_GUI,[day]] - Add the //xcall// predicates to the HMR file, which execute a given callback: xcall ask_symbolic_GUI : [AttName] >>> ( % Creating controller jpl_new('skeleton.RequestInterface',[],T), % Creating a list of params alsv_domain(AttName,Domain,symbolic), Params = [AttName|Domain], term_to_atom(Params, AtomParams), % Execute the callback with the params contained by AtomPArams term. % The result will be stored in Answer term. jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer), % Map the returned value into term and add it the the factbase atom_to_term(Answer,Answer2,_), alsv_new_val(AttName,Answer2)). - Go to HMR file directory. - Run HeaRT tool. - Compile HMR file. - Run the inference mechanism. - The callback should be executed. **Exercise 1** \\ Download the file {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:kardio.zip|}} and run the inference for the HMR file. **Exercise 2** \\ - Run HeaRT and load HMR {{:pl:dydaktyka:piw:2010:systemy_ekspertowe:cashpoint-clb-xpce.pl|file}}. - 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. ===== Komentarze ===== Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-)