[[
✎ pl:miw:piw08_prolog_java
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Opis ====== Wojciech Leś, Michał Łosiewicz, (IS) keepsake@o2.pl, colesiu@student.agh.edu.pl Integracja kodu Prologu z Java porównać z projektami z 2006 roku http://www.ugosweb.com/jiprolog/ http://portal.acm.org/citation.cfm?id=787039 http://www.sics.se/sicstus|SICStus]] patrz https://ai.ia.agh.edu.pl/wiki/prolog:prolog_tools#java_and_prolog InterProlog http://www.declarativa.com/interprolog/, description, how to use, does it make any sense? - najlepiej działa na XSB Prolog, na SWI wg dokumentacji powinno działać, jednak wszystkie przykłady są na XSB, a konwersja wymaga dość dobrej znajomości Interprologa http://www.swi-prolog.org/packages/jpl/java_api/index.html , do sprawdzenia ====== Java + Prolog rozwiązania ====== ===== Interprolog ===== Stworzony dla XSB Prolog. Posiada interfejsy dla SWI i YAP. Istnieje zarówno Java, jak i Prolog API. Brakuje niestety niedeterministycznych celów w Javie, da się to zrobić tylko przez sztuczne stworzenie listy wszystkich rozwiązań w Prologu. Dokumentacja zawiera podstawowy opis metod i kilka banalnych przykładów. Bardziej rozbudowane przykłady stworzone są z użyciem XSB. Komunikacja odbywa się na zasadzie TCP/IP sockets. ===== JPL ===== Stworzony dla SWI Prolog. Rozprowadzany z tą dystrybucją. Najnowsza wersja - 3.0. Współpracuje praktycznie tylko z SWI. Dokumentacja istnieje do wersji do 2.0, ale poprzez forum można bezpośrednio skontaktować się z autorami projektu. API istnieje dla Javy jak i dla Prologa. Wysokopoziomowe API jest proste w użyciu. ===== Inne ===== Istnieją także interpretery Prologu (właściwie języka Prologo-podobnego) w Javie, jest to dość duża grupa projektów, ale rozwiązania te są dość ubogie i mniej efektywne. ====== Implementacja JPL ====== * Należy stwożyć zmienną środowiskową SWI_HOME_DIR ze ścieżką do katalogu w którym jest zainstalowany SWIProlog. * Do zmiennej PATH należy dodać dodać ścieżkę do katalogu SWI_HOME_DIR\bin ===== Wywoływanie SWIProlog z Javy ===== W kodzie Java'y należy: * Stworzyć instancję klasy jpl.Query new jpl.Query(String statement); gdzie statement jest poleceniem prologa, * Aby sprawdzić czy statement jest prawdziwy wywołujemy funkcję hasSolution() zwracającą boolean, * Aby dostać jedną odpowiedź wywołujemy funkcję oneSolution() zwracającą Hashtable, gdzie kluczami są nazwy zmiennych zawarte w statement, * Aby dostać wszystkie możliwe odpowiedzi wywołujemy funkcję allSolutions() zwracającą Hashtable[], * Aby pojedynczo otrzymywać kolejno wyniki wywołujemy na zmiane dwie funkcje hasMoreSolutions() zwracającą true jeśli istnieje jeszcze jakieś rozwiązanie nextSolution() zwracającą Hashtable z wartościami zmiennych, * Na koniec wywołujemy funkcję close(). JPL w wersji nie wymaga bezpośredniej inicjalizacji silnika prologa, przy pierwszym stworzonym obiekcie jpl.Query dokona się to samo. Inicjalizować prologa trzeba tylko wtedy gdy chcemy, używać określonego modułu w prologu. ===== Wywoływanie Javy z SWIProlog ===== Wykorzystuje się 4 predykaty * jpl_new(+Class,+Params,-Ref) jpl_new( 'nazwa_klasy', [parametry_funkcji_odzielone_przecinkami], Referencja) Po takim wywołaniu tworzony jest obiekt klasy nazwa_klasy dostępny poprzez referencję Referencja. Jest to odpowiednik Java'owego: nazwa_klasy Referencja new nazwa_klasy(parametry_funkcji_odzielone_przecinkami); Jeśli chcemy stworzyć obiekt napisanej przez nas klasy pliki java muszą zostać umieszczone w odpowiednim katalogu względem pliku pl (nazwa package, do którego należy nasza klasa). Niestety nie da się korzystać z klas umieszczonych w plikach jar * jpl_call( +Ref, +Method, +Params, -Result) jpl_call( Referencja, 'nazwa_funkcji', [parametry_funkcji_odzielone_przecinkami], Wynik) Po takim wywołaniu na obiekcie dostępnym poprzez referencję Referencja wywoływana jest funkcja nazwa_funkcji. Jest to odpowiednik Java'owego: Wynik = Referencja.Nazwa_funkcji(parametry_funkcji_odzielone_przecinkami); Aby wywołać funkcję statyczną wywołanie wygląda następująco: jpl_call( 'nazwa_klasy', 'nazwa_funkcji', [parametry_funkcji_odzielone_przecinkami], Wynik) Jeśli chcemy wywołać funkcję napisanej przez nas klasy pliki java muszą zostać umieszczone w odpowiednim katalogu względem pliku pl (nazwa package, do którego należy nasza klasa). Niestety nie da się korzystać z klas umieszczonych w plikach jar * jpl_get( +Class_or_Object, +Field, -Datum) Służy do wydobycia wartości atrybutu Field klasy lub obiektu Class_or_Object i przypisania go zmiennej datum * jpl_set( +Class_or_Object, +Field, +Datum) Służy do przypisania atrybutowi Field klasy lub obiektu Class_or_Object wartości jaką posiada zmienna datum ====== Porównanie ====== JPL - Interprolog * Łatwość programowania - JPL jest zdecydowanie prostszy w obsłudze, nie wymaga inicjalizacji maszyny wnioskującej, metody Java są intuicyjne * Szybkość działania - w fazie testów * Wygoda - Interprolog nie posiada non-deterministic goal api, stąd wszelkie multiple-solutions trzeba generować w prologu i zwracać jako listę rozwiązań, która jest obiektem typu String w Javie i trzeba ją parsować, natomiast JPL generuje kolejne rozwiązania z poziomu Java poprzez kolejne wywołania tych samych 2 funkcji * Dostęp do konsoli interpretera Prologu - JPL musi mieć zdefiniowaną zmienną środowiskową (SWI_HOME_DIR), w której jest adres katalogu domowego SWI, w Interprologu w kodzie programu Java należy wywołać SWISubProcessEngine z parametrem jakim jest śćieżka dostępu do interpretera * Łączność Prolog-Java - w JPL realizuje się to za pomocą 4 predykatów (tworzenie obiektów Java, wywoływanie funkcji, powiązanie obiektu Java ze zmienną w Prologu, ustalenie wartości zmiennej), w Interprologu działa to na zasadzie komunikacji synchronicznej przez Java Message ====== Sudoku - przykład wywołania Prologu z poziomu Java ====== ===== Interprolog ===== http://student.agh.edu.pl/~keepsake/miw/ Wywołanie: java -jar Sudoku.jar [prolog compiler] np. java -jar Sudoku.jar plcon Kompilacja: javac -classpath interprolog.jar Sudoku.java jar cfm Sudoku.jar manifest *.class ===== JPL ===== SUDOKU http://student.agh.edu.pl/~colesiu/jpl/sudoku.rar przykład działania wywołania prologa w javie (GUI w javie i wnioskowanie w prologu) należy ustawić zmienną środowiskową SWI_HOME_DIR, do zmiennej środowiskowej PATH należy dodać SWI_HOME_DIR/bin CAR.PL http://student.agh.edu.pl/~colesiu/jpl/test.rar przykład działania wywołania javy w prologu (Okno startowe w javie wywołuje prologa, a prolog wywołuje kolejne dialogBoxy z pytaniami) należy ustawić zmienną środowiskową SWI_HOME_DIR, do zmiennej środowiskowej PATH należy dodać SWI_HOME_DIR/bin ====== Problemy ======
pl/miw/piw08_prolog_java.1212495079.txt.gz
· ostatnio zmienione: 2019/06/27 15:59 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry