【问题标题】:Unifying dynamic predicates in SWI Prolog在 SWI Prolog 中统一动态谓词
【发布时间】:2012-02-03 13:08:18
【问题描述】:

我正在从 C++ dll 调用 SWI Prolog 引擎,并且我希望能够访问所有断言/动态谓词(类似于列表通常所做的)。

在 GNU Prolog 中,我会用变量调用 dynamic/1 谓词,Prolog 会将它与所有动态谓词指示符统一起来。在下一步中,我将使用变量调用这些谓词并获得完整的列表。

不幸的是,我在 SWI Prolog 中无法做到这一点(错误:参数没有充分实例化)。 还有其他方法吗?

【问题讨论】:

    标签: c++ swi-prolog


    【解决方案1】:

    为什么不自己滚动,例如:

    get_dynamic_predicates(M, H, B, R) :-
        current_predicate(_, P),
        strip_module(P, M, H),
        predicate_property(P, dynamic), 
        \+ predicate_property(P, built_in), 
        \+ predicate_property(P, imported_from(_)),
        clause(P, B, R).
    

    调用此回溯以在模块 M 中绑定具有头 H 的谓词实例,主体 B 和子句引用 R。如果您只想检索动态谓词的名称,您可以调用它来检索H 或其函子的所有绑定集。

    将谓词属性修改为您喜欢的属性(或者更好的是,将它们作为参数传递);上面的定义将检索所有用户定义的动态谓词,这就是我猜你所追求的。

    【讨论】:

    • 谢谢。我最新的想法是使用这样的东西:myIndi​​cators(Name, Arity) :- predicate_property(Head, dynamic), \+ predicate_property(Head, built_in), functor(Head, Name, Arity)。
    • 这与我在这里的建议非常接近;唯一的区别是我确保找到了在不同模块中断言的动态谓词。如果您不使用多个模块,那么您的建议似乎很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2011-08-21
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多