====== Opis ====== __**Projekt zakończony**__ Damian Janicki 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 == 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). == Predykat tworzący dialog, który wyświetla informacje o uszkodzeniach == show_explain_dialog(Tekst) :- jpl_call('javax.swing.JOptionPane', 'showMessageDialog', [@('null'),Tekst],_). == Predykat ask_question == Przed zmianami: 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. Po zmianach (korzysta z Java): 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). == Predykat explain == Przed zmianami: explain(wrong_gear) :- nl, write('Check that the gearshift is set to Park or Neutral.'),nl, write('Try jiggling the gearshift lever.'),nl. Po zmianach: explain(wrong_gear) :- show_explain_dialog('Check that the gearshift is set to Park or Neutral.Try jiggling the gearshift lever.'). == Predykat user_says: == Przed: user_says(Q,A) :- \+ stored_answer(Q,_), ask_question(Q), get_yes_or_no(Response), asserta(stored_answer(Q,Response)), Response = A. Po: user_says(Q,A) :- \+ stored_answer(Q,_), ask_question(Q,Response), asserta(stored_answer(Q,Response)), Response = A. V: Interfejs w Javie == Funkcja wywolujaca prologa == private void startDiagnose(){ Query queryConsult = new Query("consult", new Atom("pl/carJPL.pl")); queryConsult.query(); Query start = new Query("start"); start.query(); } === 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 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); } } Predykat show_yes_no_dialog : show_yes_no_dialog(Tekst,Response) :- jpl_call('dialog.MessageDialogs', 'showYesNoDialog', [Tekst], Response). [[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]]