Opis
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)
input: XPCE, QT, GTK, GtkServer, Java etc., SWI Prolog documentation
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
Spotkania
Projekt
Wersja 1
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).
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).
Źródła projektu
Sprawozdanie
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
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ę tutaj
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ąć
źródła projektu i następnie skompilować je za pomocą polecenia javac:
javac -classpath PROLOG_HOME jest scieżką do katalogu w którym zainstalowany jest Swi-prolog.
Następnie uruchamiamy projekt za pomocą polecenia:
java -classpath LD_LIBRARY_PATH:PROLOG_HOME/lib/jpl.jar MainFrame
Drugim sposobem jest ściągniecie już skompilowanego
projektu, który należy uruchomić poleceniem:
java -jar -Djava.library.path=PROLOG_HOME/lib/i386-linux/ -classpath $PROLOG_HOME/lib/jpl.jar VardaFrame_fat.jar
Trzecim sposobem jest ściągniecie projektu eclipse
z archiwum tar.gz lub z repozytorium SVN:
http://svn2.assembla.com/svn/MIVprojekt/VardaFrame
Materiały