获取调用谓词的名称

Get the name of the calling predicate

假设我正在处理这个玩具示例(问题的重点显然不是解决这个示例):

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),隐含地知道我想调用同名谓词。

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

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

在 SWI-Prolog 中查看 library(prolog_stack)

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

  • get_prolog_backtrace/2
  • prolog_stack_frame_property/2

注意 但是:这不容易移植到其他 Prolog 系统,而且很可能有更优雅、更有效的方法来做你需要的事情。

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