HELP DEFINE_PROLOG Robert Duncan, April 1993
Syntax form for defining Prolog predicates in Pop-11.
define :prolog <declaration> <name>/<arity>(<arguments>);
<body>
enddefine;
NOTE: you must have the Prolog subsystem loaded before using this.
------------------------------------------------------------------------
1 Overview
------------------------------------------------------------------------
The prolog define-form simplifies the creation of Prolog predicates from
Pop-11. For example, the definition:
define:prolog hello/0(contn);
lvars contn;
printf('Hello world\n');
chain(contn);
enddefine;
defines the predicate hello/0 which can then be executed from Prolog
like this:
?- hello.
Hello world
yes
The define form can be thought of as a syntactic interface to
prolog_valof, and indeed the previous example could equally well have
been written as:
procedure(contn);
lvars contn;
printf('Hello world\n');
chain(contn);
endprocedure -> prolog_valof("hello", 0);
Consequently, the procedure itself must be written to use the
continuation-passing style (see PLOGHELP * PROLOG_VALOF).
------------------------------------------------------------------------
2 Description
------------------------------------------------------------------------
Compiling the definition:
define :prolog <declaration> <name> / <arity> (<arguments>) ;
<body>
enddefine;
creates an entirely new predicate with the given functor <name> and
<arity>; any existing version of that predicate will be lost. The <name>
part can be written either as a word or string: string quotes are useful
if the name cannot be read as a single Pop-11 item, or if it needs to be
separated from the following "/" token. The <arity> must be a
non-negative integer.
The <declaration> part controls the status of the predicate identifier
being declared. It is optional; if present, it should consist of some
valid combination of words from the set:
global nonglobal vars constant procedure
These have their usual meanings: specifying global or nonglobal
determines whether the predicate will be visible in any subsections of
the current section (where a section is the same as a Prolog module);
vars or constant determines whether or not the predicate can be
redefined, like declaring it as a user_predicate or a system_predicate
in Prolog (predicate identifiers are always permanent, so lvars and
lconstant declarations are not allowed). The procedure declaration is
allowed but redundant: predicate identifiers are always procedure type.
If the <declaration> part is omitted or incomplete, the usual define
defaults apply depending on the current compile mode.
The procedure itself must be written to use the continuation-passing
style: when the predicate is called from Prolog, the procedure will be
invoked with an appropriate continuation argument.
--- C.all/help/define_prolog
--- Copyright University of Sussex 1993. All rights reserved.Author: Robert Duncan, April 1993