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