如何找到Prolog操作员来自哪个模块?

戴维·唐霍弗

这可能特定于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中以与谓词相同的方式在模块中定义和从模块导出操作符?

保罗·莫拉(Paulo Moura)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章