我正在从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
和子句引用M
的B
模块中具有头部R
的谓词实例绑定(bind)。如果要检索的只是动态谓词的名称,则可以调用它来检索H
或其函子的所有绑定(bind)的集合。将谓词属性修改为您喜欢的谓词属性(或者更好的是,将它们作为参数传递);上面的定义将检索所有用户定义的动态谓词,这正是我猜想的。
关于c++ - 在SWI Prolog中统一动态谓词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9129150/