Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:miw08_ruleruntimeg_2 [2008/02/19 11:19]
gjn
pl:miw:miw08_ruleruntimeg_2 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ​ ====== Opis ====== ​
 +__**Projekt zakończony**__
 +
 Damian Janicki <​janicki.damian@gmail.com>​ 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) 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+    * input: XPCE, QT, GTK, GtkServer, Java etc., SWI Prolog documentation
  
-XPCE, QT, GTK, GtkServer, ​Java etc.SWI Prolog documentation +    * output: ​Java/JPL, Feasibility study, a prototype.
- +
-    * output +
- +
-Feasibility study, a prototype.+
  
     * integration options for Java: JPL (SWI),​Logtalk (OO Prolog), architecture:​ MVC     * 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+    * 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]]
  
-====== Spotkania ====== ​ 
-===== 08.03.04 ===== 
-  * prototyp dla car, tj. ask_question 
 ====== Projekt ====== ====== Projekt ======
-M: [[pl:​prolog:​prolog_lab:​prolog_lab_2#​tematprosty_system_ekspertowy]] +Oryginalny system ([[pl:​prolog:​prolog_lab:​prolog_lab_2#​tematprosty_system_ekspertowy]]
-V:+ 
 +=== 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 ====== ====== 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 ====== ====== Materiały ======
  
 +
 +[[http://​www.swi-prolog.org/​packages/​jpl/​|JPL - Prolog/Java interface]]
  
  
pl/miw/miw08_ruleruntimeg_2.1203416373.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (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