【问题标题】:How do I find out which module a Prolog operator comes from?如何找出 Prolog 运算符来自哪个模块?
【发布时间】:2021-02-10 19:14:17
【问题描述】:

这可能特定于 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 中,操作符可以像谓词一样在模块中定义和导出?

【问题讨论】:

    标签: module prolog operators swi-prolog


    【解决方案1】:

    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 .
    

    可能有更好的解决方案...

    【讨论】:

    • 足够好。也许我们必须吸引 Jan 添加一些功能。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2017-06-25
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    相关资源
    最近更新 更多