我正在从 C++ dll 调用 SWI Prolog 引擎,我希望能够访问所有断言/动态谓词(类似于列表通常所做的)。
在 GNU Prolog 中,我会用变量调用 dynamic/1 谓词,Prolog 会将它与所有动态谓词指示符统一起来。在下一步中,我将使用变量调用这些谓词并获得完整列表。
不幸的是,我不能在 SWI Prolog 中做到这一点(错误:参数没有充分实例化)。还有其他方法吗?
我正在从 C++ dll 调用 SWI Prolog 引擎,我希望能够访问所有断言/动态谓词(类似于列表通常所做的)。
在 GNU Prolog 中,我会用变量调用 dynamic/1 谓词,Prolog 会将它与所有动态谓词指示符统一起来。在下一步中,我将使用变量调用这些谓词并获得完整列表。
不幸的是,我不能在 SWI Prolog 中做到这一点(错误:参数没有充分实例化)。还有其他方法吗?
为什么不自己动手,例如:
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
或其函子。
将谓词属性修改为您喜欢的属性(或者更好的是,将它们作为参数传递);上面的定义将检索所有用户定义的动态谓词,这就是我猜你所追求的。