我正在寻找一种在谓词中传递隐式参数的可靠方法,例如,
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).
答案 0 :(得分:2)
查看重要谓词term_expansion/2
和goal_expansion/2
。
它们允许您在编译时重写子句,并且所有严肃的Prolog系统都支持这些或类似的结构,以便为Prolog代码提供扩展机制。
定义子句语法(有关更多信息,请参阅dcg)通常使用此类机制实现。事实上,为了传递上下文,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分布中找到几个使用参数对象的示例。