Как мне узнать, из какого модуля взят оператор Prolog?

#module #prolog #operators #swi-prolog

#модуль #prolog #операторы #swi-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?

Ответ №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 .
 

Может быть лучшее решение…

Комментарии:

1. Достаточно хорошо. Возможно, нам придется убедить Яна добавить какую-то функциональность.