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
  • 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

Spotkania

Projekt

Oryginalny system (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).

Ź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

  • 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ę 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ąć ź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 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 z archiwum tar.gz lub z repozytorium SVN:

http://svn2.assembla.com/svn/MIVprojekt/VardaFrame

Materiały

pl/miw/miw08_ruleruntimeg_2.txt · ostatnio zmienione: 2017/07/17 08:08 (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