Różnice

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

Odnośnik do tego porównania

pl:prolog:prolog_lab:prolog_lab_java [2009/05/05 23:44]
gjn utworzono
pl:prolog:prolog_lab:prolog_lab_java [2019/06/27 15:50]
Linia 1: Linia 1:
-====== Prolog i Java - integracja środowisk ====== 
-Celem laboratorium jest przedstawienie podstaw integracji języka Prolog, na przykładzie środowiska [[http://​www.swi-prolog.org/​|SWI]] z [[http://​java.sun.com/​|językiem Java]]. 
- 
-Integracja jest realizowana za pośrednictwem [[http://​www.swi-prolog.org/​packages/​jpl/​|interfejsu JPL]]. 
- 
-Od uczestników wymaga się znajomości 
-[[pl:​prolog:​prolog_lab#​czesc_glowna|podstaw Prologu]] i podstawowej znajomości języka Java. 
- 
-//Uwaga:// w tym laboratorium może się przydać znajomość 
-[[pl:​prolog:​prolog_lab:​prolog_lab_metaprog|lab. z metaprogramowania.]] 
- 
-===== Wprowadzenie ===== 
- 
-==== Rola JPL ==== 
-JPL jest zestawem bibliotek pozwalających na integrację SWI Prologu ze środowiskiem Java na etapie kompilacji i uruchamiania (//​runtime//​). 
- 
-Wymaga SUN JDK lub OpenJDK. 
- 
-Ze względów licencyjnych w niektórych dystrybucjach GNU/Linux może być dostępny tylko wtedy, jeżeli jest dostępne to 2.  
- 
-==== Instalacja JPL ==== 
-Najlepiej: 
-  apt-get install swi-prolog-jpl 
- 
-Ogólnie: 
-  export JAVA_HOME=/​usr/​lib/​jvm/​java-6-sun 
-  export LD_LIBRARY_PATH=$JAVA_HOME/​jre/​lib/​i386:​$JAVA_HOME/​jre/​lib/​i386/​client/​ 
- 
-jpl oczekuje, że exec SWI nazywa się //pl//. 
-  ln -s /​usr/​bin/​swipl /usr/bin/pl 
- 
-ew. dla uruchamiania bez podawania ścieżki przy //java// 
-  ln -s /​usr/​lib/​swi-prolog/​lib/​i386/​libjpl.so /​usr/​lib/​jvm/​java-6-sun/​jre/​lib/​i386/​client/​ 
-  ln -s /​usr/​lib/​swi-prolog/​lib/​i386/​libjpl.so /​usr/​lib/​jvm/​java-6-sun/​jre/​lib/​i386/​ 
- 
-==== Reprezentacja typów ==== 
- 
-JPL zapewnia Prologową reprezentację typów obecnych w Javie. 
-[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​overview.html#​JPL_types_Java_types_as_seen_by|Pełny opis jest tu.]] 
- 
-==== Wywoływanie Javy z Prologu ==== 
-Patrz również: 
-  * [[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​overview.html|podręcznik]] 
-  * [[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​api.html|opis API]] 
- 
-Do tworzenia obiektów Javy służy predykat ​ 
-''​[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​api.html#​jpl_new/​3|jpl_new/​3]]''​. 
-  jpl_new( +ClassOrType,​ +Params, -Result) 
-W wyniku jego użycia dostajemy referencję do nowoutworzonego obiektu, np.: 
-  jpl_new( '​javax.swing.JFrame',​ ['​frame with dialog'​],​ F) 
- 
-Do używania metod we wcześniej utworzonych obiektach służy predykat ​ 
-''​[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​api.html#​jpl_call/​4|jpl_call/​4]]''​. 
-  jpl_call( +Object, +Method, +Params, -Result) 
-Na przykład: 
-  jpl_call( F, setVisible, [@true], @void) 
- 
-Do pobierania wartości pól obiektów służy predykat ​ 
-''​[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​api.html#​jpl_get/​3|jpl_get/​3]]''​. 
-  jpl_get( +Object, +Field, -Value) 
-Na przykład: 
-  jpl_get( '​java.awt.Color',​ pink, Pink) 
- 
-Do ustawiania wartości pól obiektów służy predykat ​ 
-''​[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​api.html#​jpl_set/​3|jpl_set/​3]]''​. 
-  jpl_set( +Object, +Field, +Value) 
-Na przykład: 
-  jpl_set( +Class_or_Object,​ +Field, +Datum) 
- 
- 
-==== Wywoływanie Prologu z Javy ==== 
- 
-Przydatne informacje: 
-  * [[http://​www.swi-prolog.org/​packages/​jpl/​java_api/​getting_started.html|wprowadzające]] 
-  * [[http://​www.swi-prolog.org/​packages/​jpl/​java_api/​high-level_interface.html|opis API]] 
- 
-Inicjalizacja Prologu odbywa się automatycznie przy użyciu JPL. 
- 
-Najczęściej do pracy potrzebujemy być w stanie stworzyć Javowe odpowiedniki termów i zadawać pytania. 
-Hierarcha klas JPL potrzebnych do tych zadań [[http://​www.swi-prolog.org/​packages/​jpl/​java_api/​high-level_interface.html#​The%20Class%20Hierarchy|jest opisana tu]]. 
- 
-Mając prosty program w Prologu: 
-<code prolog> 
-rodzic(kasia,​robert). 
-rodzic(tomek,​robert). 
-rodzic(robert,​anna). 
-rodzic(robert,​magda). 
-rodzic(magda,​jan). 
- 
-kobieta(kasia). 
-kobieta(magda). 
-kobieta(anna). 
- 
-mezczyzna(tomek). 
-mezczyzna(robert). 
-mezczyzna(jan). 
- 
-matka(X,Y) :- 
- rodzic(X,​Y),​ 
- kobieta(X). 
- 
-ojciec(X,Y) :- 
- rodzic(X,​Y),​ 
- mezczyzna(X). 
-</​code>​ 
-zapisujemy go w pliku //​family1.pl//​ 
- 
-Następnie tworzymy prosty program w Javie: 
-<code java> 
-import java.util.Hashtable;​ 
-import jpl.*; 
-import jpl.Query; 
- 
-public class Family 
-{ 
-    public static void 
-    main(String argv[]) { 
- 
-        String t1 = "​consult('​family1.pl'​)";​ 
-        Query q1 = new Query(t1); 
-        System.out.println( t1 + " " + (q1.hasSolution() ? "​succeeded"​ : "​failed"​) ); 
- 
-        String t2 = "​kobieta(kasia)";​ 
-        Query q2 = new Query(t2); 
-        System.out.println( t2 + " is " + (q2.hasSolution() ? "​provable"​ : "not provable"​) ); 
- 
-        String t3 = "​rodzic(robert,​anna)";​ 
-        Query q3 = new Query(t3); 
-        System.out.println( t3 + " is " +(q3.hasSolution() ? "​provable"​ : "not provable"​) ); 
- 
-        String t4 = "​ojciec(robert,​X)";​ 
-        Query q4 = new Query(t4); 
-        System.out.println( "first solution of " + t4 + ": X = " + q4.oneSolution().get("​X"​));​ 
- 
-        java.util.Hashtable[] ss4 = q4.allSolutions();​ 
-        System.out.println( "all solutions of " + t4); 
-        for ( int i=0 ; i<​ss4.length ; i++ ) 
-            System.out.println( "X = " + ss4[i].get("​X"​));​ 
- 
-        System.out.println( "each solution of " + t4); 
-        while ( q4.hasMoreSolutions() ){ 
-                java.util.Hashtable s4 = q4.nextSolution();​ 
-                System.out.println( "X = " + s4.get("​X"​));​ 
-        } 
- 
-        String t5 = "​ojciec(X,​Y)";​ 
-        Query q5 = new Query(t5); 
- 
-        System.out.println( "each solution of " + t5 ); 
-        while ( q5.hasMoreSolutions() ){ 
-                java.util.Hashtable s5 = q5.nextSolution();​ 
-                System.out.println( "X = " + s5.get("​X"​) + ", Y = " + s5.get("​Y"​));​ 
-        } 
- 
- 
-    } 
-} 
-</​code>​ 
- 
-Kompilacja: 
-  javac -classpath /​usr/​lib/​swi-prolog/​lib/​jpl.jar Family.java 
- 
-Uruchamianie:​ 
-  java  -classpath /​usr/​lib/​swi-prolog/​lib/​jpl.jar\:​. -Djava.library.path="​$LD_LIBRARY_PATH:/​usr/​lib/​swi-prolog/​lib/​i386/"​ Family 
- 
-===== Ćwiczenia ===== 
- 
-==== Interfejsy w Javie do programów Prologu ==== 
- 
-Należy przyjrzeć się (przypomnieć sobie!) ​ 
-[[pl:​prolog:​prolog_lab:​prolog_lab_metaprog#​tematsystemy_ekspertowe|proste systemu ekspertowe]] ​ 
- 
-[[pl:​prolog:​prolog_lab:​prolog_lab_metaprog|laboratorium z metaprogramowania]]. 
- 
-W szczególności,​ jeżeli zadaniem jest stworzenie GUI w Javie do  
-[[pl:​prolog:​prolog_lab:​prolog_lab_metaprog#​systemcar|systemu car]], 
-okazuje się, że jedyne elementy wymagające modyfikacji to predykaty związne z interfejsem użytkownika:​ 
-''​question/​2''​ i ''​info/​1'':​ 
- 
-<code prolog> 
-question(Result,​T):​- 
-   ​jpl_call('​javax.swing.JOptionPane','​showConfirmDialog',​[(@null),​T,'​Question',​0],​X),​ 
-   ​change(X,​Result). ​   
-  
-info(X):- 
-   ​jpl_call('​javax.swing.JOptionPane','​showMessageDialog',​[(@null),​X],​F). 
-  
-get_yes_or_no(Q,​Result) :-  
-                           ​ask_question(Q,​X),​ 
-                           ​question(Result,​X). ​                 
-change(0,​yes). 
-change(1,​no). 
-</​code>​ 
- 
-Patrz pełen [[pl:​miw:​miw08_ruleruntimeg:​car|przykład tutaj]]. 
- 
-Proszę przejrzeć wszystkie przykłady z [[pl:​miw:​miw08_ruleruntimeg|projeku MIW08_ruleruntimeg]] i każdy z nich uruchomić. 
- 
-==== Interfejsy ==== 
- 
-=== Rodzina - revisited === 
- 
-Mając "​nieśmiertelny"​ program //rodzina// z [[pl:​prolog:​prolog_lab:​wprowadzenie|pierwszych zajęć]] 
-(uwaga: pełna wersja //fam2.pl// jest [[pl:​prolog:​prolog_lab:​programy#​wymuszanie_nawrotow|na drugim lab]]!) 
-należy napisać GUI w Javie, pozwalające na zadawaniu pytań, w dwóch wariantach: 
-  * zadawanie stringu będącego zapytaniem 
-  * wyświetlanie prostego checkboxy, pozwalającego na wybór predykatu do zapytania i ew. argumentów. 
- 
-Uwaga: Prolog wywołuje Javę! 
- 
-=== Learner === 
- 
-Dodać prosty interfejs w Javie do [[pl:​prolog:​prolog_lab:​programy#​dynamiczna_bazy_wiedzy|programu learner]]. 
-(analogicznie jak w systemie //car//). 
- 
-Uwaga: Prolog wywołuje Javę! 
- 
-=== Prologowe bazy === 
- 
-Mając programy //rodzina// i //planer lotów// z 
-[[pl:​prolog:​prolog_lab:​reprezentacja_wiedzy|Lab o reprezentacji wiedzy]] należy stworzyć interfejsy pozwalające na odpowiednio:​ 
-  * modyfikowanie bazy prologowej za pomocą GUI w Javie, oraz  
-  * zadawanie zapytań 
- 
-Uwaga: Java wywołuje Prolog! 
- 
-=== Własne pomysły === 
- 
-:-) 
- 
-===== Materiały ===== 
- 
-  * Paul Singleton, //​[[http://​www.swi-prolog.org/​packages/​jpl/​|Interfejs JPL]]// 
-  * Paul Singleton, //​[[http://​www.swi-prolog.org/​packages/​jpl/​prolog_api/​overview.html|Using Java from Prolog: User guide]]// 
-  * Paul Singleton, //​[[http://​www.swi-prolog.org/​packages/​jpl/​java_api/​getting_started.html|Prolog from Java]]// 
-  * Piotr Strzelczyk, //​[[https://​ai.ia.agh.edu.pl/​wiki/​pl:​miw:​miw08_prolog_java|Różne interfejsy do Javy w Prologu (MIW08)]]// 
-  * Filip Haftek, //​[[https://​ai.ia.agh.edu.pl/​wiki/​pl:​miw:​miw08_ruleruntimeg|Przykłady systemów ekspertowych z GUI w Java (MIW08)]]// 
-  * Łukasz Łysik, //​[[https://​ai.ia.agh.edu.pl/​wiki/​pl:​miw:​miw08_prolog_javasockets|Integracja Javy i Prologu przez sockety (MIW08)]]// 
-  * Damian Janicki, //​[[https://​ai.ia.agh.edu.pl/​wiki/​pl:​miw:​miw08_ruleruntimeg_2|GUI w Javie do Varda (MIW08)]]// 
  
pl/prolog/prolog_lab/prolog_lab_java.txt · ostatnio zmienione: 2019/06/27 15:50 (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