To jest stara wersja strony!


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

1. Należy stwożyć zmienną środowiskową SWI_HOME_DIR ze ścieżką do katalogu w którym jest zainstalowany SWIProlog. 2. Do zmiennej PATH należy dodać dodać ścieżkę do katalogu SWI_HOME_DIR\bin

Wywoływanie SWI z Java'y

W kodzie Java'y należy: 1. Stworzyć instancję klasy jpl.Query

 new jpl.Query(String statement); gdzie statement jest poleceniem prologa,

2. Aby sprawdzić czy statement jest prawdziwy wywołujemy funkcję hasSolution() zwracającą boolean, 3. Aby dostać jedną odpowiedź wywołujemy funkcję oneSolution() zwracającą Hashtable,

 gdzie kluczami są nazwy zmiennych zawarte w statement,

4. Aby dostać wszystkie możliwe odpowiedzi wywołujemy funkcję allSolutions() zwracającą Hashtable[], 5. 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,

6. 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.

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

http://student.agh.edu.pl/~colesiu/sudoku.rar

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.1212490930.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (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