【问题标题】:Get the name of the calling predicate获取调用谓词的名称
【发布时间】:2016-02-10 11:14:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: reflection prolog swi-prolog


    【解决方案1】:

    在 SWI-Prolog 中查看 library(prolog_stack)

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

    • get_prolog_backtrace/2
    • prolog_stack_frame_property/2

    当心:这并不容易移植到其他 Prolog 系统,而且很可能有更优雅、更有效的方法来满足您的需求。

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

    【讨论】:

    • 感谢您的指点。其实我想到了一个更简单的方法:因为p是由程序生成的,我可以告诉它在p的开头添加PredicateName = p,然后传递给call_predicate
    • 完美。追求优雅和便携,尽可能保持纯净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多