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

int*_*tar 10 prolog clpfd

我只是想在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 . 
?- 
Run Code Online (Sandbox Code Playgroud)

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

我能找到的所有教程似乎都使用了#=,#<等操作符.但是我的SWI-Prolog对他们不屑一顾.它们是约束库附带的额外语法吗?(而且我没有加载它?)

或者我误读了教程示例?

更新:尝试从Horsh的回复中了解一些事情.如果我使用库并在交互式终端中运行该行,我可以使其工作.但是如果我尝试导入库并在源文件中使用这些运算符,那么它会再次抛出错误.我不明白的是什么?

更新2:

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

Rac*_*ion 12

在Horsh的回答基础上,您应该在源代码中导入库,记住要放在?-行的开头,如下所示:

?- use_module(library(clpfd)).
Run Code Online (Sandbox Code Playgroud)

?-告诉SWI-Prolog的执行行就好像直接键入解释,而不是试图把它作为申报程序中的谓语.

不要担心SWI-Prolog不止一次导入库,它知道检查库是否被修改,只有在上次加载库后才重新加载它.


Nic*_*son 9

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

:- use_module(library(clpfd)).
Run Code Online (Sandbox Code Playgroud)

请注意:-而不是?-.

  • @ToonAlfrink:这是唯一的便携式方式.也就是说,可以在SICStus,SWI和YAP之间移植 (5认同)