This section documents the built-in predicates that deal with
engines. In addition to these, most predicates dealing with threads and
message queue can be used to access engines.
- [det]engine_create(+Template,
:Goal, ?Engine)
- [det]engine_create(+Template,
:Goal, -Engine, +Options)
- Create a new engine and unify Engine with a handle to it.
Template and Goal form a pair similar to findall/3:
the instantiation of Template becomes available through engine_next/2
after Goal succeeds. Options is a list of the
following options. See thread_create/3
for details.
- alias(+Name)
- Give the engine a name. Name must be an atom. If this option
is provided, Engine is unified with Name. The name
space for engines is shared with threads and mutexes.
- stack(+Bytes)
- Set the stack limit for the engine. The default is inherited from the
calling thread.
The Engine argument of engine_create/3
may be instantiated to an atom, creating an engine with the given alias.
- [det]engine_destroy(+Engine)
- Destroy Engine.
- [semidet]engine_next(+Engine,
-Term)
- Ask the engine Engine to produce a next answer. On this first
call on a specific engine, the Goal of the engine is started.
If a previous call returned an answer through completion, this causes
the engine to backtrack and finally, if the engine produces a previous
result using engine_yield/1,
execution proceeds after the engine_yield/1
call.
- [det]engine_next_reified(+Engine,
-Term)
- Similar to engine_next/2,
but instead of success, failure or or raising an exception, Term
is unified with one of terms below. This predicate is provided primarily
for compatibility with Lean Prolog.
- the(Answer)
- Goal succeeded with Template bound to Answer or
Goal yielded with a term Answer.
- no
- Goal failed.
- throw(Exception)
- Goal raised Exception.
- [det]engine_post(+Engine,
+Term)
- Make Term available to engine_fetch/1
inside the Engine. This call must be followed by a call to engine_next/2
and the engine must call engine_fetch/1.
- [det]engine_post(+Engine,
+Term, -Reply)
- Combines engine_post/2
and engine_next/2.
- [det]engine_yield(+Term)
- Called from within the engine, causing engine_next/2
in the caller to return with Term. A subsequent call to engine_next/2
causes
engine_yield/1
to‘return’. This predicate can only be called if the engine
is not involved in a callback from C, i.e., when the engine calls a
predicate defined in C that calls back Prolog it is not possible to use
this predicate. Trying to do so results in a
permission_error
exception.
- [det]engine_fetch(-Term)
- Called from within the engine to fetch the term made available through
engine_post/2
or engine_post/3.
If no term is available an existence_error exception is raised.
- [det]engine_self(-Engine)
- Called from within the engine to get access to the handle to the engine
itself.
- [semidet]is_engine(@Term)
- True if Term is a reference to or the alias name of an
existing engine.
- [nondet]current_engine(-Engine)
- True when Engine is an existing engine.