Różnice

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

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
pl:miw:miw08_ruleruntimeg_2 [2008/02/18 23:24]
miw utworzono
pl:miw:miw08_ruleruntimeg_2 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ​ ====== Opis ====== ​
-Damian Janicki janicki.damian@gmail.com+__**Projekt zakończony**__ 
 + 
 +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
  
-XPCEQTGTK, GtkServer, Java etc., SWI Prolog documentation+    * output: Java/JPLFeasibility studya prototype.
  
-    * output+    * 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
  
-Feasibility study, a prototype.+[[pl:​miw:​miw08_ruleruntimeg_2_spotkania|Spotkania]]
  
-    * integration options for Java: JPL (SWI),​Logtalk (OO Prolog), architecture:​ MVC 
-    * approach: 2 -3 app. cases, M prolog, V inv 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 
-====== Spotkania ====== ​ 
 ====== Projekt ====== ====== 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 ====== ====== 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.1203373468.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