Next: REL RELFUN Functions
Up: Determinism Transformation
Previous: Restricting the Query
In this subsection, the determinism analysis and the
transformation steps for deeply deterministic predicates are
described.
For reasons of simplicity, only the following two kinds of deeply
deterministic predicates are supported:
- functional predicates: predicates which for a given
set of ground input arguments compute a ground set of output
arguments, i.e. they always compute exactly one solution
and never fail (total functions)
- test predicates: predicates which when called with all
arguments ground either fail or succeed exactly once;
these test predicates are used as guards
For a program , in which the predicates are defined,
and a set of mode declarations ,
deeply deterministic functional or test predicates
are detected by the following algorithm:
- :
construct a set of candidates consisting of all
predicates with at least one ground argument (if all
arguments are ground, the predicate is assumed to be a test
predicate, otherwise it is assumed to be a functional predicate)
- while do
:
repeat deleting all predicates in if in their definition
a predicate in is used
until no such predicate in exists
- try to transform all predicates in into LL (with the
algorithms described in the following subsections); remove all
predicates from which could not be thus transformed
- same as 2.
In the transformation steps, several intermediate representations
are used:
The following REL example will be used to demonstrate the various
transformations and intermediate representations. It consists
of two deeply deterministic functional predicates:
This example was chosen for the following reasons:
- fac (the factorial function) is
used to show how the algorithms work for a simple case.
- f is a rather artificial function using fac. It
is used to show how the algorithms handle non-standard cases:
- the definition of f cannot be evaluated by REL
(the arithmetical builtin - is called with free
variables),
- the expression A is -(B,A) is cyclic,
- the unification in s[A,B] is s[X,Y]
has to be handled
at compile time (static unification),
- lists and structures are transformed into LL constructors,
selectors, and test predicates, and
- subexpressions in the output value can be shared with
the input value.
Next: REL RELFUN Functions
Up: Determinism Transformation
Previous: Restricting the Query