Module 如何在swi prolog中导入运算符?

Module 如何在swi prolog中导入运算符?,module,prolog,swi-prolog,Module,Prolog,Swi Prolog,我有以下文件: :- use_module(library(clpfd)). isPowTwo(N) :- N #> 0, N #= 2^_. 一切正常: ?- [importTest]. % library(pairs) compiled into pairs 0.00 sec, 22 clauses % library(lists) compiled into lists 0.01 sec, 122 clauses % library(occurs) compi

我有以下文件:

:- use_module(library(clpfd)).

isPowTwo(N) :- N #> 0, N #= 2^_.
一切正常:

?- [importTest].
%     library(pairs) compiled into pairs 0.00 sec, 22 clauses
%    library(lists) compiled into lists 0.01 sec, 122 clauses
%    library(occurs) compiled into occurs 0.00 sec, 14 clauses
%   library(apply_macros) compiled into apply_macros 0.01 sec, 168 clauses
%   library(assoc) compiled into assoc 0.01 sec, 103 clauses
%  library(clpfd) compiled into clpfd 0.15 sec, 2,808 clauses
% importTest compiled 0.16 sec, 2,813 clauses
true.
现在我只想导入两个使用过的运算符:

:- use_module(library(clpfd), [(#>)/2, (#=)/2]).

isPowTwo(N) :- N #> 0, N #= 2^_.
而且它不起作用:

?- [importTest].
%     library(pairs) compiled into pairs 0.00 sec, 22 clauses
%    library(lists) compiled into lists 0.01 sec, 122 clauses
%    library(occurs) compiled into occurs 0.00 sec, 14 clauses
%   library(apply_macros) compiled into apply_macros 0.01 sec, 168 clauses
%   library(assoc) compiled into assoc 0.01 sec, 103 clauses
%  library(clpfd) compiled into clpfd 0.16 sec, 2,808 clauses
ERROR: .../importTest.pl:3:17: Syntax error: Operator expected
% importTest compiled 0.16 sec, 2,812 clauses
true.

?- isPowTwo(1).
ERROR: toplevel: Undefined procedure: isPowTwo/1 (DWIM could not correct goal)

将括号保留在
#>
#=
周围没有任何区别。

您的
使用模块/2
指令中有语法错误(因此出现
语法错误:操作员预期的
错误消息)。您可以通过以下方式进行更正:

:- use_module(library(clpfd), [(#>)/2, (#=)/2]).
但您还需要导入相应的运算符,以便在
ispowtow2/1
谓词的定义中使用:

:- use_module(library(clpfd), [(#>)/2, (#=)/2, op(700,xfx,(#>)), op(700,xfx,(#=))]).

其思想是,您可以按模式导入运算符,如在
op(,,#>)
中,因此不需要重复优先级。这个坏了。为此推送了一个修复程序,因此它应该在7.3.27中起作用。