问题描述
这可能是 SWI-Prolog 特有的。
如何向系统询问谓词来自哪个模块?
对于谓词,可以使用 predicate_property/2
:
?-
predicate_property(is_ordset(_),imported_from(M)).
M = ordsets.
好的,所以 is_ordset/2
来自模块 ordsets
。
我还可以要求定义该模块的特定文件:
?-
predicate_property(is_ordset(_),file(F)).
F = '/usr/local/logic/swipl/lib/swipl/library/ordsets.pl'.
但是如何对操作符做同样的事情,至少在 SWI-Prolog 中,操作符可以以与谓词相同的方式在模块中定义和导出?
解决方法
SWI-Prolog 是少数几个 Prolog 系统之一,其中操作员可以在模块本地。一种可能的解决方案(但从性能角度来看并不理想)来查找操作符导出的模块是:
?- current_module(M),module_property(M,exported_operators(Operators)),member(Operator,Operators).
例如:
?- use_module(library(clpfd)).
true.
?- current_module(M),member(op(Priority,Type,'#>'),Operators).
M = clpfd,Operators = [op(760,yfx,#<==>),op(750,xfy,#==>),#<==),op(740,#\/),op(730,#\),op(720,#/\),op(710,fy,op(700,xfx,#>),op(...,...,...)|...],Priority = 700,Type = xfx .
可能有更好的解决方案...