Square Puzzle Problem Solution with Constraint Programming
The issue is in your line_constraint/4
predicate. In it, you are posting some clpfd constraints inside a findall/3
. This means that those constraints are only valid inside the findall/3
. Here is a way to rewrite your predicate that keeps the constraints posted (given that you are using SICStus, I use the do
loop style, which is just syntactic sugar around a recursive predicate):
line_constraints(Index, NumFilledCells, Starts, SquareSizes) :-
(
foreach(Start,Starts),
foreach(SquareSize,SquareSizes),
foreach(Usage,Usages),
param(Index)
do
Intersect #<=> ( Start #=< Index #/\ Index #< Start + SquareSize),
Usage #= Intersect * SquareSize
),
sum(Usages, #=, NumFilledCells).
(Note that I changed the second inequality to be a strict one: The end of the square is right before Start + SquareSize
.)
As you will probably experience, this formulation is pretty weak in terms of reducing the search space. One way to improve it (but I haven't tried it myself) would be to replace the lines_constraints/4
by some cumulative constraints.