Модули, экспортирующие идентичные предикаты в Пролог - PullRequest
2 голосов
/ 09 мая 2019

У меня есть (большое) количество файлов 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 будут тогда будут разные пакеты).

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

...