11

我只是想弄清楚 SWI-Prolog 中的约束编程,查看本教程:http ://en.wikibooks.org/wiki/Prolog/Constraint_Logic_Programming

但是,我似乎在第一个障碍上掉下来了。

?- use_module(library(clpfd)).
true.

?- X #> Y, X in 1..3, Y=2.
ERROR: Syntax error: Operator expected
ERROR: X 
ERROR: ** here **
ERROR: #> Y, X in 1..3, Y=2 . 
?- 

这里出了什么问题?我似乎已经包含了该库,但是本教程的第一行示例会引发语法错误。

我能找到的所有教程似乎都使用了#=、#< 等运算符。但我的 SWI-Prolog 对它们望而却步。它们是该约束库附带的额外语法吗?(我没有加载它吗?)

还是我误读了教程示例?

更新:试图从下面 Horsh 的回复中理解事情。如果我使用库并在交互式终端中运行该行,我可以让它工作。但是,如果我尝试导入库并在源文件中使用这些运算符,则会再次引发错误。我不明白什么?

更新 2:

好的。如果在我的源文件中调用库,然后编写一个包含#> 的规则。然后我尝试从命令行查询它。它将抛出一个错误并且 #> 语法无法识别。如果在尝试查阅程序之前将库导入命令行,它可以工作。这可能是对的吗?

4

3 回答 3

13

基于 Horsh 的回答,您应该在源代码中导入库,记得?-像这样放在行的开头:

?- use_module(library(clpfd)).

告诉 SWI-Prolog 执行该?-行,就好像它是直接输入解释器一样,而不是试图在程序中将其声明为谓词。

不要担心 SWI-Prolog 会多次导入库,它知道检查库是否被修改,并且只有在库自上次加载后发生更改时才重新加载它。

于 2011-04-10T08:15:49.083 回答
9

对于将来发现此问题的任何其他人,如果您想在 SWI-Prolog 源文件中导入库,以下内容也将起作用:

:- use_module(library(clpfd)).

注意:-和 不?-

于 2012-03-05T06:12:10.477 回答
-1

这一切在手册中。

?- [library(clpfd)].
%   library(error) compiled into error 0.00 sec, 10,128 bytes
%  library(apply) compiled into apply 0.00 sec, 16,840 bytes
%  library(assoc) compiled into assoc 0.00 sec, 13,132 bytes
%  library(lists) compiled into lists 0.00 sec, 14,332 bytes
%  library(pairs) compiled into pairs 0.00 sec, 5,372 bytes
% library(clpfd) compiled into clpfd 0.05 sec, 392,604 bytes
true.

?- X #> Y, X in 1..3, Y=2.
X = 3,
Y = 2.
于 2011-04-08T12:59:42.567 回答