HELP PLOGINPOP John Williams, April 1987
The library LIB * PLOGINPOP provides some syntactic sugar for using the
mechanisms described in HELP * PLOG_GOALS.
CONTENTS - (Use <ENTER> g to access required sections)
1 Constructing Prolog Goals
2 Applying Prolog Goals
3 Iterating Over the Solutions to a Prolog Goal
4 See Also
-----------------------------------------------------------------------
1 Constructing Prolog Goals
-----------------------------------------------------------------------
The syntax construct |< ... >| is used to construct plog_goal objects.
Between the brackets, normal Prolog syntax is used, with two exceptions.
First, the operator ? causes a Pop-11 variable -> Prolog variable
mapping to be added to the plog_goal_env of the plog_goal being built.
Second, the operator ^ splices the value of arbitrary Pop-11 code into
the term. Unless this Pop-11 code is just a single word, the code must
be quoted with '.
For example:
uses ploginpop;
:- library(useful).
|< append(?x, ?y, [1, 2, 3, 4, 5]) >| -> g;
Note that LIB PLOGINPOP changes the class_print of plog_goal objects:
g =>
** |< append(_1, _2, [1, 2, 3, 4, 5]) >|
plog_goal_env(g) =>
** [<ident <undef y>> <prologvar _2> <ident <undef x>>
<prologvar _1>]
-----------------------------------------------------------------------
2 Applying Prolog Goals
-----------------------------------------------------------------------
A plog_goal may be applied as if it were a procedure. For example:
|< atomic(^popautolist) >| () =>
** <false>
|< atomic(^pop_max_filename_len) >| () =>
** <true>
-----------------------------------------------------------------------
3 Iterating Over the Solutions to a Prolog Goal
-----------------------------------------------------------------------
The syntax
plogwhile <plog_goal> do ... endplogwhile
may be used to iterate over the solutions to a plog_goal. For example:
define test();
lvars x y;
plogwhile |< append(?x, ?y, [a, b, c, d, e]) >| do
spr(x);
npr(y);
endplogwhile
enddefine;
test();
[] [a b c d e]
[a] [b c d e]
[a b] [c d e]
[a b c] [d e]
[a b c d] [e]
[a b c d e] []
(Note how ? copes properly with lexical variables).
plogwhile loops may be quit with quitloop, restarted with nextloop, etc.
For example:
|< append(?a, ?b, [1, 2, 3, 4, 5]) >| -> g;
plogwhile g do
quitif(hd(b) > 3);
b =>
endplogwhile;
** [1 2 3 4 5]
** [2 3 4 5]
** [3 4 5]
Further invocations of the plog_goal g will resume from the last
solution generated:
plogwhile g do
spr(a), npr(b)
endplogwhile;
[1 2 3 4] [5]
[1 2 3 4 5] []
-----------------------------------------------------------------------
4 See Also
-----------------------------------------------------------------------
LIB * PLOG_GOALS
HELP * PLOG_GOALS
LIB * DEFINE_PROLOG
HELP * DEFINE_PROLOG
--- C.all/help/ploginpop
--- Copyright University of Sussex 1989. All rights reserved.Author: John Williams, April 1987