Node:Single Threaded Example, Next:, Up:Calling Prolog from Java

Single Threaded Example

The following is a Java version of the train example. See Train Example, for information about how the train.sav file is created.

This code demonstrates the use of Jasper in single threaded mode. In this mode only one thread can access the SICStus runtime via a SICStus object.

import se.sics.jasper.SICStus; import se.sics.jasper.Query; import java.util.HashMap; public class Simple { public static void main(String argv[]) { SICStus sp; Query query; HashMap WayMap = new HashMap(); try { sp = new SICStus(argv,null); sp.restore("train.sav"); query = sp.openPrologQuery("connected('Írebro', 'Stockholm', Way, Way).", WayMap); try { while (query.nextSolution()) { System.out.println(WayMap); } } finally { query.close(); } } catch ( Exception e ) { e.printStackTrace(); } } }

It is assumed that the reader has read the section on Getting Started, which describes how to get the basics up and running.

This is how the example works:

  1. Before any predicates can be called, the SICStus run-time system must be initialized. This is done by instantiating the SICStus class. Each SICStus object correspond to one independent copy of the SICStus run-time system (a rather heavy-weight entity).

    In this example, we have specified null as the second argument to SICStus. This instructs SICStus to search for sprt.sav using its own internal methods, or using a path specified by passing -Dsicstus.path=[...] to the JVM.

  2. Queries are made through method query. The arguments to this method are a string specifying a Prolog goal, and a Map, which will contain a mapping of variable names to bindings. This method is for finding a single solution. Note that the string is read by the Prolog reader, so it must conform to the syntax rules for Prolog, including the terminating period. There are two more methods for making queries: queryCutFail, for side-effects only, and openQuery to produce several solutions through backtracking.
  3. The next step is to load the Prolog code. This is done by the method restore. Corresponds to SP_restore() in the C-interface. See Loading Prolog Code. Note that this method must be called before any other SICStus method is called. See the HTML Jasper documentation for details.
  4. The openQuery method returns a reference to a query, an object implementing the Query interface. To obtain solutions, the method nextSolution is called with no arguments. nextSolution returns true as long as there are more solutions, and the example above will print the value of the Map WayMap until there are no more solutions. Note that the query must be closed, even if nextSolution has indicated that there are no more solutions.