April 29, 2013

Mengakses Java dari SWI Prolog

SWI Prolog mempunyai fasilitas bi-directional untuk menghubungkan program Java yang kita buat dengan Prolog dan sebaliknya, jadi kita bisa mengakses Java melalui SWI Prolog, demikian juga Java bisa menggunakan kemampuan rule-based system dan fasilitas-fasilitas dari SWI Prolog. Fasilitas ini akan disertakan secara langsung saat mengkompilasi SWI Prolog jika kita mempunyai JDK (baik Oracle JDK maupun OpenJDK). Hasil dari proses kompilasi tersebut adalah JPL.

Membahas mengenai interfacing ini relatif kompleks, tetapi bisa dimulai dari konfigurasi. Standar konfigurasi dari $JAVA_HOME dan lain-lain masih harus ditambahkan lagi. Jika menggunakan instalasi JDK dari disto, barangkali akan berbeda, tetapi yang saya uraikan ini adalah konfigurasi dari instalasi manual JDK. Pada instalasi manual JDK, masih harus ditambahkan environment variable LD_LIBRARY_PATH. Jika tidak dikonfigurasi, ada error tidak ditemukan pustaka-pustaka yang diperlukan seperti berikut ini:

09:43:27-bpdp@bpdp-arch:/usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog$ swipl
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.3.14)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- [jpl_versions_demo].
ERROR: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
'$open_shared_object'/3: libjvm.so: cannot open shared object file: No such file or directory
ERROR: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
library `java' does not exist (Please add directory holding libjava.so to $LD_LIBRARY_PATH)
Warning: /usr/lib/swipl-6.3.14/library/jpl.pl:4637:
Goal (directive) failed: jpl:initialization(setup_jvm,now)
ERROR: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:1:
Exported procedure jpl:jpl_c_lib_version/1 is not defined
%  library(jpl) compiled into jpl 0.06 sec, 1,947 clauses
ERROR: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:22:
jpl:jFindClass/2: Undefined procedure: jpl:jni_func/3
Warning: /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/prolog/jpl_versions_demo.pl:22:
Goal (directive) failed: user:jpl_versions_demo
% jpl_versions_demo compiled 0.07 sec, 1,953 clauses
true.
?- 

File-file yang diperlukan terdapat pada instalasi JDK. Pada komputer saya, $JAVA_HOME=/home/bpdp/software/jdk. Export environment variable LD_LIBRARY_PATH bisa dilakukan di .bashrc maupun di tempat lain sebagai berikut:

$ cat $HOME/.bashrc
...
...
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/i386:$JAVA_HOME/jre/lib/i386/client
...
...
$
Hasilnya adalah sebagai berikut:

?- [jpl_versions_demo].
%  library(jpl) compiled into jpl 0.06 sec, 1,978 clauses
prolog library version: 3.1.4-alpha
  java library version: 3.1.4-alpha
     c library version: 3.1.4-alpha
BINGO! you appear to have the same version of each library installed
% jpl_versions_demo compiled 0.18 sec, 2,030 clauses
true.
?- 

BINGO! It works! Mari kita lihat contoh JTable:

?- [jpl_table_demo].
% jpl_table_demo compiled 0.69 sec, 1,619 clauses
true.
?- 

Silahkan melihat ke /usr/lib/swipl-6.3.14/doc/packages/examples/jpl/ untuk contoh-contoh lainnya. 

Selamat berkarya!










0 comments:

Posting Komentar