假设我正在研究这个玩具示例(问题的关键显然不是要解决这个例子):
p([]).
p([H|T]) :- H = 0, call_predicate(p,T).
call_predicate(Name,Arg) :- call(Name,Arg).
到目前为止一切顺利。现在让我们说我想添加谓词call_predicate/1
,我不需要谓词的名称:
call_predicate(Arg) :- Name = ??, call(Name,Arg).
这样我就可以在p
:call_predicate(T)
中使用,隐含地知道我想要调用相同名称的谓词。
问题是如何从p
检索名称call_predicate/1
,知道它是调用call_predicate/1
的谓词的名称?
类似的问题是,如果它比第一个更容易,我如何在执行中检索我当前所在的谓词的名称?
答案 0 :(得分:4)
在SWI-Prolog中查看library(prolog_stack)。
特别是,以下谓词的组合应该可以满足您的需求:
get_prolog_backtrace/2
prolog_stack_frame_property/2
小心虽然:这不容易移植到其他Prolog系统,并且很可能有更优雅,更有效的方式来做你需要的。
例如,执行所描述的一种方法是使用term_expansion/2
:您可以通过其中一个参数表示调用上下文的方式扩展特定目标。这样更便携,在运行时非常高效,您可以静态检查生成的扩展。