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
Problemy