public class Query extends java.lang.Object implements java.lang.Iterable<java.util.Map<java.lang.String,Term>>, java.util.Iterator<java.util.Map<java.lang.String,Term>>
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 Map representing variable bindings; the elements in the Map 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 = ((Map) 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
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Modifier and Type | Field and Description |
---|---|
protected java.lang.String |
contextModule |
protected Term |
goal_
the Compound or Atom (but not Dict, Float, Integer or Variable)
corresponding to the goal of this Query
|
protected java.lang.String |
hostModule |
Constructor and Description |
---|
Query(java.lang.String text)
This constructor builds a Query from the given Prolog source text, "as is".
|
Query(java.lang.String text,
Term arg) |
Query(java.lang.String text,
Term[] args)
If text denotes an atom, this constructor is shorthand for
new Query(new Compound(name,args)).
|
Query(Term t)
This constructor creates a Query whose goal is the specified Term.
|
Modifier and Type | Method and Description |
---|---|
java.util.Map<java.lang.String,Term>[] |
allSolutions()
calls the Query's goal to exhaustion and returns an array of zero or more
Maps of zero or more variablename-to-term bindings (each Map represents a
solution, in the order in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
allSolutions(java.lang.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
Maps of zero or more variablename-to-term bindings (each Map represents a
solution, in the order in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
allSolutions(java.lang.String text,
Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N
questionmark (?) symbols and there are N accompanying Term params, this
static method replaces each questionmark symbol by its respective param,
calls the resulting goal to exhaustion, and returns an array of zero or
more Maps of zero or more variablename-to-term bindings (each Map
represents a solution, in the order in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
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 Maps of zero or more
variablename-to-term bindings (each Map represents a solution, in the
order in which they were found).
|
void |
close()
This method can be used to close an open query before its solutions are
exhausted.
|
java.lang.String |
getContext()
Returns the context module for this Query
|
long |
getEngine()
Returns the engine attached to this query
|
java.util.Map<java.lang.String,Term> |
getSolution()
Deprecated.
use nextSolution()
|
java.util.Map<java.lang.String,Term> |
getSolutionWithVarNames()
Deprecated.
|
java.util.Map<java.lang.String,Term> |
getSubstWithNameVars()
Deprecated.
|
Term |
goal()
Returns the Term (Atom or Compound) 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 |
hasNext()
This method is required by Iterator interface
It is a wrapper for
hasMoreSolutions() |
boolean |
hasSolution()
This method will attempt to call this Query's goal within an available
Prolog engine.
|
static boolean |
hasSolution(java.lang.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(java.lang.String text,
Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N
questionmark (?) symbols and there are N params, each questionmark symbol
is replaced by its corresponding arg to provide the new Query's goal: the
resulting Query is called as described above.
|
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.
|
boolean |
isOpen()
Whether the query is open.
|
java.util.Iterator<java.util.Map<java.lang.String,Term>> |
iterator()
This method is required by Iterator interface
a Query is its own Iterator
|
java.util.Map<java.lang.String,Term> |
next()
This method is required by Iterator interface
It is a wrapper for
nextSolution() |
java.lang.Object |
nextElement()
This method implements part of the java.util.Enumeration interface.
|
java.util.Map<java.lang.String,Term> |
nextSolution()
This method returns a java.util.Map, which represents a binding from the
names of query variables to terms within the next solution.
|
java.util.Map<java.lang.String,Term>[] |
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
Maps of variablename-to-term bindings) every found solution (in the order
in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
nSolutions(java.lang.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
Maps of variablename-to-term bindings) every found solution (in the order
in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
nSolutions(java.lang.String text,
Term[] params,
long n)
If text denotes (in traditional Prolog source syntax) a term containing N
questionmark (?) symbols and there are N accompanying params, this static
method replaces each questionmark symbol by its respective param, calls
the resulting goal to exhaustion or until N solutions are found,
whichever is sooner, and returns an array containing (as possibly empty
Maps of variablename-to-term bindings) every found solution (in the order
in which they were found).
|
static java.util.Map<java.lang.String,Term>[] |
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 Maps of
variablename-to-term bindings) every found solution (in the order in
which they were found).
|
java.util.Map<java.lang.String,Term> |
oneSolution()
Returns the first solution, if any, as a (possibly empty) Map of
variablename-to-term bindings, else null.
|
static java.util.Map<java.lang.String,Term> |
oneSolution(java.lang.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) Map, else null.
|
static java.util.Map<java.lang.String,Term> |
oneSolution(java.lang.String text,
Term[] params)
If text denotes (in traditional Prolog source syntax) a term containing N
questionmark (?) symbols and there are N params, each questionmark symbol
is replaced by its respective param to provide the goal of this query:
the resulting goal is then called (at most once) and the first solution,
if there is one, is returned as a (possibly empty) Map, else null.
|
static java.util.Map<java.lang.String,Term> |
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) Map, else null.
|
void |
open()
This method returns true if JPL was able to initiate a "call" of this
Query within the Prolog engine.
|
void |
remove()
This method (required by Iterator interface) is a no-op
|
void |
reset()
Reset the query to its start: closed and no solution found so far.
|
java.lang.String |
toString()
Returns a crude String representation of a Query.
|
protected final Term goal_
protected final java.lang.String hostModule
protected final java.lang.String contextModule
public Query(Term t)
t
- the goal of this Query; must be Atom or CompoundJPLException
- if term provided is not of right sort Atom or Compoundpublic Query(java.lang.String text)
text
- the complete Prolog source text of this QueryPrologException
- containing error(syntax_error(_),_) if text is invalid as a term.JPLException
- if term provided is not of right sort Atom or Compoundpublic Query(java.lang.String text, Term[] args)
text
- the name of the principal functor of this Query's goalargs
- the arguments of this Query's goalpublic Query(java.lang.String text, Term arg)
public final Term goal()
public final java.lang.String getContext()
public java.util.Iterator<java.util.Map<java.lang.String,Term>> iterator()
iterator
in interface java.lang.Iterable<java.util.Map<java.lang.String,Term>>
Iterable.iterator()
public boolean hasNext()
hasMoreSolutions()
hasNext
in interface java.util.Iterator<java.util.Map<java.lang.String,Term>>
Iterator.hasNext()
public java.util.Map<java.lang.String,Term> next()
nextSolution()
next
in interface java.util.Iterator<java.util.Map<java.lang.String,Term>>
Iterator.next()
public void remove()
remove
in interface java.util.Iterator<java.util.Map<java.lang.String,Term>>
Iterator.remove()
public final boolean hasMoreElements()
hasMoreSolutions()
.public final java.lang.Object nextElement()
nextSolution()
public final boolean isOpen()
public final long getEngine()
public final boolean hasMoreSolutions()
Query q = // obtain Query reference while (q.hasMoreSolutions()) { Map solution = q.nextSolution(); // process solution... }
public final void open()
Query q = // obtain Query reference Map soln; q.open(); while ((soln = q.getSolution()) != null) { // 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.
public final void reset()
@Deprecated public final java.util.Map<java.lang.String,Term> getSolution()
@Deprecated public final java.util.Map<java.lang.String,Term> getSubstWithNameVars()
public final java.util.Map<java.lang.String,Term> nextSolution()
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 Map.
Variable x = new Variable("X"); Query q = // obtain Query reference (with x in the Term array) while (q.hasMoreSolutions()) { Map solution = q.nextSolution(); // make t the Term bound to "X" in the solution Term t = (Term) solution.get("X"); // ... }Programmers should be careful to call this method after checking that there is indeed a solution, via method hasMoreSolutions().
JPLException
- if Query is not open.java.util.NoSuchElementException
- if there are no more new solutions.@Deprecated public final java.util.Map<java.lang.String,Term> getSolutionWithVarNames()
public final void close()
Here is one way to get the first three solutions to a Query:
Query q = new Query(predicate, args); Map<String, Term> sub1 = q.nextSolution(); Map<String, Term> sub2 = q.nextSolution(); Map<String, Term> sub3 = q.nextSolution(); q.close();
public final java.util.Map<java.lang.String,Term>[] allSolutions()
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).
public static final java.util.Map<java.lang.String,Term>[] allSolutions(Term goal)
goal
- the goal of this Querypublic static final java.util.Map<java.lang.String,Term>[] allSolutions(java.lang.String text)
text
- a Prolog source text fragment denoting a goalpublic static final java.util.Map<java.lang.String,Term>[] allSolutions(java.lang.String text, Term[] params)
text
- the Prolog source text of a goal, in which questionmarks are
regarded as substitutible parametersparams
- terms to be substituted for the respective questionmarks in
the query textpublic final java.util.Map<java.lang.String,Term>[] nSolutions(long n)
n
- the number of solutions to coverNB 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).
public static final java.util.Map<java.lang.String,Term>[] nSolutions(Term goal, long n)
goal
- the goal of this Queryn
- the number of solutions to coverpublic static final java.util.Map<java.lang.String,Term>[] nSolutions(java.lang.String text, long n)
text
- a Prolog source text fragment denoting a goaln
- the number of solutions to coverpublic static final java.util.Map<java.lang.String,Term>[] nSolutions(java.lang.String text, Term[] params, long n)
text
- the Prolog source text of a goal, in which questionmarks are
regarded as substitutible parametersparams
- terms to be substituted for the respective questionmarks in
the query textn
- the number of solutions to coverpublic final java.util.Map<java.lang.String,Term> oneSolution()
public static final java.util.Map<java.lang.String,Term> oneSolution(Term goal)
goal
- the goal of this Querypublic static final java.util.Map<java.lang.String,Term> oneSolution(java.lang.String text)
text
- a Prolog source text fragment denoting a goalpublic static final java.util.Map<java.lang.String,Term> oneSolution(java.lang.String text, Term[] params)
text
- the Prolog source text of a goal, in which questionmarks are
regarded as substitutible parametersparams
- terms to be substituted for the respective questionmarks in
the query textpublic final boolean hasSolution()
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.
public static final boolean hasSolution(Term goal)
goal
- the goal of this Querypublic static final boolean hasSolution(java.lang.String text)
text
- the goal of this Query, as Prolog source textpublic static final boolean hasSolution(java.lang.String text, Term[] params)
text
- the Prolog source text of a goal, in which questionmarks are
regarded as substitutible parametersparams
- terms to be substituted for the respective questionmarks in
the query textpublic java.lang.String toString()
toString
in class java.lang.Object