У меня есть (большое) количество файлов Prolog, каждый из которых содержит модуль с уникальным именем. Все модули экспортируют один и тот же набор предикатов. Теперь я хотел бы использовать одно и то же подмножество предикатов из ряда этих модулей в главном модуле. Как мне это сделать в SWI-Prolog?
Это минимальный вымышленный пример того, чего я хотел бы достичь.
Модуль А:
:- module(a, [f/2]).
f(0,1) :- !.
f(N,R) :-
N1 is N-1,
f(N1,R1),
R is N*R1.
Модуль b:
:- module(b, [f/2]).
f(0, 1) :- !.
f(1, 1) :- !.
f(N, R) :-
N1 is N - 1,
N2 is N - 2,
f(N1, R1),
f(N2, R2),
R is R1 + R2.
Оба модуля определяют и экспортируют предикат f / 2. Теперь в главном модуле мне нравится использовать как f из модуля a, так и f из модуля b. Тем не менее, добавив
:- use_module(a).
:- use_module(b).
в главном модуле выдает ошибку («Нет разрешения на переопределение модуля»).
Я думаю, что я ищу что-то похожее на «квалифицированный импорт», который существует в Java, где запись af (8, X) и bf (8, X) будет иметь значение между двумя вызовами (a и b будут тогда будут разные пакеты).
Я очень хорошо знаю, как программировать на разных языках, но Пролог не является одним из них. Вполне возможно, что я неправильно понял что-то фундаментальное с модулями в Прологе.