SWI-Prolog中的约束编程库或语法问题

12

我正在尝试理解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:
好的,如果我在源文件中调用库并编写一个包含 #> 的规则。然后我尝试从命令行咨询它。它将抛出一个错误,并且 #> 语法无法识别。如果我在咨询程序之前将库导入到命令行,它就可以正常工作。这样做对吗?

奇怪...对我来说是有效的。不过有一件事情不同: ?- use_module(library(clpfd)). % library(error) compiled into error 0.01 sec, 14,432 bytes % library(clpfd) compiled into clpfd 0.27 sec, 225,408 bytes true。你有收到编译信息吗? - Kyle Dewey
3个回答

13

在Horsh的回答基础上,你应该在源代码中导入库,记得在行首加上?-,就像这样:

Building on Horsh's answer, you should be importing the library in your source code, remembering to put ?- at the beginning of the line like so:

?- use_module(library(clpfd)).

?-告诉SWI-Prolog将该行代码作为直接输入到解释器中执行,而不是尝试将其声明为程序中的谓词。

不必担心SWI-Prolog多次导入库,它知道检查库是否已更改,并仅在自上次加载库以来发生更改时重新加载库。


谢谢...你从我的问题描述中得出了一个很好的推断。那正是问题所在,我不小心把问号从行首删除了。Prolog没有报告语法错误(至少我没能识别出来),所以我并不清楚我没有加载库。谢谢。终于可以停止在桌子上撞头了。 - interstar

9

如果有其他人在未来需要在SWI-Prolog源文件中导入库,以下方法也可以:

:- use_module(library(clpfd)).

请注意使用:-而不是?-

哪个更好?为什么? - ToonAlfrink
5
这是唯一一种可移植的方法,也就是在SICStus、SWI和YAP之间可移植。 - false

-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.

嗯?是的,你做的对我有效,但我做的仍然不行。感到困惑。 - interstar
1
那种方法非常有问题:它在YAP或SICStus上不能可靠地工作。 - false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接