Я пытаюсь написать предикат move/3
, который обрабатывает несколько типов терминов, каждый из которых определяется в отдельном файле. Я пытаюсь использовать модули для этого, потому что файлы содержат другие предикаты, которые должны соответствовать именам соответственно.Определить части предиката на нескольких модулях
Таким образом, я создал модуль cat.prolog
с содержимым:
:- module(cat, [move/3]).
:- multifile(move/3).
move(cat(C), P, cat(C2)) :-
...
Аналогично для dog.prolog
.
И main.prolog
с:
:- use_module(['cat.prolog'], [move/3]).
:- use_module(['dog.prolog'], [move/3]).
(various predicates that use move/3 and expecting the clauses from all imported modules to be applicable.)
Попытка запустить это в SWI-Пролог:
?- ['main.prolog'].
% cat.prolog compiled into cat 0.00 sec, 4,800 bytes
ERROR: Cannot import dog:move/3 into module user: already imported from cat
Warning: /home/edmund/main.prolog:2:
Goal (directive) failed: user:use_module([dog.prolog],[move/3])
% main.prolog compiled 0.00 sec, 10,176 bytes
true.
На данный момент я могу использовать dog:move/3
и cat:move/3
, но не move/3
. Он работает для корпуса cat
, но не для корпуса dog
.
У меня такое ощущение, что есть действительно очевидный способ сделать это. Я пробовал комбинировать модули и импорт и многофайловые директивы во многих отношениях, и до сих пор не нашел еще ...
Вы пытались объявить, что move/3 будет многофилировать в вашем 'main' модуле? –
Я попытался, но это не имело никакого значения, но ошибка об этом уже была импортирована. – Edmund