|
|
pl:miw:miw08_ruleruntimeg [2008/06/15 22:34] miw |
pl:miw:miw08_ruleruntimeg [2019/06/27 15:50] |
====== Opis ====== | |
__**Projekt zakończony**__ | |
| |
Filip Haftek <filiphaftek@o2.pl> | |
| |
Investigate runtime integration aspects, mainly | |
semi-automatical building of a GUI for Prolog programs possibilities | |
XPCE, Static QT/Gtk, [[http://www.gtk-server.org|Gtk-Server]], Java (Swing), Eclipse (SWT) | |
* input | |
XPCE, QT, GTK, GtkServer, Java etc., SWI Prolog documentation | |
* output | |
Feasibility study, a prototype. | |
* 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: [[pl:prolog:prolog_lab:prolog_lab_2#cwiczenieprosty_system_ekspertowy|Car ES]], opposite: ready MV i Java, build M in Prolog, make it work with the V | |
| |
__SWING__ __LogTalk__ | |
| |
| |
====== Spotkania ====== | |
[[pl:miw:miw08_ruleruntimeg:spotkania]] | |
| |
============ Projekt ====== | |
| |
============ 1. PROSTY SYSTEM EKSPERCKI ====== | |
==Predykat tworzący okno z pytaniem:== | |
<code prolog> | |
question(Result,T):- | |
jpl_call('javax.swing.JOptionPane','showConfirmDialog',[(@null),T,'Question',0],X), | |
change(X,Result). | |
</code> | |
==Predykat pokazujący informacje:== | |
<code prolog> | |
info(X):- | |
jpl_call('javax.swing.JOptionPane','showMessageDialog',[(@null),X],F). | |
</code> | |
| |
==Predykat get_yes_or_no:== | |
Przed: | |
<code prolog> | |
get_yes_or_no(Result) :- get(Char), | |
get0(_), | |
interpret(Char,Result), | |
!. | |
</code> | |
Po: | |
<code prolog> | |
get_yes_or_no(Q,Result) :- | |
ask_question(Q,X), | |
question(Result,X). | |
</code> | |
==Predykat ask_question:== | |
Przed: | |
<code prolog> | |
ask_question(fuel_is_ok) :- | |
write('Look in the carburetor. Can you see or smell gasoline?'),nl. | |
</code> | |
Po zmianach stał się termem: | |
<code prolog> | |
ask_question(fuel_is_ok,'Look in the carburetor. Can you see or smell gasoline?'). | |
</code> | |
==Predykat user_says:== | |
Przed: | |
<code prolog> | |
user_says(Q,A) :- \+ stored_answer(Q,_), | |
nl,nl, | |
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,_), | |
get_yes_or_no(Q,Response), | |
asserta(stored_answer(Q,Response)), | |
Response = A. | |
</code> | |
[[pl:miw:miw08_ruleruntimeg:car|Plik car.pl]] | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
============ 2. ZAAWANSOWANE SYSTEMY EKSPERCKIE ====== | |
== 2.1 XSHELL System do rozpoznowania ryb:== | |
* Predykat question2/2 pokazuje okno z pytaniem oraz przyciskami YES i NO | |
<code prolog> | |
question2(Result,Question):- | |
jpl_datums_to_array(Question,Q), | |
jpl_new('miw2.YNQuestion',[Q],D), | |
jpl_call(D,setVisible,[@(true)],_), | |
jpl_call('miw2.YNQuestion',getValue,[],V), | |
Result = V. | |
</code> | |
* Predykat myQuestion/3 pokazuje okno z przyciskami do wyboru( tylko jeden można zaznaczyć) | |
<code prolog> | |
myQuestion(Question,Choices,Response):- | |
jpl_datums_to_array(Choices,L), | |
jpl_datums_to_array(Question,Q), | |
jpl_new('miw2.MyRBForm',[L,Q],F), | |
jpl_call(F,setVisible,[@(true)],_), | |
jpl_call('miw2.MyRBForm',getValue,[],V), | |
Response = V. | |
</code> | |
* Predykat info/1 wyświetla okno z informacją | |
<code prolog> | |
info(X):- | |
jpl_datums_to_array(X,Q), | |
jpl_new('miw2.Info',[Q],D) | |
</code> | |
Zmienione pliki: | |
* [[pl:miw:miw08_ruleruntimeg:oops|oops.pl]] | |
* [[pl:miw:miw08_ruleruntimeg:animal_kb|animal_kb.pl]] | |
| |
== 2.2 OOPS System do produkcji zabawek :== | |
* Problem: Po załadowaniu danych wejsciowych, przy próbie ponownego załadowania danych program wczytuje do bazy prologu dane z pierwszego wczytania, trzeba zamknąć aplikacje i uruchomić ponownie. | |
* Predykat initial/0 wyświetla okno z wszystkimi możliwymi danymi wejściowymi z możliwością zaznaczenia dowolnej ilości danych | |
<code prolog> | |
initial:- | |
jpl_datums_to_array([dane_wejsciowe],L), | |
jpl_new('miw2.MyCBForm',[L,'Choose facts:'],D), | |
jpl_call(D,getChecked,[],_), | |
jpl_get('miw2.MyCBForm',termos,{C}), | |
assert(initial_data(C)). | |
</code> | |
* control/2 wyświetla okno sterowania, przyciski sterujące wczytywane są dynamicznie w konstruktorze | |
<code prolog> | |
control(X,Buttons):- | |
repeat, | |
jpl_datums_to_array(Buttons,B), | |
jpl_new('miw2.ControlForm',[X,B],F), | |
jpl_call(F,getValue,[],V), | |
change(V,Z), | |
doit(Z), | |
Z = exit. | |
</code> | |
* readF/1 otwiera okno wyboru pliku z rozszerzeniem pl do załadowania | |
<code prolog> | |
readF(File):- | |
jpl_new('miw2.PlFileChooser',[],F), | |
jpl_call(F,getFile,[],File). | |
</code> | |
Zmienione pliki: | |
* [[pl:miw:miw08_ruleruntimeg:xshell|xshell.pl]] | |
* [[pl:miw:miw08_ruleruntimeg:cichild|cichild.pl]] | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
====== Sprawozdanie ====== | |
== 1.Cel projektu :== | |
Celem projektu było swtorzenie aplikacji MV, w której modelem jest program napisany w języku prolog, natomiast interfejs został stworzony w Javie. | |
== 2. Wykonanie :== | |
W projekcie zastosowano 6 klas Javy odpowiedzialnych za wyświetlanie odpowiednich okien w trakcie działania programu. Szczegółowy opis klas znajduje się poniżej, natomiast cały projekt Javy wraz z dokumentacją znajduje się w części Materiały. Dodatkowo stworzono 6 predykatów, których opis znajduje się w części Projekt. | |
Aby uruchomić program należy wpisać odpowiednią komendę w prologu ( main. lub xshell. w zależności od programu), następnie pojawi się okienko Javy z informacją. Dalsza obsługa aplikacji polega na klikaniu odpowiednich przycisków zgodnie z pojawiającymi się instrukcjami. | |
Klasy Javy zostały napisane w możliwie uniwersalny sposób tzn: | |
* klasa Info posiada 3 różne konstruktory w celu ułatwienia obsługi jej z poziomu prologu ( String[], Compound[] lub String) | |
* klasa ControlForm jako argument pobiera Insrtukcję oraz listę przycisków, po wciśnięciu przycisku zwracana jest jego wartośc tj. 1 dla pierwszego, 2 dla kolejnego itp., co wymaga jedynie zastosowania z poziomu języka prolog zamiany wartości liczbowej na dowolną wartość. | |
| |
UWAGA: W programie OOPS po załadowaniu pliku z danymi i wybraniu odpowiednich danych startowych, aby dokonać ponownego załadowania danych wejściowych należy zamknąć program i uruchomić ponownie. | |
== 3. Zastosowane klasy i predykaty :== | |
1. Klasy Javy wykorzystywane z poziomu języka Prolog: | |
* Info - odpowiada za wyświetlanie okna z informacją [[pl:miw:miw08_ruleruntimeg:info|Info.java]] | |
* MyRBForm - okno z RadioButtonami [[pl:miw:miw08_ruleruntimeg:myrbform|MyRBForm.java]] | |
* MyCBForm - okno z CheckBoxami | |
* YNQuestion - okno z pytaniem oraz przyciskami YES i NO [[pl:miw:miw08_ruleruntimeg:ynquestion|YNQuestion.java]] | |
* ControlForm - okno z przyciskami do sterowania aplikacją [[pl:miw:miw08_ruleruntimeg:controlform|ControlForm.java]] | |
* PlFileChooser - okno z wyborem pliku prologu [[pl:miw:miw08_ruleruntimeg:plfilechooser|PlFileChooser.java]] | |
| |
2. Predykaty wykorzystyjuące klasy Javy: | |
* myQuestion(Question,Choices,Response) | |
* question2(Result,Question) | |
* info(X) | |
* initial | |
* readF(File) | |
* control(X,Buttons) | |
Dokładny opis predykatów znajduje się w części Projekt. | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
====== Materiały ====== | |
| |
[[pl:miw:miw08_ruleruntimeg:wymagania|Wymagania]] | |
| |
Spakowany projekt Javy - {{:pl:miw:miw08_ruleruntimeg:miw2.zip|miw2.zip}} | |
| |
Do projektu CAR: | |
{{:pl:miw:miw08_ruleruntimeg:car.pl|car.pl}} | |
| |
Do projektu OOPS: | |
{{:pl:miw:miw08_ruleruntimeg:oops.pl|oops.pl}} | |
{{:pl:miw:miw08_ruleruntimeg:animal_kb.pl|animal_kb.pl}} | |
| |
Do projektu XSHELL: | |
{{:pl:miw:miw08_ruleruntimeg:xshell.pl|xshell.pl}} | |
{{:pl:miw:miw08_ruleruntimeg:cichlid.pl|cichlid.pl}} | |
{{:pl:miw:miw08_ruleruntimeg:readstr.pl|readstr.pl}} | |
{{:pl:miw:miw08_ruleruntimeg:readnum.pl|readnum.pl}} | |
{{:pl:miw:miw08_ruleruntimeg:writeln.pl|writeln.pl}} | |