====== Opis ====== __**Projekt zakończony**__ Filip Haftek 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:== question(Result,T):- jpl_call('javax.swing.JOptionPane','showConfirmDialog',[(@null),T,'Question',0],X), change(X,Result). ==Predykat pokazujący informacje:== info(X):- jpl_call('javax.swing.JOptionPane','showMessageDialog',[(@null),X],F). ==Predykat get_yes_or_no:== Przed: get_yes_or_no(Result) :- get(Char), get0(_), interpret(Char,Result), !. Po: get_yes_or_no(Q,Result) :- ask_question(Q,X), question(Result,X). ==Predykat ask_question:== Przed: ask_question(fuel_is_ok) :- write('Look in the carburetor. Can you see or smell gasoline?'),nl. Po zmianach stał się termem: ask_question(fuel_is_ok,'Look in the carburetor. Can you see or smell gasoline?'). ==Predykat user_says:== Przed: user_says(Q,A) :- \+ stored_answer(Q,_), nl,nl, ask_question(Q), get_yes_or_no(Response), asserta(stored_answer(Q,Response)), Response = A. Po: user_says(Q,A) :- \+ stored_answer(Q,_), get_yes_or_no(Q,Response), asserta(stored_answer(Q,Response)), Response = A. [[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 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. * Predykat myQuestion/3 pokazuje okno z przyciskami do wyboru( tylko jeden można zaznaczyć) 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. * Predykat info/1 wyświetla okno z informacją info(X):- jpl_datums_to_array(X,Q), jpl_new('miw2.Info',[Q],D) 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 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)). * control/2 wyświetla okno sterowania, przyciski sterujące wczytywane są dynamicznie w konstruktorze 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. * readF/1 otwiera okno wyboru pliku z rozszerzeniem pl do załadowania readF(File):- jpl_new('miw2.PlFileChooser',[],F), jpl_call(F,getFile,[],File). 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}}