获取调用谓词的名称
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
:您可以通过其中一个参数表示调用上下文的方式扩展特定目标。这更便携,在 运行 时非常高效,您可以静态检查生成的扩展。
假设我正在处理这个玩具示例(问题的重点显然不是解决这个示例):
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
:您可以通过其中一个参数表示调用上下文的方式扩展特定目标。这更便携,在 运行 时非常高效,您可以静态检查生成的扩展。