这可能特定于SWI-Prolog。
我如何询问系统谓词来自哪个模块?
对于谓词,可以使用predicate_property/2
:
?-
predicate_property(is_ordset(_),imported_from(M)).
M = ordsets.
好的,所以is_ordset/2
来自module 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),
module_property(M, exported_operators(Operators)),
member(op(Priority, Type, '#>'), Operators).
M = clpfd,
Operators = [op(760, yfx, #<==>), op(750, xfy, #==>), op(750, yfx, #<==), op(740, yfx, #\/), op(730, yfx, #\), op(720, yfx, #/\), op(710, fy, #\), op(700, xfx, #>), op(..., ..., ...)|...],
Priority = 700,
Type = xfx .
可能有更好的解决方案...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句