11
votes

I'm just trying to figure out constraint programming in SWI-Prolog, looking at this tutorial : http://en.wikibooks.org/wiki/Prolog/Constraint_Logic_Programming

However I seem to be falling at the first hurdle.

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

What's going wrong here? I seem to have included the library, but the first example line from the tutorial throws a syntax error.

All the tutorials I can find seem to use operators like #=, #< etc. But my SWI-Prolog baulks at them. Are they an extra syntax which comes with that constraint library? (And am I failing to load it?)

Or am I misreading the tutorial examples?

Update : Trying to understand things from Horsh's reply below. I can get this to work if I use the library and run the line in the interactive terminal. But if I try to import the library and use these operators in a source file, then it throws the error again. What am I not understanding?

Update 2 :

OK. If, in my source file, I invoke the library and then write a rule which contains a #>. Then I try to consult it from the command-line. It will throw an error and the #> syntax is un-recognised. If import the library to the command line before trying to consult the program, it works. Can this be right?

3
Strange...works for me. One thing's different though: ?- 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. Are you getting the compilation message?Kyle Dewey

3 Answers

13
votes

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

The ?- tells SWI-Prolog to execute the line as if it were typed into the interpreter directly, instead of trying to declare it as a predicate in your program.

Don't be concerned about SWI-Prolog importing the library more than once, it knows to check if the library was modified and only reloads it if the library was changed since the last time it was loaded.

9
votes

For anyone else that finds this in the future, if you want to import a library in an SWI-Prolog source file, the following will also work:

:- use_module(library(clpfd)).

Note the :- and not ?-.

-1
votes

The is all in the manual here and there.

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