跨多个模块定义谓词的各个部分

Edm*_*und 4 module prolog swi-prolog

我正在尝试编写一个move/3处理几种术语的谓词,每种术语都在一个单独的文件中定义.我正在尝试使用模块,因为这些文件包含应该适当命名的其他谓词.

所以,我创建了一个cat.prolog包含内容的模块:

:- module(cat, [move/3]).
:- multifile(move/3).

move(cat(C), P, cat(C2)) :-
   ...
Run Code Online (Sandbox Code Playgroud)

同样的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.)
Run Code Online (Sandbox Code Playgroud)

试图在SWI-Prolog中运行它:

?- ['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.
Run Code Online (Sandbox Code Playgroud)

在这一点上,我可以使用dog:move/3,cat:move/3但不是move/3.它适用于cat案例而非dog案例.

我觉得有一种非常明显的方法可以做到这一点.我试过在很多方面尝试组合模块和导入以及多文件指令,但仍然没有找到它......

Cap*_*liC 5

multifile/1语法很简单,但文档缺少一个简单的例子......

我在3个模块文件:pets.pl,cat.pl,dog.pl.

:- module(pets, [test/0, move/3]).
:- multifile move/3.
move(A,B,C) :- writeln(pets-move(A,B,C)).
test :- forall(move(A,B,C), writeln(move(A,B,C))).

:- module(cat, []).
:- use_module(pets).
pets:move(A,B,C) :- writeln(cat-move(A,B,C)).

:- module(dog, []).
:- use_module(pets).
pets:move(A,B,C) :- writeln(dog-move(A,B,C)).
Run Code Online (Sandbox Code Playgroud)

请注意Module:Pred :- ..."从属"文件中的相关语法

?- [cat,dog].
%  pets compiled into pets 0.00 sec, 3 clauses
% cat compiled into cat 0.01 sec, 7 clauses
% dog compiled into dog 0.00 sec, 3 clauses
true.

?- test.
Correct to: "pets:test"? yes
pets-move(_G41,_G42,_G43)
move(_G41,_G42,_G43)
cat-move(_G41,_G42,_G43)
move(_G41,_G42,_G43)
dog-move(_G41,_G42,_G43)
move(_G41,_G42,_G43)
true.

?- 
Run Code Online (Sandbox Code Playgroud)