#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. Достаточно хорошо. Возможно, нам придется убедить Яна добавить какую-то функциональность.