Tampilkan postingan dengan label Prolog. Tampilkan semua postingan
Tampilkan postingan dengan label Prolog. Tampilkan semua postingan

November 15, 2014

Mengakses Engine Prolog (tuProlog) dari Scala

Prolog merupakan bahasa pemrograman komputer generasi awal, dibuat oleh Alain Colmerauer pada sekitar awal tahun 1970-an dan dikembangkan oleh Alain bersama dengan Phillipe Roussel pada tahun 1972. Prolog pada awalnya memang dikembangkan untuk aplikasi AI (Artificial Intelligence) dengan kekhususan pada formalisme linguistik. Prolog banyak digunakan pada berbagai universitas dan pendidikan tinggi dan seakan-akan jauh dari industri meskipun banyak cerita kesuksesan dari Prolog (misalnya penggunaan Sicstus Prolog atau SWI Prolog). Di Indonesia, bisa dibilang Prolog memang murni masih berada di "dunia imajinasi" karena hanya digunakan pada banyak mata kuliah di berbagai perguruan tinggi tetapi jauh dari dunia industri (as always, CMIIW).

Saat ini Prolog mulai banyak dikembangkan untuk aplikasi tingkat lanjut karena kemampuan internal dari bahasa pemrograman tersebut yang sesuai untuk pemecahan masalah kompleks yang melibatkan reasoning serta berbagai fasilitas lainnya yang sesuai untuk keperluan aplikasi terdistribusi di Intenet (DCG untuk parsing dan menghasilkan list, pemrosesan data, declarative programming untuk komunikasi dan interaksi agent, dan lain-lain). Interpreter dan compiler Prolog juga banyak dikembangkan dan tersedia untuk berbagai platform. Untuk tulisan ini kita akan menggunakan tuProlog. tuProlog merupakan sistem Prolog yang dikembangkan untuk Java (dan .NET). Hal yang menarik dari tuProlog, sistem ini menyediakan sistem Prolog yang ringan dan hanya mengkonsentrasikan diri pada fitur standar (ISO Prolog) sedangkan bagian lainnya bisa menggunakan Java. Untuk artikel ini kita akan menggunakan Scala yang merupakan bahasa obyek-fungsional untuk aplikasi yang dijalankan di atas JVM.

Untuk mengikuti artike ini, ada beberapa yang harus dipersiapkan:

  1. Install JDK (saya menggunakan versi 1.8.0_25)
  2. Install Scala (saya menggunakan versi 2.11.4)
  3. Download tuProlog (saya menggunakan versi 2..9.1)
  4. Hmm ... saya menggunakan Linux - bash, jika anda menggunakan tools selain itu silahkan buat penyesuaian sendiri.


Artikel ini hanya menjelaskan cara mengakses Prolog engine melalui Scala. Setelah memahami artikel ini, anda bisa menggunakan fitur dari sistem tuProlog, menuliskan kode Prolog yang dijalankan melalui tuProlog dan kemudian menjalankan engine Prolog melalui Scala sekaligus mengambil hasil dari hasil eksekusinya. Untuk artikel ini, kita belum menggunakan sbt sehingga setting CLASSPATH harus dilakukan secara manual. Artikel menggunakan sbt semoga bisa segera menyusul.

Copy file 2p.jar dan tuprolog.jar

$ ls
total 744
drwxr-xr-x  2 bpdp bpdp   4096 Nov 16 08:04 .
drwxr-xr-x 19 bpdp bpdp   4096 Nov 16 07:58 ..
-rw-r--r--  1 bpdp bpdp 547424 Nov 16 08:00 2p.jar
-rw-r--r--  1 bpdp bpdp    392 Nov 16 08:04 HelloProlog.scala
-rw-r--r--  1 bpdp bpdp 198340 Nov 16 08:00 tuprolog.jar
$


Setting CLASSPATH

$ export CLASSPATH=$CLASSPATH:.:2p.jar:tuprolog.jar
$


Kode Sumber

File Scala berikut ini (HelloProlog.scala) saya terjemahkan dari manual untuk kode sumber Java hal 166. Interoperabilitas Scala dan Java sangat bagus sehingga penggunaan tuProlog engine berjalan dengan baik dan kode sumber Scala relatif lebih mudah dipahami.


import alice.tuprolog._
import scala.util.control._

object HelloProlog {

  def main(args: Array[String]) {

    val pEngine = new Prolog
    var info = pEngine.solve("append(X,Y,[1,2]).")
    val loop = new Breaks

    loop.breakable {
      
      while (info.isSuccess()) {

        println("solution: " + info.getSolution() + 
          " - bindings: " + info)
        if (pEngine.hasOpenAlternatives()) {
          info = pEngine.solveNext()
        } else {
          loop.break
        }

      }

    }

  }

}


Penggunaan tuProlog engine sesederhana mendefinisikan engine Prolog (new Prolog) dan kemudian menggunakan method solve untuk mengeksekusi kode sumber Prolog.

Kompilasi

$ scalac HelloProlog.scala
$ ls -la
total 756
drwxr-xr-x  2 bpdp bpdp   4096 Nov 16 08:43 .
drwxr-xr-x 19 bpdp bpdp   4096 Nov 16 07:58 ..
-rw-r--r--  1 bpdp bpdp 547424 Nov 16 08:00 2p.jar
-rw-r--r--  1 bpdp bpdp   1930 Nov 16 08:16 HelloProlog$$anonfun$main$1.class
-rw-r--r--  1 bpdp bpdp    657 Nov 16 08:16 HelloProlog.class
-rw-r--r--  1 bpdp bpdp   1140 Nov 16 08:16 HelloProlog$.class
-rw-r--r--  1 bpdp bpdp    520 Nov 16 08:16 HelloProlog.scala
-rw-r--r--  1 bpdp bpdp 198340 Nov 16 08:00 tuprolog.jar
$


Running

$ scala HelloProlog
solution: append([],[1,2],[1,2]) - bindings: yes.
X / []  Y / [1,2]
solution: append([1],[2],[1,2]) - bindings: yes.
X / [1]  Y / [2]
solution: append([1,2],[],[1,2]) - bindings: yes.
X / [1,2]  Y / []


Menggunakan tuProlog akan memungkinkan aplikasi kita menggunakan berbagai fitur AI yang bermanfaat untuk memperbaiki kinerja software yang kita aplikasikan. Happy hacking!

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!