To jest stara wersja strony!
Język HMR
Język HMR został stworzony w celu tekstowej reprezentacji diagramów XTT^2. Jego składnia została zaprojektowana z uwzględnieniem języka w którym implementowany był HeaRT; innymi słowy, składnia języka HMR jest podzbiorem podstawowej składni Prologu, wzbogaconym o kilka dodatkowych operatorów, odzwierciedlajšcych relacje zachodzšce pomiędzy elementami XTT.
Plik HMR składa się z następujšcych sekcji:
Definicje typów (predykat \textit{xtype}),
Opcjonalne definicje grup typów (predykat \textit{xtpgr}),
Definicje atrybutów (predykat \textit{xattr}),
Opcjonalne definicje grup atrybutów (predykat \textit{xatgr}),
Definicje schematów (tabel) (predykat \textit{xschm}),
Definicje reguł (predykat \textit{xrule}),
Opcjonalne definicje stanów (predykat \textit{xstat}).
Opcjonalne definicje callbacków (predykat xcall)
Każdy z wymienionych predykatów (za wyjštkiem \textit{xschm} i \textit{xrule}) strukturalnie odpowiada liście w języku Prolog, której elementy opisujš własności obiektu XTT reprezentowanego przez dany predykat.
Na przykład definicja typu weekdays i atrybutu day wygląda tak jak poniżej (fragment wziety z pliku Thermostat:
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)).
Cwiczenie
Porównaj plik HMR z modelem XTT2:
Callbacks w 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 wyswietlenia okna pobierającego PIN i do wyświetlania komunikatów dla użytkonika.
rysunek
Wyróżnia się dwa typy callbacków:
in - wywołują sie one rpzed rozpoczęciem (lub w trakcie działania) wniskowania w celu pobrania wartości atrybutów wymaganych do przeprowadzenia inferencji.
out - wywołują sie 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 okreslajacym jaki callback ma byc wywołany dla danego atrybutu, jest pole callback. Jets ono postaci listy, której pierwszy element jest naazwą callbaku do wywołania a drugi jest listą parametrów jakie chcemy przekazać callbackowi:
comm: in,
callback: [ask_symbolic_GUI,[day]]
Powyższy kod oznacza, że dla atrybutu w którym się on pojawi będzie wyołany callback typu in o nazwie ask_symbolic_GUI, pobierajacy jako parametr jedną wartość day.
Atrybuty a callbacki
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:
Za definicję callbacku odpowieni jest predykat xcall umieszczany w pliku HMR. Na poniższym przykładzie pokazano wykorzystanie mechanizmu JPL do utworzenia callbacku napisanego w Javie.
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)).
Języki programowania
Callbacki dla interpretera HeaRT moga być zaimplementowane w jednym z następujacych jezyków:
Prolog
Są to zwykłe predykaty w języku Prolog:
xcall ask_console : [AttName] >>> (write('Type value for attribute: '),
write(AttName),nl,
read(Answer),
alsv_new_val(AttName,Answer)).
Ćwiczenie
Aby uruchomić wnioskowanie bezpośrednio z interperera HeaRT, nalezy pobrać kod interpretera: HeaRT i uruchomić go poleceniem heart. W celu skompilowania modelu XTT zapisango w pliku HMR nalezy po uruchomieniu HeaRT wpisac w konsoli Prologa [nazwa-pliku-hmr] - zwyczajnie skompilowac ten plik tak jak kazdy inny kod Prologu. Nastepnie w celu uruchomienia wnioskowania należy wpisać polecenie
gox(current, ListaTabelDoPrzetworzenia, ddi)
.
Uruchom wnioskowanie dla poniższego modelu: thermostat-clb-pl
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:
xcall xpce_ask_numeric: [AttName] >>> (
dynamic(end),
% Ciało callbacku przygotowujace okienko do wyświetlenia i wyświetlające je
repeat,
%Oczekiwanie na wciśnięcie przez użytkownika przycisku OK
send(@display,dispatch),
end,!,
retractall(end)).
Przykład callbacku wczytującego liczbę z określonego zakresu pokazany jest poniżej:
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)).
Ćwiczenie
Uruchom wnioskowanie dla przykładu z bankomatem i prześledź działanie callbacków:
Java
Są to programy napisane w języku Java uruchamiane przez prolog przy użyciu JPL. Aby wykorzystać ten mechanizm nalezy korzystać ze specjlanie przygotowanych do tego klasy:
DataFetcher.java - klasa abstrakcyjna którą muszą rozszerzać wszystkei callbacki
RequestInterface.java - Kontroler
Response.java - klasa przechowująca dane odebrane od użytkownika.
W celu ulatwienia implementacji niektórych callbacków, przygotowano zbiór podstawowych komponentów do pobierania danych od użytkonwnika:
ComboBoxFetcher.java - przyjmuje listę wartości z jakich można wybierać. Zwraca jedną wybraną wartość
SliderFetcher.java - przyjmuje przedział wartości numerycznych między którymi można wybierać. Zwraca jedn wybraną wartość.
TwoListsFetcher.java - przyjmuje listę wartości jakich można wybierać i zwraca również listę wybranych wartości.
ComboGUI.java -
GUI dla ComboBoxFetcher
SliderGUI.java -
GUI dla SliderFetcher
TwoListsGUI.java -
GUI dla TwoListsFetcher
Kod źródłowy klas do pobrania tutaj.
Przykład
Bazując na tym pliku HMR.
Aby wykorzystać któryś z komponentów Java do napisania callbacku, należy wykonać następujące kroki:
Skompilować kod źródłowy
i umiescic go w katalogu z plikiem HMR
Odpowiednio zmodyfikować plik HMR dopisując atrybutom pole
callback i uzupełniając og nazwą i listą parametrów jakie callback przyjmuje
callback: [ask_symbolic_GUI,[day]]
Dopisać predykaty
xcall do pliku HMR, definiujące wywołanie callbacka:
xcall ask_symbolic_GUI : [AttName] >>> (
%Tworzymy obiekt kontrolera:
jpl_new('skeleton.RequestInterface',[],T),
%Przygotowujemy listę parametrów
alsv_domain(AttName,Domain,symbolic),
Params = [AttName|Domain],
term_to_atom(Params, AtomParams),
%Wywołujemy callback i podajemu my listę parametrów znajdującą sie
%w termie AtomPArams. Wartosc zwrócona przez callback znajdzie się
%w termie Answer.
jpl_call(T,request,['callbacks.input.ComboBoxFetcher',AtomParams],Answer),
%Zamieniamy zwróconą wartość na term i dodajemy go do bazy faktów
atom_to_term(Answer,Answer2,_),
alsv_new_val(AttName,Answer2)).
Uruchomic HeaRT w katalogu z plikiem HMR i uruchomić wnioskowanie. Callbacki powinny zostać uruchomione.
Ćwiczenie
Pobierz poniższy kod paczka.zip, uruchom i przetestuj działanie.
Ćwiczenie
Uruchom interpreter HeaRT, wczytaj plik HMR i uruchom wnioskowanie predykatem (goxio/2). Dopisz callback wyswietlajacy wynik wnioskowania w XPCE.
Pobierz ten
plik] HMR i dopisz do niego callbacki w Javie bazując na przykładzie z poprzeniej sekcji.