For example, some logic programming languages allow the unification, constraint solving, and the search strategies to be extended with the help of programs written in the language itself.

In our prototypical implementation, only relational programs access LL programs.

In the case of applications developed by more than one implementor, the languages for the separate modules can eventually be chosen according to their preferences or abilities.

Since in RELFUN these deterministic clauses are compiled into ordinary WAM code (in order to allow unification and non-ground computations in functions), efficiency is not much improved.

For introductions into the WAM, refer to [\protect\citeauthoryearGabriel et al.1985], [\protect\citeauthoryearAt-Kaci1990], and [\protect\citeauthoryearVan Roy1994].

In the context of LISP, data types are usually referred to as S-expressions (symbolic expressions) [\protect\citeauthoryearMcCarthy et al.1962].

For reasons of simplicity, relational programs with side effects will not be covered in this work.

Thus non-determinism also covers cases where a predicate is first successful and then enters a non-terminating branch.

In this work, only relational languages with PROLOG's computation and search rule are considered.

Here, determinism is defined dynamically via proof trees. A more common approach is to define determinism statically, e.g. via non-overlapping clause heads.

In analogy to PROLOG indexing, for relations consisting of many clauses, case statements in addition to the if/let cascade could be used.

In special cases, disjointness can be established by global analysis even for programs without type declarations [\protect\citeauthoryearDebray and Warren1990].

The extension of RELFUN by type definitions and signatures is momentarily worked on.

The syntax of these declarations is described in appendix B.

Since our prototypical implementation does not (yet) allow LL functions to access (bind) free REL variables, no extensions of the unification can be accomplished.

With eager (call-by-value) evaluation

means incrementing the pointer by cells.

is the external representation of expr.

is a copy of value in Memory.

The assembler instructions .proc and .end mark the beginning and end of a function or relation.

,@ splices into the embedding list.

The GAMA is implemented in COMMON LISP; in order to avoid name conflicts, function names are preceded by a prefix `.' indicating that a function belongs to module , here gmem (we did not use the COMMON LISP package system).

The available types are: NAT for natural numbers, CONST for constants, FUNCTOR for WAM functor specifications of the form ( ), FUNCTION for COMMON LISP functions (e.g. used for ll-builtin), LABEL for labels, VARIABLE for global (LL) variables, HASHTABLE for hash tables (used in the WAM switch instructions), and X for arbitrary arguments. Additional types can be defined with gasm.deftype.

case is not yet implemented.

For a survey of indexing, see [\protect\citeauthoryearStein1993] and [\protect\citeauthoryearSintek1993]

Harold Boley & Michael Sintek (sintek@dfki.uni-kl.de)