PLOGHELP PROLOG_EVAL                        Kathryn Seifert  August 1986


Evaluates a Prolog term as a POP-11 expression.


    ?- prolog_eval(Expr).
    ?- prolog_eval(Expr, X).
    ?- prolog_evaltrue(Expr).


Keywords: POP-11, mixed language programming, evaluation


In all its forms, 'prolog_eval' evaluates a Prolog term -Expr- as a
POP-11 expression, using the evaluation rules described below.

The goal

    ?- prolog_eval(Expr).

evaluates -Expr- for its side-effect only, so -Expr- must not return a
result. This goal always succeeds.

The goal

    ?- prolog_eval(Expr, X).

evaluates -Expr- and unifies its result with the term -X-. -Expr- must
return exactly one result: failure to do so is likely to cause a 'STACK
EMPTY' error.

The goal

    ?- prolog_evaltrue(Expr).

evaluates -Expr- and succeeds only if the result is non-false. Again,
-Expr- must return exactly one result, but in this case it is simply
tested and discarded.

The rules used for evaluating -Expr- are as follows (NB problems of
dereferencing are ignored here: see PLOGHELP * TERMSINPOP for more
information):

    (a) A complex term or Prolog structure with the functor 'quote'
        evaluates to the unchanged argument of the functor.  For example:

        ?- prolog_eval(quote(member(a, [1, 2, a, 3])), X).
        X = member(a, [1, 2, a, 3]) ? 
        yes

    (b) A complex term or Prolog structure with any functor other than
        'quote' evaluates to the VALOF of the functor (see HELP * VALOF)
        applied to the result of evaluating the arguments.  For example:

        ?- prolog_eval(length(hd([[1, 2, 3], [a, b, c]])), X).
        X = 3 ? 
        yes

    (c) A Prolog atom (with or without the functor 'quote') evaluates to
        a POP-11 word.  For example:

        ?- prolog_eval(foo, X), prolog_eval(isword(X), Y).
        X = foo
        Y = <true> ? 
        yes

    (d) Numbers, words, strings, and all other atomic objects evaluate
        to themselves.

    (e) A list evaluates to the list of its evaluated items.  For
        example:

        ?- prolog_eval([length([a, 3, 5, b, 6]), *(6, 97)], X).
        X = [5, 582] ? 
        yes

    (f) A variable evaluates to the result of evaluating its content.
        For example:

        ?- X = ([hd([c, a, t]), lizard, *(5, 4)]),
           prolog_eval(X, Z).
        X = [hd([c, a, t]), lizard, 5 * 4]
        Z = [c, lizard, 20] ? 
        yes

The predicate 'is/2' is simply a syntactic variant of 'prolog_eval/2',
so its evaluation rules are the same as those given here. 'is/2' could
be defined as:

    X is Expr :-
        prolog_eval(Expr, X).

There is also a library package, described in PLOGHELP * ARE, which
copes with expressions returning multiple results.


-- RELATED DOCUMENTATION ----------------------------------------------

HELP * VALOF
 Explanation of the POP-11 procedure 'valof'

PLOGHELP * ARE
 Library for evaluating POP-11 expressions with any number of results

PLOGHELP * IS
 Evaluating POP-11 expressions which return 1 result from Prolog

PLOGHELP * MIXED_LANGUAGES
 Overview of interface between Prolog and other languages

PLOGHELP * PLOGTOPOP
 How to call POP-11 from Prolog

PLOGHELP * TERMSINPOP
 Facilities for manipulating Prolog terms and variables in POP-11


--- C.all/plog/help/prolog_eval
--- Copyright University of Sussex 1988. All rights reserved. ----------
