Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:miw08_ruleruntimeo [2008/05/31 13:44]
miw wstep
pl:miw:miw08_ruleruntimeo [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ====== Opis ======
 +__**Projekt zakończony**__
  
 **Grzegorz Caban**, <​grzegorz.caban@gmail.com>​ **Grzegorz Caban**, <​grzegorz.caban@gmail.com>​
Linia 8: Linia 9:
 Feasibility study, a prototype. ​ Feasibility study, a prototype. ​
  
-====== Spotkania ===========  +[[pl:​miw:​miw08_ruleruntimeo:​spotkania | Historia spotkań ]]
-==== 08.03.04 ==== +
- +
  
-==== 080318 ==== 
-  * integr LogTalk+Java 
-  * porówn Sicstus LT 
-  * zbadać http://​www.ncc.up.pt/​yap/​documentation.html http://​amzi.com/​ 
  
  
 +====== Projekt ======
 +  * {{:​pl:​miw:​mvceditorlogtalk.zip|Edytor Tekstu oparty o MVC}} -  View i Controller w J2SE, Model w Logtalk, modyfikacja istniejącej aplikacji napisanej w całości w J2SE, podmiana Model na Logtalk + implementacja integracji Java <-> Logtalk w Controller
 +  * {{:​pl:​miw:​thermostatlogtalk.zip|Termostat oparty o MVC}} -  View i Controller w J2SE, Model w Logtalk, przykład termostatu zaimplementowanego od podstaw w Javie i Logtalk'​u na podstawie ​ [[hekate:​hekate_case_thermostat|modelu reguł]].
  
  
 +==== Uruchomienie ====
 +Oba powyższe projekty to skompresowane projekty Eclipse, aby je uruchomić należy :
 +  - Rozpakować zawartość archiwum do wybranego przez siebie folderu, ​
 +  - Uruchomić Ecplipse IDE i jako Workspace wybrać folder wybrany w punkcie pierwszym
 +  - Nastepnie z menu kontekstowego Eclipse wybieramy **File -> New Project** ​
 +  - W oknie dialogowym wybieramy :  **Java Project -> Next**
 +  - Zaznaczamy radiobutton : **Create project from existing source** i klikając ​ browse wybieramy folder zawierający rozpakowane źródła projektu z punktu 1
 +  - Wpisujemy nazwe projektu (musi być zgodna z nazwa folderu wybranego w poprzednim punkcie), klikamy **Next**
 +  - wybieramy finish na ostatniej stronie okna dialogowego
 +  - prawdopodobnie konieczne będzie [[pl:​miw:​miw08_ruleruntimeo:​howto|skonfigurowanie JPL i logtalk]]
 +  - projekt jest gotowy do uruchomienia
  
-==== 080401 ==== 
-  * selekcja przykładów MVC, patrz [[pl:​miw:​miw08_ardcase_uml#​materialy]],​ logtalk! 
  
- 
-==== 080408 ==== 
-  * dokumentowanie zasadzek... 
- 
- 
-==== 080415 ==== 
-  * lista logtalk.... 
- 
- 
- 
-==== 080429 ==== 
-  * propozycja podmiany klas w modelu 
-  * przemyślenia o howto tutorialu jpl/logtalk 
- 
-Propozycja [[pl:​miw::​miw08_ruleruntimeo:​howto|HowTo]] 
- 
- 
-==== 080527==== 
-  * przetwarzanie danych w modelu: search, search&​replace,​ właściwości (liczenie znaków,​słów,​ linii), ?, kolorowanie składni (csv, prolog, java?) 
-  * thermostat: 3 klasy: model ([[hekate:​hekate_case_thermostat|reguły]]),​ view (1 okienko, wejście: dzień tyg (1-7), miesiąc (1-12), godzina(1-24),​ readio boxes? sliders?), wyjście: 1 liczba -> temperatura),​ controller 
- 
-==== 080603 ==== 
-  * udokumentowanie w wiki przykladu z edytorem, opis przejścia do logtalka 
-  * pokazanie thermostatu 
-  * ew. inne uwagi nt. użycia logtalka w kontekście przejścia z mvc/java do logtalk 
-  * sprawozd w wiki ->beta 
- 
-====== Projekt ====== 
- 
- 
-==== Edytor Dokumentów ==== 
-[[http://​java.sun.com/​developer/​technicalArticles/​javase/​mvc/​| Edytor dokumentów]] -- Pomysły na system regułowy: 
-  * kolorowanie składni 
-  * wyszukiwanie słów kluczowych, analiza zdan, jezyka, 
-  * xml, html (np formatowanie tekstu na podstawie tagów i atrybutów html) 
-  * kontrola czy tekst zawiera wszystkie wymagane elementy (np sprawdzanie poprawnosci podania, faktury itp) 
-  * inteligentne wyszukiwanie strukturalne 
- 
-==== Przykłady MVC ==== 
-  * [[http://​java.sun.com/​developer/​technicalArticles/​javase/​mvc/​| Edytor dokumentów]] -- bardzo prosty przykład z stron Sun'a, aplikacja do "​edycji"​ tekstu, ale zbudowana zgodnie z MVC i przede wszystkim pełne źródła w Javie. 
-  * [[http://​portal.etsi.org/​mbs/​Languages/​UML/​uml_example.htm| System do rejestracji PUM]] 
-  * [[http://​java.sun.com/​blueprints/​guidelines/​designing_enterprise_applications_2e/​app-arch/​app-arch5.html|Sklep internetowy]] - dość dokładnie opisany ale bez źródeł. Wydaje się trochę za duży. 
-  * [[http://​www.ibm.com/​developerworks/​library/​j-struts/​|Mailing List]] - krótki tutorial do J2EE i Struts'​ów ze stron IBM'a. Przykład dość prosty ale niezle udokumentowany i są też wystawione źródła. 
  
  
Linia 76: Linia 40:
 ====== Sprawozdanie ====== ====== Sprawozdanie ======
  
-===== Cel  =====+===== Cel projektu ​=====
 Celem projektu było przetestowanie możliwości budowy aplikacji wielowarstwowych opartych o wzorzec projektowy MVC przy użyciu Javy oraz Prologa. Zakładając,​ że aplikacja jest projektowana zgodnie z metodologia programowania obiektowego i na etapie projektowania aplikacji nie decydujemy, który moduł, czy wręcz obiekt której klasy ma zostać zaimplementowany przy użyciu Javy, a który w Prologu. Dopiero osoba implementująca ten projekt powinna mieć możliwość teoretycznie dowolnego wyboru jednej z tych technologii,​ w zależności od tego jak wygodniej będzie zaimplementować dany obiekt. ​ Celem projektu było przetestowanie możliwości budowy aplikacji wielowarstwowych opartych o wzorzec projektowy MVC przy użyciu Javy oraz Prologa. Zakładając,​ że aplikacja jest projektowana zgodnie z metodologia programowania obiektowego i na etapie projektowania aplikacji nie decydujemy, który moduł, czy wręcz obiekt której klasy ma zostać zaimplementowany przy użyciu Javy, a który w Prologu. Dopiero osoba implementująca ten projekt powinna mieć możliwość teoretycznie dowolnego wyboru jednej z tych technologii,​ w zależności od tego jak wygodniej będzie zaimplementować dany obiekt. ​
 Tak postawione założenia wymuszają znalezienie technologi/​framework'​a umożliwiającego:​ Tak postawione założenia wymuszają znalezienie technologi/​framework'​a umożliwiającego:​
Linia 82: Linia 46:
  
    * Wygodną integracje kodu Prolog'​a z kodem w Javie, w ideale bez tworzenia dodatkowego kodu służącego tylko do komunikacji pomiędzy obiektami napisanymi w różnych językach, a w praktyce minimalizujących ilość takiego kodu. Zwłaszcza istotne wydaje się aby implementacja tej warstwy komunikacyjnej dała się łatwo odseparować od logiki samej aplikacji, tak aby minimalnie zaburzyć projekt wejściowy.    * Wygodną integracje kodu Prolog'​a z kodem w Javie, w ideale bez tworzenia dodatkowego kodu służącego tylko do komunikacji pomiędzy obiektami napisanymi w różnych językach, a w praktyce minimalizujących ilość takiego kodu. Zwłaszcza istotne wydaje się aby implementacja tej warstwy komunikacyjnej dała się łatwo odseparować od logiki samej aplikacji, tak aby minimalnie zaburzyć projekt wejściowy.
 +  * Warte podkreślenia jest też wymóg integracji obiektów Prologa i Javy dopiero na etapie runtime'​u,​ nie chodzi tutaj o wygenerowanie kodu Javy na podstawie kodu Prologa i poźniejsze uruchomienie aplikacji w samej Javie.
 +
  
 Pierwszym zatem zadaniem było znalezienie odpowiedniego framework'​a umożliwiającego tworzenie obiektów w Prologu oraz integracje tych obiektów z obiektami zaimplementowanymi w Javie. Pierwszym zatem zadaniem było znalezienie odpowiedniego framework'​a umożliwiającego tworzenie obiektów w Prologu oraz integracje tych obiektów z obiektami zaimplementowanymi w Javie.
Linia 87: Linia 53:
  
 ===== Obiektowy Prolog ===== ===== Obiektowy Prolog =====
-Poniżej znajduje się lista framework'​ów,​ które zostały w ramach tego projektu przetestowane w nadziei znalezienia wyżej ​opisanej technologi ​: +Poniżej znajduje się lista framework'​ów,​ które zostały w ramach tego projektu przetestowane w nadziei znalezienia ​spełniającego ​wyżej ​postawione zadania ​:
-==== Analiza istniejących rozwiązań==== +
-  * [[http://​www.ncc.up.pt/​yap/​documentation.html|yap]] - yap jako wysoko wydajny kompilator Prologa, wzbogacony o takie funkcjonalności jak : strumienie We/Wy, socket'​y,​ moduły wyjątki, debugger itp. nie wydaje się być narzędziem przydatnym w tym projekcie, zwłaszcza że gdy w jego dokumentacji pojawia się temat obiektowości polecane jest użycie LogTalk'​a,​ który swoją drogą podobno dość dobrze się integruje z yap'​em. +
-  * [[http://​amzi.com/​|amzi]] - narzędzie płatne, choć można wykorzystywać do celów akademickich za darmo, niestety bez źródeł. Bardzo dobrze udokumentowane. Posiada interface do używania prologa z Javy, poprzez obiekt klasy LogicServer możemy się łatwo odwoływać do bazy wiedzy Prologa, w sposób przypominający przesyłanie zapytań do bazy danych.Natomiast dokładna dokumentacja : [[http://​www.amzi.com/​manuals/​amzi7/​ls/​lsfrtop.htm|LogicServer API]]. Rozwiązanie wydaje się być zbliżone do SICStus'​a. Wygląda na brak wsparcia dla obiektowości.  +
-  * [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] - umożliwia integracje aplikacji napisanej w Prologu z inna napisana ​ w Java/.NET poprzez **PrologBeans**. Klient, aplikacja JAVA'​owowa przesyła komunikaty, które są odpowiednio oceniane przez server-Prolog'​a,​ obie aplikacje są osobnymi procesami, komunikują się przez sockety TCP, czyli w architekturze klient-serwer. SICStus Prolog wspiera także obiektowość poprzez moduł "The Objects Package—library(objects)",​ czyli zapewnia enkapsulacje,​ dziedziczenie itp.+
  
-  * [[http://​www.logtalk.org|LogTalk]] - własne wsparcie dla obiektowości,​ poprzez LogTalk objects, zapewnia wszystkie podstawowe wymagania. Nie znalazłem bezpośredniego wsparcia dla integracji z innymi platformami,​ natomiast dokumentacja wspomina o takich możliwościach,​ dzięki [[http://​logtalk.org/​manuals/​userman/​programming.html#​programming_portability|"​wysoko poziomowemu mapowaniu obiektów LogTalk"​]].. Szczegóły na razie nie znane, ale przykład integracji Javy z LogTalk [[https://​dev.crazydwarves.org/​ProjetM1TER|tutaj]] + [[pl:miw:miw08_ruleruntimeo:oopframeworks|Analiza istniejących rozwiązań]]
- +
- +
-  [[http://​www.prologonlinereference.org/​oop.psp|Prolog OOP]] - umożliwia stosowanie prolog'​owych modułów do za modelowania obiektowości,​ umożliwia wykorzystywanie wiekszości podstawowych predykatów obiektowości takich jak: +
-     ​* ​    ​dziedziczenie modułów +
-     ​* ​    ​enkapsulacje predykatów +
-     ​* ​    ​abstrakcyjne definiowanie modułów +
- +
- +
-Natomiast nie ma w nim mowy o możliwościach integracji Prologa z innym obiektowym językiem, to jest tylko próba wprowadzenia obiektowości do samego Prologa. +
- +
- +
- +
-  * [[http://​www.trinc-prolog.com/​doc/​pl_obj.htm|TrincProlog]] - oferuje właściwie analogiczny pomysł, czyli rozszerzenie prologa o obiektowość. Tyle, że tym razem dodatkowe słowa kluczowe pozwalają na deklarowanie klas niezależnie od modułów (czyli np kilka klas w jednym module, itp ). Tyle, że niestety ​ znowu brak możliwości integracji z innymi językami. Obiecująco wyglądała część do [[http://​www.trinc-prolog.com/​doc/​pl_win.htm|tworzenia aplikacji Windows]], ale okazało się że jest już gotowe API pozwalające odwoływać się do obiektów GUI (Window, Button, itp.) poprzez predykaty prologa. Być może można by wykorzystać to API od odwoływania się do dowolnych obiektów, zbudować analogiczne?​+
  
 ===== Wybrane rozwiązanie ===== ===== Wybrane rozwiązanie =====
  
-Jako docelowa platforma realizacji projektu został wybrany ​Logtalk ​ze wzgledu ​na +Jako docelowa platforma realizacji projektu został wybrany ​[[http://​www.logtalk.org|LogTalk]] ​ze względu ​na fakt że zapewnia on pełne wsparcie dla obiektowości w Prologu, oraz jest w przeciwieństwie do [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] i [[http://​www.sics.se/​isl/​sicstuswww/​site/​index.html|SICStus Prolog]] technologią w pełni Open Source, podczas gdy pozostałe dające praktycznie podobne możliwości są niestety technologiami komercyjnymi. ​
  
 ===== Integracja LogTalk'​a z Java ===== ===== Integracja LogTalk'​a z Java =====
-Jako, że technologia wybrana ​do realizacji projektu został Logtalkjako rozwiązanie najbliższe oczekiwaniom..+Niestety sam Logtalk nie wspiera w żaden sposób integracji obiektów tworzonych przy jego pomocy z innymi językami obiektowymi. Dlatego kolejnym krokiem jest było znalezienie narzędzia umożliwiającego integracje Logtalk'​a z Java. Ponieważ docelowym kompilatorem Prologa używanym w tym projekcie jest SWI Prolognaturalna wydała się próba użycia do tego celu jedno z pakietów standardowych ​dołączanych do tej dysytrybucjiczyli [[http://​www.swi-prolog.org/​packages/​jpl/​|JPL]] który oferuje dwustronny interface pomiędzy Prologiem a Java.Jeżeli dodać do tego obiektowość oferowaną przez LogTalk to wydaje się, że jest to zestaw spełniający dane wymagania 
 +[[pl:​miw:​miw08_ruleruntimeo:​jpljava | Przykład użycia JPL do komunikacji Prolog'​a z Java]].
  
  
-== Opis ogolny LogTalk == +Przykład całej klasy napisanej w Javie, służącej do komunikacji z obiektami LogTalk znajduje się tutaj [[https://​dev.crazydwarves.org/​ProjetM1TER/​browser/​trunk/​src/​fr/​up5/​mi/​etu/​vnfc/​argumentation/​engine/​LogtalkEngine.java|LogTalkEngine]]
- +
-Opierając się na przykładzie znalezionym na [[https://​dev.crazydwarves.org/​ProjetM1TER|stronie]] jednym z sposobów integracji obiektów LogTalk z Java jest użycie jednego z pakietów SWI_Prolog, JPL : Java to Prolog Interface. +
- +
-[[http://​www.swi-prolog.org/​packages/​jpl/​|JPL]] który oferuje dwustronny interface pomiędzy Prologiem a Java. +
-Probując wywołać predykat Prologa z kodu Javy posługujemy się następującą składnią : +
-<code java> +
-Query q2 = +
-      new Query( +
-        "​child_of",​ +
-        new Term[] {new Atom("​joe"​),​new Atom("​ralf"​)} +
-        ); +
- +
-System.out.println( +
-     "​child_of(joe,​ralf) is " + +
-      ( q2.query() ? "​provable"​ : "not provable"​ ) +
-    ); +
-</​code>​ +
-Przykład pokazuje przesłanie zapytania do bazy wiedzy prologa. Można ten mechanizm wykorzystać do wywoływania predykatów wewnątrz obiektów LogTalk, czyli de facto do wywoływania metod na obiektach LogTalk z obiektów Java'​y. +
- +
-Gdy konieczne jest wysłanie komunikatu do obiektu Java'y z poziomu Prologa, JPL oferuje następujące rozwiązanie : +
- +
-Predykat **jpl_new/​3** pozwala na utworzenie instancji obiektu klasy z Javy : +
-<code prolog>  +
-jpl_new( '​javax.swing.JFrame',​ ['​frame with dialog'​],​ F) +
-</​code>​ +
-Natomiast predykat ​ **jpl_call/​4** pozwala wywołać metodę na utworzonym powyżej obiekcie: +
-<code prolog>​ +
-jpl_call( F, setVisible, [@(true)], _) +
-</​code>​ +
- +
-Jak widać JPL umożliwia obustronne wywoływanie metod pomiędzy obiektami klas zdefiniowanych w Javie i w Prologu. Jeżeli dodać do tego obiektowość oferowaną przez LogTalk to wydaje się, że jest to zestaw spełniający dane wymagania. ​Przykład całej klasy napisanej w Javie, służącej do komunikacji z obiektami LogTalk znajduje się tutaj [[https://​dev.crazydwarves.org/​ProjetM1TER/​browser/​trunk/​src/​fr/​up5/​mi/​etu/​vnfc/​argumentation/​engine/​LogtalkEngine.java|LogTalkEngine]]+
  
 == Napotkane problemy i rozwiazania == == Napotkane problemy i rozwiazania ==
  
-Tutaj moze link do howto+Podczas realizacji tego projektu natrafiono na sporo problemów natury konfiguracyjnej,​ co wydaje się dość naturalne jako że używamy kilka niezależnie tworzonych bibliotek. Oto lista ważniejszych problemów wraz z opisem ich rozwiązania : 
 +  * [[pl:​miw:​miw08_ruleruntimeo:​prologmodules | Używanie modułów zewnętrznych modułów Prologa z obiektów Logtalk]] 
 +  * [[pl:​miw:​miw08_ruleruntimeo:​swiconfig | Konfiguracja SWI-Prolog do współpracy z  Logtalk]]
  
-== Używanie modułów Prologa z obiektów LogTalk == +[[pl:​miw::​miw08_ruleruntimeo:​howto | Jak skonfigurować JPL i Logtalk ]] - uwagi na temat użycia i konfiguracji JPL i Logtalk ​do współpracy Java.
-Rozwiązaniem problemu z poprzedniego tygodnia jest stosunkowo proste, mianowicie ​do wywoływania metod pakietu należy użyć operatora {}/1Inaczej LogTalk próbuje jakoś zrobić z modułu obiekt i nie zawsze to działa. +
-Także poprawne wywołanie wygląda tak : +
-<code prolog>​ +
-jpl_test:​- +
- { jpl_new('​javax.swing.JFrame',​ ['​Frame with dialog'​],​ F) }, +
-</​code>​+
  
-A poniżej działający już poniższy przykład : 
-<code prolog> 
  
-:​-use_module(library(jpl),​[jpl_new/​3,​ jpl_call/​4]). 
  
-:​-object(logTalkControler). 
-:​-public(toString/​0). 
-:​-public(testValue/​1). 
-:​-public(jpl_test/​0). 
  
-:-initialization( +Celem przetestowania znalezionych rozwiązań na przykładzie prostej aplikacji opartej o wzorzec MVC, powstały dwie aplikacje opisane poniżej. Inne brane pod uwagę przykłady prostych projektów [[pl:miw::​miw08_ruleruntimeo:​mvcexamples|aplikacji opartych o MVC]]
- write('​Constructor speaking'​)). +
-test(a). +
-test(b). +
-test(c). +
-value(a).+
  
-testValue(X) :- +===== Edytor Tekstu =====
- test(X), +
- value(X).+
  
-jpl_test:+Celem tego przykładu była próba zmiany gotowej aplikacji napisanej w [[http://java.sun.com/​developer/​technicalArticles/​javase/​mvc/​| Javie opartej o wzorzec MVC]], na aplikacje której część logiki jest zaimplementowana poprzez obiekty Logtalk.
- {jpl_new('​javax.swing.JFrame',​ ['​Frame with dialog'​], F)}, +
- {jpl_call(F,​ setLocation,​ [400, 300], _)}, +
- {jpl_call(F,​ setSize, [400, 300], _)}, +
- {jpl_call(F,​ setVisible, [@(true)], _)}, +
- {jpl_call(F,​ toFront, [], _)}.+
  
-:​-end_object. 
  
 +[[pl:​miw::​miw08_ruleruntimeo:​mvceditor | Jak zaimplementować model w Logtalku, w gotowej aplikacji J2SE opartej o MVC]]
  
-</​code>​ 
  
-== Konfiguracja SWI-Prolog do LogTalk'​a ​==+===== Termostat ===== 
 +W odróżnieniu od poprzedniego przykładu temu przyświecał cel próby implementacji całej aplikacji, mając na starcie tylko [[hekate:​hekate_case_thermostat|model]] w formie diagramów ARD, XTT. Model ma zostać zaimplementowany w Logtalk'​u,​ reszta w Javie.
  
-Na podstawie własnych doświadczeń. Aby utworzyć, skompilować i załądować do pamieci obiekty LogTalk'​a konieczne jest wcześniejsze skonfigurowanie używanego kompilatora Prolog'​a. Na potrzeby tego projektu zakładam, że jest nim [[http://​www.swi-prolog.org|SWI-Prolog]],​ jakkolwiek jeśli wierzyć dokumentacji LogTalk'​a to jest on w pełni kompatybilny z większościa innych kompilatorów ​ Prolog'​a. 
-Aby zintegrować LogTalk'​a z SWI: 
-należy wykonać predykat consult na trzech plikach, które można znaleźć w katalogu instalacyjnym LogTalk'​a : 
-   * configs/​swi.config - ustawia zmienne i konfiguruj srodowisko Prologa 
-   * complier/​logtalk.pl - laduje kompilator LogTalka 
-   * libpaths/​libpaths.pl - ustawia sciezki do bibliotek standardowych LogTalka 
  
-chyba najwygodniej jest sporządzić sobie plik startowy: +[[pl:miw::miw08_ruleruntimeo:mvcthermostate | Jak zaimplementować MVC w Javie i Logtalku na podstawie diagramów ARD, XTT]]
-<code prolog>​ +
-:-consult('​lib/​Resources/​logtalk/​swi.config'​). +
-:-consult('​lib/​Resources/​logtalk/​logtalk.pl'​). +
-:-consult('​lib/​Resources/​logtalk/​libpaths.pl'​).+
  
-</​code>​ 
- ​który pożniej uruchamiamy z Javy przed tworzeniem obiektów LogTalk, w następujący sposób: 
  
-<code java> 
  
-JPL.setDefaultInitArgs( 
-new String[] { 
- "​pl",​ 
- "​-f",​ "​none",​ 
- "​-g",​ "​set_prolog_flag(debug_on_error,​false)",​ 
- "​-q",​ 
- "​-nosignals" ​ 
- } 
- ); 
  
-Query q = new Query("​['​lib/​logtalkLoad.pl'​]."​);​ 
  
-if (!q.hasSolution()) ​ +====== Materiały ====== 
-+  * [[http://​java.sun.com/​developer/​technicalArticles/​javase/​mvc/​|Opis edytora tekstu z strony Sun'​a]] oraz  ​{{:​pl:​miw:​mvceditordescription.zip|kod tej strony}} 
- RuntimeException e = new RuntimeException("error loading logtalk"​);  +  * {{:​pl:​miw:​mvcexample.zip|źródła edytora dokumentów w oryginale ​(bez Logtalk)}}  
-+  * [[https://​dev.crazydwarves.org/​ProjetM1TER/​wiki|Projekt wykorzystujący Logtalk i JPL do integracji z Java]] 
-else  +  * [[http://​logtalk.org/​|Logtalk - strona główna ]] 
-{ +  * [[http://​www.swi-prolog.org/​packages/​jpl/​| Dokumentacja do JPL ]]
- System.out.println("​Hurray!"​);​ +
-}+
  
-</​code>​ 
  
-Po udanym wykonaniu powyższego kodu jesteśmy już w stanie tworzyć obiekty LogTalk z kodu Javy i wywoływać ich metody : 
  
-<code java> 
-//utworznie instancji obiektu logTalkControler 
-Query loadControler = new Query("​logtalk_load",​ 
- new Term[]{ 
- new Atom("​logTalkControler"​) 
- } 
- ); 
-//wywolanie metody testValue obiektu logTalkControler 
-Query askLgt = new Query("​logTalkControler::​testValue(valueToTest)."​);​ 
-System.out.println("​Is '​a'​ a proper TestValue?:" ​ 
- + (askLgt("​testValue",​ "​a"​)?"​YES":"​NO!"​));​ 
-</​code>​ 
  
-Pełną treść tego przykładu zamieszczam tutaj [[pl:​miw:​miw08_ruleruntimeo:​logtalkjava]]. 
  
-Niestety dalej natrafiam na problemy z próba uruchomienia komunikacji w drugą strone, tzn wywołania kodu Javy z LogTalka. Mimo iż modul jpl bardzo dobrze się sprawdza przy tworzeniu obiektów Javy, jak widać np w tym przykładzie : 
-<code prolog> 
  
-:​-use_module(library(jpl)). 
  
-jpl_test:- 
- jpl_new('​javax.swing.JFrame',​ ['​Frame with dialog'​],​ F), 
- jpl_call(F,​ setLocation,​ [400, 300], _), 
- jpl_call(F,​ setSize, [400, 300], _), 
- jpl_call(F,​ setVisible, [@(true)], _), 
- jpl_call(F,​ toFront, [], _), 
- jpl_call('​javax.swing.JOptionPane',​ showInputDialog,​ [F, 'Write sth'], N), 
- jpl_call(F,​ dispose, [], _), 
- ( N == @(null) -> 
- write('​You cancelled'​);​ 
- write('​You typed'​),​ write(N) 
- ), 
- nl. 
  
  
- 
-:-jpl_test. 
- 
-</​code>​ 
- ​Działa bez zarzutu, wyświetlając okienko dialogowe. Ale już próba uruchomienia podobnego kodu w metodzie obiektu LogTalk: 
-<code prolog> 
- 
-:​-use_module(library(jpl),​[jpl_new/​3,​ jpl_call/​4]). 
- 
-:​-object(logTalkControler). 
-:​-public(toString/​0). 
-:​-public(testValue/​1). 
-:​-public(jpl_test/​0). 
- 
-:​-initialization( 
- write('​Constructor speaking'​)). 
-test(a). 
-test(b). 
-test(c). 
-value(a). 
- 
-testValue(X) :- 
- test(X), 
- value(X). 
- 
-jpl_test:- 
- jpl_new('​javax.swing.JFrame',​ ['​Frame with dialog'​],​ F), 
- jpl_call(F,​ setLocation,​ [400, 300], _), 
- jpl_call(F,​ setSize, [400, 300], _), 
- jpl_call(F,​ setVisible, [@(true)], _), 
- jpl_call(F,​ toFront, [], _). 
- 
-:​-end_object. 
- 
- 
-</​code>​ 
- 
-Powoduje dość ciekawy komunikat przy próbie kompilacji w swi : 
-<​code>​ 
-63 ?- logtalk_load(logTalkControler). 
-<<<​ reloading source file logTalkControler... ​ 
->>>​ compiling source file logTalkControler... 
-compiling object logTalkControler... ​ 
-  WARNING! ​ These predicates are called but never defined: jpl_call/4, jpl_new/3 
-compiled object logTalkControler... ​ 
->>>​ logTalkControler source file compiled 
-  WARNING! ​ Redefining object logTalkControler 
-Constructor speaking 
-% logTalkControler.pl compiled 0.00 sec, 92 bytes 
-<<<​ logTalkControler source file reloaded 
-(1 compilation warning and 1 loading warning) 
-true. 
- 
-64 ?- logTalkControler::​jpl_test. 
-ERROR: Undefined procedure: jpl_new/3 
-ERROR: ​    ​However,​ there are definitions for: 
-ERROR: ​        ​jpl_new/​3 
-</​code>​ 
-I oczywiście nie działa. Podejrzewam,​ że problem tkwi w niewłaściwie dodanym pakiecie. Ale nie udało mi się jeszcze znaleźć rozwiązania.. 
-===== Opis implementacji Edytora ===== 
-O podmianie obiektow Javy na Logtalk 
- 
-===== Opis Termostatu ===== 
-O napisaniu prostej aplikacji od podstaw w MVC z Logtalk'​iem 
- 
-====== Materiały ====== 
-  * strona z Suna z edytorem 
-  * kod edytora z logtalk 
-  * kod termostatu 
  
  
  
  
pl/miw/miw08_ruleruntimeo.1212234241.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