|
|
pl:miw:miw08_ruleruntimeg_2 [2008/07/01 19:26] miw |
pl:miw:miw08_ruleruntimeg_2 [2019/06/27 15:50] |
====== Opis ====== | |
Damian Janicki <janicki.damian@gmail.com> | |
| |
Investigate runtime integration aspects, mainly semi-automatical building of a GUI for Prolog programs possibilities XPCE, Static QT/Gtk, Gtk-Server, Java (Swing), Eclipse (SWT) | |
| |
* input: XPCE, QT, GTK, GtkServer, Java etc., SWI Prolog documentation | |
| |
* output: Java/JPL, Feasibility study, a prototype. | |
| |
* integration options for Java: JPL (SWI),Logtalk (OO Prolog), architecture: MVC | |
* approach: 2 -3 app. cases, M prolog, V in Java, C -> JPL/Logtalk, e.g. ready M in Prolog, build V in Java: Car ES, opposite: ready MV i Java, build M in Prolog, make it work with the V | |
| |
[[pl:miw:miw08_ruleruntimeg_2_spotkania|Spotkania]] | |
====== Projekt ====== | |
Oryginalny system ([[pl:prolog:prolog_lab:prolog_lab_2#tematprosty_system_ekspertowy]]) | |
| |
=== Wersja 1 === | |
| |
== Predykat tworzący dialog, za pomocą, którego pobieramy informacje od użytkownika == | |
<code prolog> | |
show_yes_no_dialog(Tekst,Response) :- | |
jpl_new(array(class([java,lang],['String'])),['yes','no'], ArrayRef), | |
jpl_get(ArrayRef,0,ArrayPosRef), | |
jpl_get('javax.swing.JOptionPane', 'YES_NO_OPTION', YesNoRef), | |
jpl_get('javax.swing.JOptionPane', 'QUESTION_MESSAGE', QuestionRef), | |
jpl_call('javax.swing.JOptionPane', 'showOptionDialog', [@(null), | |
Tekst, | |
'Question', | |
YesNoRef, | |
QuestionRef, | |
@(null), | |
ArrayRef, | |
ArrayPosRef], | |
RetVal), | |
interpret(RetVal,Response). | |
| |
interpret(1,no). | |
interpret(0,yes). | |
</code> | |
| |
== Predykat tworzący dialog, który wyświetla informacje o uszkodzeniach == | |
<code prolog> | |
show_explain_dialog(Tekst) :- | |
jpl_call('javax.swing.JOptionPane', 'showMessageDialog', [@('null'),Tekst],_). | |
</code> | |
| |
| |
== Predykat ask_question == | |
Przed zmianami: | |
<code prolog> | |
ask_question(starter_was_ok) :- | |
write('When you first started trying to start the car,'),nl, | |
write('did the starter crank the engine normally? '),nl. | |
</code> | |
| |
Po zmianach (korzysta z Java): | |
<code prolog> | |
ask_question(starter_was_ok,Res) :- | |
show_yes_no_dialog('When you first started trying to start the car did the starter crank the engine normally?',Res). | |
</code> | |
| |
== Predykat explain == | |
Przed zmianami: | |
<code prolog> | |
explain(wrong_gear) :- | |
nl, | |
write('Check that the gearshift is set to Park or Neutral.'),nl, | |
write('Try jiggling the gearshift lever.'),nl. | |
</code> | |
| |
Po zmianach: | |
<code prolog> | |
explain(wrong_gear) :- | |
show_explain_dialog('Check that the gearshift is set to Park or Neutral.Try jiggling the gearshift lever.'). | |
</code> | |
| |
== Predykat user_says: == | |
Przed: | |
<code prolog> | |
user_says(Q,A) :- \+ stored_answer(Q,_), | |
ask_question(Q), | |
get_yes_or_no(Response), | |
asserta(stored_answer(Q,Response)), | |
Response = A. | |
</code> | |
Po: | |
<code prolog> | |
user_says(Q,A) :- \+ stored_answer(Q,_), | |
ask_question(Q,Response), | |
asserta(stored_answer(Q,Response)), | |
Response = A. | |
</code> | |
| |
V: Interfejs w Javie | |
== Funkcja wywolujaca prologa == | |
<code java> | |
private void startDiagnose(){ | |
Query queryConsult = new Query("consult", new Atom("pl/carJPL.pl")); | |
queryConsult.query(); | |
| |
Query start = new Query("start"); | |
start.query(); | |
} | |
</code> | |
| |
=== Wersja 2 === | |
W stosunku do wersji pierwszej deklaracje dialogów z pytaniem do użytkownika znajduja się w klasie MessageDialogs. Dzieki temu poziomu prologu wołana jest tylko jedna funkcja: | |
| |
Klasa MessageDialogs | |
<code java> | |
import javax.swing.JOptionPane; | |
| |
public class MessageDialogs { | |
| |
public static String showYesNoDialog(String A_strMessage) | |
{ | |
String strRetVal = new String(""); | |
Object[] options = {"Yes", "No"}; | |
int nRetVal = JOptionPane.showOptionDialog( null, | |
A_strMessage, | |
"Question", | |
JOptionPane.YES_NO_OPTION, | |
JOptionPane.QUESTION_MESSAGE, | |
null, | |
options, | |
options[0]); | |
| |
if(nRetVal == 1) | |
strRetVal = "yes"; | |
else if (nRetVal == 0) | |
strRetVal = "no"; | |
| |
return strRetVal; | |
} | |
| |
public static void showInformation(String A_strMessage){ | |
JOptionPane.showMessageDialog(null, A_strMessage); | |
} | |
} | |
</code> | |
| |
Predykat show_yes_no_dialog : | |
<code prolog> | |
show_yes_no_dialog(Tekst,Response) :- | |
jpl_call('dialog.MessageDialogs', 'showYesNoDialog', [Tekst], Response). | |
</code> | |
| |
| |
[[pl:miw:miw08_ruleruntimeg_2:pliki|Źródła projektu]] | |
| |
| |
| |
====== Sprawozdanie ====== | |
[[pl:miw:miw08_ruleruntimeg_2:pliki|Źródła projektu]] | |
| |
===== Cel projektu ===== | |
Celem projektu było stworzenie aplikacji, której modelem jest jest program Varda napisany w języku prolog, natomiast interfejs miał być stworzony w języku java. Komunikacja pomiędzy java, a prologiem miała odbywać się za pomocą biblioteki JPL. | |
| |
===== Wykonanie ===== | |
W ramach projektu udało się zrealizować interfejs graficzny napisany w języku Java do programu Varda. Program składa się z klas java, które tworzą GUI, oraz klas, które są odpowiedzialne za komunikacje z prologiem. W projekcie znajduje się także plik prologa, gdzie zdefiniowane są odpowiednie zapytania pobierające informacje z programu varda. | |
| |
| |
| |
==== Najważniejsze pliki ==== | |
* MainFrame.java - klasa tworząca interfejs użytkownika | |
| |
* SplitData.java - klasa przetrzymująca informacje o elementach, na których należy wykonać operacje split | |
| |
* VardaControl.javc - klasa, która za pomocą odpowiednich predykatów pobiera informacje z programu Varda, które następnie przekazywane są do MainFrame lub do SplitData (dla operacji split). Klasa odpowiada również za wysyłanie danych do prologa gdy wykonujemy operacje takie jak split, finalize. | |
| |
* gui_query.pl - plik prologa, w którym znajdują się predykaty potrzebne do pobierania informacji z programu varda, np. pobieranie atrybutów które możemy zesplitowac, lub zfinalizować w danym momencie. | |
| |
| |
==== Funkcje programu ==== | |
Program posiada wszystkie możliwości programu Varda. Za pomocą interfejsu graficznego możemy dodawać atrybuty, tworzyć nowe property, a także wykonywac operacje finalize i split. Program jest tak skonstruowany aby użytkownik w danym momencie mógł wykonać tylko dozwolone operacje. | |
Dodatkowo z poziomu programu możemy wyświetlić diagramy ARD, TPH, wygenerować i wyświetlić XTT. | |
| |
| |
| |
| |
===== Uruchomianie projektu ===== | |
Aby uruchomić program należy posiadać bibliotekę JPL. Sposób instalacji oraz źródła projektu znajdują się [[pl:miw:miw08_ruleruntimeg_2:pliki|tutaj]] | |
$PROLOG_HOME/lib/i386-linux/ - jest scieżka do katalogu w którym znajduje się plik libjpl.so | |
$PROLOG_HOME jest scieżką do katalogu w którym zainstalowany jest Swi-prolog. | |
| |
| |
Istnieją trzy możliwości uruchomienia projektu: | |
| |
* Należy sciągnąć {{:pl:miw:miw08_ruleruntimeg_2:Varda_source.tar.gz|źródła }} projektu i następnie skompilować je za pomocą polecenia javac: | |
| |
javac -classpath $PROLOG_HOME/lib/jpl.jar . | |
gdzie zmienna $PROLOG_HOME jest scieżką do katalogu w którym zainstalowany jest Swi-prolog. | |
| |
Następnie uruchamiamy projekt za pomocą polecenia: | |
| |
java -classpath $PROLOG_HOME/lib/jpl.jar -Djava.library.path=$LD_LIBRARY_PATH:$PROLOG_HOME/lib/i386-linux/ .:$PROLOG_HOME/lib/jpl.jar MainFrame | |
| |
* Drugim sposobem jest ściągniecie już skompilowanego {{:pl:miw:miw08_ruleruntimeg_2:varda_jar.tar.gz|projektu}}, który należy uruchomić poleceniem: | |
| |
java -jar -Djava.library.path=$LD_LIBRARY_PATH:$PROLOG_HOME/lib/i386-linux/ -classpath $PROLOG_HOME/lib/jpl.jar VardaFrame_fat.jar | |
| |
* Trzecim sposobem jest ściągniecie projektu eclipse {{:pl:miw:miw08_ruleruntimeg_2:varda_projektEclipsee.tar.gz|z archiwum tar.gz}} lub z repozytorium SVN: | |
| |
http://svn2.assembla.com/svn/MIVprojekt/VardaFrame | |
| |
| |
| |
| |
| |
| |
====== Materiały ====== | |
| |
| |
[[http://www.swi-prolog.org/packages/jpl/|JPL - Prolog/Java interface]] | |
| |
| |
| |
| |
| |
| |