This blog entry is for those who want to use Prolog queries from their Java program. I use swi-prolog, a free implementation of the Prolog language.
The SWI-prolog installation includes the java jpl7 package (in the lib installation folder):
http://jpl7.org/JavaApiOverview.jsp
To use it from java you need to setup some system variables before executing your app. Moreover, the java and swi-prolog installations must both be 32 bit or 64bit. For example you can edit a run.bat batch file with the following commands (assuming that swi-prolog is installed in c:/program files/swipl and your app is in the executable <your jar name>.jar file):
set SWI_PROLOG_PATH=c:\program files\swipl set path=%path%;%SWI_PROLOG_PATH%\bin\;%SWI_PROLOG_PATH%\lib\ swipl.exe --dump-runtime-variables=cmd > plvars.bat call plvars.bat java -jar <your jar name>.jar
This approach assumes that the jpl.jar library file is included in your jar file, otherwise you must add the jpl.jar to the classpath variable. In the next blog entry I explain how to do that using eclipse.
See an example that adds in the fact father(john,nikos) to the prolog database and then runs the query father(X,nikos):
import java.util.Map; import org.jpl7.*; public class TestPrologInterface { public static void main(String[] args) { String s = "assert(father(john,nikos))."; Query q = new Query(s); // run the query if (q.hasNext()) { // now I can ask for the father of nikos s = "father(X,nikos)."; q = new Query(s); // run the query, repeat while there are more results while (q.hasNext()){ //get a mapping of variables to instantiations: Map<String, Term> map = q.next(); //get the instance of variable X String varX = map.get("X").toString(); //print variable instance System.out.println(varX); } } } }