获取调用谓词的名称

时间:2016-02-10 11:14:15

标签: prolog swi-prolog

假设我正在研究这个玩具示例(问题的关键显然不是要解决这个例子):

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).

这样我就可以在pcall_predicate(T)中使用,隐含地知道我想要调用相同名称的谓词。

问题是如何从p检索名称call_predicate/1,知道它是调用call_predicate/1的谓词的名称?

类似的问题是,如果它比第一个更容易,我如何在执行中检索我当前所在的谓词的名称?

1 个答案:

答案 0 :(得分:4)

在SWI-Prolog中查看library(prolog_stack)

特别是,以下谓词的组合应该可以满足您的需求:

  • get_prolog_backtrace/2
  • prolog_stack_frame_property/2

小心虽然:这不容易移植到其他Prolog系统,并且很可能有更优雅,更有效的方式来做你需要的。

例如,执行所描述的一种方法是使用term_expansion/2:您可以通过其中一个参数表示调用上下文的方式扩展特定目标。这样更便携,在运行时非常高效,您可以静态检查生成的扩展。