Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:miw:miw08_ruleruntimeg_2 [2008/07/01 19:26]
miw
pl:miw:miw08_ruleruntimeg_2 [2019/06/27 15:50]
Linia 1: Linia 1:
-====== 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]] 
- 
- 
- 
- 
- 
  
pl/miw/miw08_ruleruntimeg_2.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0