Prolog:传递隐式参数/预测评估

时间:2016-02-16 10:04:46

标签: prolog parameter-passing swi-prolog

我正在寻找一种在谓词中传递隐式参数的可靠方法,例如,

p(Context, Args) :- goal(Args).

其中goal(Args)应扩展为interpret(Context, goal, Args)

但是,由于我不知道某个术语是作为目标进行评估还是用作数据,因此我想将上下文附加到目标作为额外的数据没有修改其实际结构。

有没有办法做到这一点?

另外,我需要一些方法来勾选一个术语的评估,然后获取它的上下文并调用解释。

任何想法?

我正在使用SWI Prolog,便携式解决方案可以,但不是必需的。

编辑:

在伪代码中,我大致正在寻找的是:

term_expansion((Head :- Body), (Head :- Body)) :-
   arg(1, Head, Context),

   forall T: CompoundTerm in Body =>
       set_term_attribute(T, context, Context).

on_evaluate(T) :-
  get_term_attribute(T, context, Context) -> interpret(Context, T) ;
  call(T).

2 个答案:

答案 0 :(得分:2)

查看重要谓词term_expansion/2goal_expansion/2

它们允许您在编译时重写子句,并且所有严肃的Prolog系统都支持这些或类似的结构,以便为Prolog代码提供扩展机制。

定义子句语法(有关更多信息,请参阅)通常使用此类机制实现。事实上,为了传递上下文,DCG表示法本身通常已经足够了,所以你甚至不必在用例中自己重写代码。

有关详细信息,请参阅DCG resources

答案 1 :(得分:1)

易。使用Logtalk参数对象。您可以将此解决方案与12个Prolog系统一起使用,包括SWI-Prolog。例如:

:- object(foo(_Parameter1, _Parameter2)).

    :- public(p1/1).
    p1(Parameter1) :-
        parameter(1, Parameter1).

    :- public(p2/1).
    p2(Parameter2) :-
        parameter(2, Parameter2).

:- end_object.

?- foo(1,2)::p1(P1).
P1 = 1.

?- foo(1,2)::p2(P2).
P2 = 2.

参数是逻辑变量,具有所需的所有好处和潜力。所有对象谓词子句都隐式共享这些参数。在SWI-Prolog中,您甚至可以使用dicts作为参数值。

提供默认参数值也很容易。例如:

:- object(foo, extends(foo(a,b))).

:- end_object.

?- foo::p1(P1).
P1 = a.

?- foo::p2(P2).
P2 = b.

您可以在Logtalk分布中找到几个使用参数对象的示例。