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

在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和子句引用MB模块中具有头部R的谓词实例绑定(bind)。如果要检索的只是动态谓词的名称,则可以调用它来检索H或其函子的所有绑定(bind)的集合。

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

关于c++ - 在SWI Prolog中统一动态谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9129150/

10-16 04:47