在SWI Prolog中统一动态谓词

时间:2012-02-03 13:08:18

标签: c++ swi-prolog

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

调用此回溯以使用正文H和子句引用M绑定模块B中带头R的谓词实例。如果您要检索的只是动态谓词的名称,则可以调用此方法来检索H或其仿函数的所有绑定的集合。

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