Before describing the algorithms for determinism transformation, determinism in relational languages is defined. The definition presented in this work was designed to cover as many deterministic predicates as possible since in the context of a transformation into LL, the gain in efficiency grows directly with the number of transformed deterministic predicates.
In this work, determinism is defined via SLD resolution trees:
As this definition states, all goals appearing as first elements in the nodes of an SLD resolution tree are activated subgoals. This is due to PROLOG's computation rule which always selects the leftmost goal in a goal sequence.
Now the fundamental definition of determinism in PROLOG can be given:
This definition specifies a predicate to be deterministic
if for all possible queries all activated subgoals with as predicate
either
There are other possibilities to define determinism in PROLOG. In the following, examples motivating our definition and modifications that make it tractable and more powerful are given.
In definition 4.5, a predicate is deterministic w.r.t. to a given program and a given set of queries . A definition of determinism in PROLOG that does not consider an entire program and a set of queries but only the clauses of a single predicate will not be fruitful: only very few PROLOG predicates are deterministic as such, and - as already mentioned - as many predicates as possible should be covered in order to gain efficiency by transforming them into LL.
Example 4.2 shows that it is important to consider all queries for a given program. Otherwise, predicates that are always used deterministically are not detected and thus compiled into inefficient code.
This definition complies with the concept of partial evaluation (or partial deduction in the field of logic programming). As pointed out in [\protect\citeauthoryearNilsson1993], partial evaluation is, at least from a principal point of view, a simple form of program transformation by which a program, given some partial input data, can be specialized to solve a particular problem more efficiently than the more general program. The origin of the field is due to Kleene [\protect\citeauthoryearKleene1952], but the application to programming languages is primarily due to Futamara [\protect\citeauthoryearFutamura1971], Haraldsson [\protect\citeauthoryearHaraldsson1977], Ershov [\protect\citeauthoryearErshov1980], and Jones [\protect\citeauthoryearJones et al.1989].
As the following example shows, non-trivial deterministic predicates can be detected without partial evaluation.
The next example shows that it is not sufficient for a predicate to have at most one solution for all activated subgoals to be easily replaced by an efficient deterministic procedure.
The problem with this program is that although p is deterministic w.r.t. and , q, which is called in p, is non-deterministic w.r.t. and = {q(1,Z)}:
In order to be able to replace each deterministic predicate by a simple and directly obtainable procedure or function specified in a deterministic imperative or functional language, all predicates called in the execution of deterministic predicates must themselves be deterministic: internal backtracking in the execution of a deterministic predicate is not allowed.
This leads to the following definition of deep determinism:
An algorithm detecting deeply deterministic predicates (for a special case of query sets) is described in section 4.2.3.
The following example motivates a further modification of the concept of deterministic predicates:
This example shows that due to PROLOG's computation rule the set of deterministic predicates in a program can change if the program is transformed into a logically equivalent program. This motivates a slight modification of definitions 4.5 and 4.6: in order to obtain more (or more interesting, e.g. more often used) deterministic predicates, reordering of premises should be allowed.
Reordering of premises is potentially dangerous in PROLOG for several reasons:
The transformation algorithms described in this work will only reorder premises in respective benevolent cases: