2

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

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

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

4

1 回答 1

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模块中的 headM与 bodyB和子句引用绑定R。如果您想要检索的只是动态谓词的名称,您可以调用它来检索 的所有绑定集H或其函子。

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

于 2012-02-26T22:38:07.527 回答