如何找出 Prolog 运算符来自哪个模块?
How do I find out which module a Prolog operator comes from?
这可能特定于 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),
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 .
可能有更好的解决方案...
这可能特定于 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),
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 .
可能有更好的解决方案...