将Prolog谓词拆分为两部分并在其间执行一些代码

时间:2015-10-14 15:06:00

标签: prolog

让我们说我有一个用户可以像这样写一个Prolog谓词config.xml

pred/2

然后,我有一种尝试执行用户定义的pred('an atom chosen by the user', OutputList) :- %Part 1 %Here he can write every Prolog predicate that he wants %and before split_here he has to inizialize the OutputList ... split_here, %this is a special fact that that says where to split %Part 2 %Here he can write every Prolog predicate that he wants ... 的引擎,但为了提高效率,它需要在声明pred/2之间执行一些代码(让' s说谓语split_here)。

如何实施此模式?

第1部分和第2部分中的变量可以共享,而engine_code/0只关注engine_code/0(它包含的是什么类型的术语并不重要)。

您能想到一种简单的方法来实现这一目标吗?

目前,我正在使用OutputList这样:

clause/2

似乎当我在clause(pred(X, OutputList), Body), split(Body, split_here, Part1Goals, Part2Goals), call(Part1Goals), engine_code, call(Part2Goals), ... call(Part1Goals)之间编写call(Part2Goals)或者只是按顺序编写时,变量不会被共享。

一个例子可能是:

engine_code/0

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用目标扩展机制将split_here标记替换为对engine_code/0谓词的调用。加载用户代码时,将完成转换。在一些Prolog系统中可以使用术语和目标扩展机制。对于使用大多数编译器系统的便携式解决方案,您可以使用Logtalk的机制实现。例如:

---- user.pl ----
pred(userPred, OutputList) :-
  findall(myTerm(X,Y,Z), myTerm(X,Y,Z), OutputList),
  split_here,
  member(myTerm(X,_,_), OutputList),
  use_x(X).
-----------------

目标扩展代码:

---- hook.lgt ----
:- object(hook, implements(expanding)).

    goal_expansion(split_here, engine_code).

:- end_object.
-----------------

来自顶级的示例用法。首先,加载Prolog文件,使用hook对象扩展它:

| ?- logtalk_load('user.pl', [hook(hook)]).
...

其次,只需调用转换后的用户谓词:

| ?- pred(userPred, OutputList).
...

这对你有用吗?