jpl
public class Query extends Object implements Enumeration
A Query is either open or closed: when closed, it has no connection to the Prolog system; when open, it is linked to an active goal within a Prolog engine.
The Query class implements the Enumeration interface, through which one can obtain successive solutions. The Enumeration hasMoreElements() method returns true if the call or redo succeeded (otherwise false), and if the call or redo did succeed, the nextElement() method returns a Hashtable representing variable bindings; the elements in the Hashtable are Terms, indexed by the (String) names of the Variables with which they are associated. For example, if p(a) and p(b) are facts in the Prolog database, then the following is equivalent to printing all the solutions to the Prolog query p(X):
Variable X = new Variable("X"); Term arg[] = { X }; Query q = new Query("p", arg); while (q.hasMoreElements()){ Term bound_to_x = ((Hashtable) q.nextElement()).get("X"); System.out.println(bound_to_x); }Make sure to close the Query (using the close() method) if you do not need any further solutions which it may have. It is safe (although redundant) to close a Query whose solutions are already exhausted, or which is already closed. To obtain just one solution from a Query, use the oneSolution() method. To obtain all solutions, use the allSolutions() method. To obtain at most N solutions, use the nSolutions() method. To determine merely whether the Query is provable, use the hasSolution() method (i.e. has at least one solution).
Copyright (C) 1998 Fred Dushin
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library Public License for more details.
Constructor Summary | |
---|---|
Query(Term t)
This constructor creates a Query whose goal is the specified Term.
| |
Query(String text, Term[] args)
If text denotes an atom, this constructor is shorthand for
new Query(new Compound(name,args)),
but if text denotes a term containing N query (?) | |
Query(String text, Term arg) | |
Query(String text)
This constructor builds a Query from the given Prolog source text.
|
Method Summary | |
---|---|
int | abort() |
Hashtable[] | allSolutions()
calls the Query's goal to exhaustion
and returns an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found). |
static Hashtable[] | allSolutions(Term goal)
This static method creates a Query whose goal is the given Term,
calls it to exhaustion,
and returns an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found).
|
static Hashtable[] | allSolutions(String text)
This static method creates a Query from the given Prolog source text fragment,
calls it to exhaustion,
and returns an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found).
|
static Hashtable[] | allSolutions(String text, Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N questionmark (?) |
Term[] | args() |
void | close()
This method can be used to close an open query before its solutions are exhausted.
|
String | debugString()
Returns a debug-friendly representation of a Query
|
Hashtable | getSolution()
This method returns a java.util.Hashtable, which represents
a set of bindings from the names of query variables to terms within the solution.
|
Hashtable | getSubstWithNameVars() |
Compound | goal()
Returns the Compound (hence perhaps an Atom) which is the goal of this Query |
boolean | hasMoreElements()
This method implements part of the java.util.Enumeration
interface. |
boolean | hasMoreSolutions()
This method returns true if JPL was able to initiate a "call" of this
Query within a Prolog engine. |
boolean | hasSolution()
This method will attempt to call this Query's goal within an available Prolog engine. |
static boolean | hasSolution(Term goal)
This static method creates a Query (whose goal is the specified Term)
and calls it at most once, returning true if a solution was found, else false.
|
static boolean | hasSolution(String text)
This static method creates a Query from the given Prolog source text
and calls it at most once, returning true if a solution was found, else false.
|
static boolean | hasSolution(String text, Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N questionmark (?) |
String | name() |
Object | nextElement()
This method implements part of the java.util.Enumeration
interface. |
Hashtable | nextSolution()
This method returns a java.util.Hashtable, which represents
a binding from the names of query variables to terms within the solution.
|
Hashtable[] | nSolutions(long n)
calls the Query's goal to exhaustion or until N solutions are found, whichever is sooner,
and returns an array containing (as possibly empty Hashtables of variablename-to-term bindings) every found solution (in the order in which they were found). |
static Hashtable[] | nSolutions(Term goal, long n)
This static method creates a Query whose goal is the given Term,
calls it to exhaustion or until N solutions are found, whichever is sooner,
and returns an array containing (as possibly empty Hashtables of variablename-to-term bindings) every found solution (in the order in which they were found).
|
static Hashtable[] | nSolutions(String text, long n)
This static method creates a Query from the given Prolog source text fragment,
calls it to exhaustion or until N solutions are found, whichever is sooner,
and returns an array containing (as possibly empty Hashtables of variablename-to-term bindings) every found solution (in the order in which they were found).
|
static Hashtable[] | nSolutions(String text, Term[] params, long n)
If text denotes (in traditional Prolog source syntax) a term containing N questionmark (?) |
Hashtable | oneSolution()
Returns the first solution, if any, as a (possibly empty) Hashtable of variablename-to-term bindings, else null.
|
static Hashtable | oneSolution(Term goal)
This static method creates a Query (whose goal is the specified Term)
and calls it at most once, returning the first solution, if there is one, as a (possibly empty) Hashtable, else null.
|
static Hashtable | oneSolution(String text)
This static method creates a Query from the given Prolog source text fragment,
and calls it at most once, returning the first solution, if there is one, as a (possibly empty) Hashtable, else null.
|
static Hashtable | oneSolution(String text, Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N questionmark (?) |
void | open()
This method returns true if JPL was able to initiate a "call" of this
Query within the Prolog engine. |
boolean | query()
This method will attempt to call this Query's goal within an available Prolog engine. |
void | rewind() |
String | toString()
Returns a crude String representation of a Query.
|
Parameters: t the goal of this Query
Parameters: text the name of the principal functor of this Query's goal args the arguments of this Query's goal
Parameters: text the Prolog source text of this Query
Returns: an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found)
NB in JPL 1.0.1, this method (inconsistently) returned null when a Query had no solutions;
in JPL 2.x onwards it returns an empty array (thus the length of the array is, in every case,
the quantity of solutions).
NB in JPL 1.0.1, bindings were keyed (awkwardly) by Variable instances;
in JPL 2.x onwards they are keyed by the (String) names of variables,
which is consistent with the Term type being just a concrete syntax for terms (and hence queries).
Parameters: goal the goal of this Query
Returns: an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found)
Parameters: text a Prolog source text fragment denoting a goal
Returns: an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found)
Parameters: text the Prolog source text of a goal, in which questionmarks are regarded as substitutible parameters params terms to be substituted for the respective questionmarks in the query text
Returns: an array of zero or more Hashtables of zero or more variablename-to-term bindings (each Hashtable represents a solution, in the order in which they were found)
Deprecated: Use .goal().args() instead.
Returns: the arguments of this Query's goal (redundant, deprecated)
Here is one way to get the first three solutions to a Query:
Query q = new Query(predicate, args); Hashtable sub1 = (Hashtable) q.nextSolution(); Hashtable sub2 = (Hashtable) q.nextSolution(); Hashtable sub3 = (Hashtable) q.nextSolution(); q.close();
Deprecated:
Returns a debug-friendly representation of a QueryReturns: a debug-friendly representation of a Query
For example, if a Query has an occurrence of a jpl.Variable, say, named "X", one can obtain the Term bound to "X" in the solution by looking up "X" in the Hashtable.
Variable x = new Variable("X"); Query q = // obtain Query reference (with x in the Term array) while (q.hasMoreSolutions()) { Hashtable solution = q.nextSolution(); // make t the Term bound to "X" in the solution Term t = (Term) solution.get("X"); // ... }Programmers should obey the following rules when using this method. This method will throw a JPLException if Query is not open.
Returns: A Hashtable representing a substitution, or null
Returns: a Term representing the goal of this Query
Returns: true if the Prolog query yields a (or another) solution, else false.
Query q = // obtain Query reference while (q.hasMoreSolutions()) { Hashtable solution = q.nextSolution(); // process solution... }To ensure thread-safety, you should wrap sequential calls to this method in a synchronized block, using the static lock method to obtain the monitor.
Query q = // obtain Query reference synchronized ( jpl.Query.lock() ){ while ( q.hasMoreElements() ){ Hashtable solution = q.nextSolution(); // process solution... } }
Returns: true if the Prolog query succeeds; otherwise false.
Returns: the provability of the Query, i.e. 'true' if it has at least
one solution, 'false' if the call fails without finding a solution.
Only the first solution (if there is one) will be found;
any bindings will be discarded, and the Query will be closed.
This method will throw a JPLException if this Query is already open.
Parameters: goal the goal of this Query
Parameters: text the goal of this Query, as Prolog source text
Parameters: text the Prolog source text of a goal, in which questionmarks are regarded as substitutible parameters params terms to be substituted for the respective questionmarks in the query text
Deprecated: Use .goal().name() instead.
Returns: the name of this Query's goal (redundant, deprecated)
Returns: A Hashtable representing a substitution.
For example, if a Query has an occurrence of a jpl.Variable, say, named "X", one can obtain the Term bound to "X" in the solution by looking up "X" in the Hashtable.
Variable x = new Variable("X"); Query q = // obtain Query reference (with x in the Term array) while (q.hasMoreSolutions()) { Hashtable solution = q.nextSolution(); // make t the Term bound to "X" in the solution Term t = (Term) solution.get("X"); // ... }Programmers should obey the following rules when using this method. This method will throw a JPLException if Query is not open.
Returns: A Hashtable representing a substitution.
Returns: an array of Hashtables (possibly none), each of which is a solution
(in the order in which they were found) of the Query; at most 'n' solutions will be found and returned.
NB in JPL 1.0.1, this method (inconsistently) returned null when a Query had no solutions;
in JPL 2.x onwards it returns an empty array (thus the length of the array is, in every case,
the quantity of solutions).
NB in JPL 1.0.1, bindings were keyed (awkwardly) by Variable instances;
in JPL 2.x onwards they are keyed by the (String) names of variables,
which is consistent with the Term type being just a concrete syntax for terms (and hence queries).
Parameters: goal the goal of this Query
Parameters: text a Prolog source text fragment denoting a goal
Parameters: text the Prolog source text of a goal, in which questionmarks are regarded as substitutible parameters params terms to be substituted for the respective questionmarks in the query text
Returns: the first solution, if the query has one, as a (possibly empty) Hashtable. If the return value is null, this means that the Query has no solutions.
Parameters: goal the goal of this Query
Parameters: text a Prolog source text fragment denoting a goal
Parameters: text the Prolog source text of a goal, in which questionmarks are regarded as substitutible parameters params terms to be substituted for the respective questionmarks in the query text
Query q = // obtain Query reference synchronized ( jpl.Query.lock() ){ while ( q.hasMoreElements() ){ Hashtable solution = q.nextSolution(); // process solution... } }
If this method is called on an already-open Query, or if the query cannot be set up for whatever reason, then a JPLException will be thrown.
Deprecated: Use .hasSolution() instead.
This method will attempt to call this Query's goal within an available Prolog engine.Returns: the provability of the Query, i.e. 'true' if it has at least
one solution, 'false' if the call fails without finding a solution.
Only the first solution (if there is one) will be found;
any bindings will be discarded, and the Query will be closed.
This method will throw a JPLException if this Query is already open.
Returns: a crude String representation of a Query