你如何检查 Prolog 中子矩阵的元素
How do you check the elements of a submatrix in Prolog
我正在尝试在 EclipsE Prolog 中编写 Shikaku 求解器。
我的约束定义如下:
solve(Problemname):-
writeln("Start shikaku."),
problem(Problemname, Width, Height, Hints),
shikaku(Width, Height, Hints).
shikaku(Width, Height, Hints):-
length(Hints, HintCount),
array_list(HintsArray, Hints),
% Prepare the matrix and assign an ID to every Hint (from 1 to HintCount)
dim(Matrix, [Width, Height]),
Matrix[1..Width,1..Height] :: 1..HintCount,
%flatten_array(Matrix,FlattenedMatrix),
(for(ID,1,HintCount), foreach((HintX, HintY, HintNumber), Hints), param(Width, Height, Matrix, HintsArray) do
(
occurrences(ID, Matrix, HintNumber),
L :: 1..Width, R :: 1..Width,
T :: 1..Height, B :: 1..Height,
% Hint coordinates are inside the rectangle.
L #=< HintX,
R #>= HintX,
T #=< HintY,
B #>= HintY,
DeltaX #= R-L+1,
DeltaY #= B-T+1,
HintNumber #= DeltaX * DeltaY,
Matrix[L..R,T..B] :: ID..ID
%writematrix(Submatrix, DeltaX, DeltaY, HintsArray),
%flatten(Submatrix, FlatSubmatrix),
%array_list(FlatSubmatrixArray, FlatSubmatrix),
% Cell count in rectangle must equal HintNumber
%length(FlatSubmatrix, HintNumber),
% All cells in rectangle must have ID as value
%FlatSubmatrixArray[1..HintNumber] :: ID
)
),
% Start searching
labeling(Matrix),
writematrix(Matrix, Width, Height, HintsArray).
writematrix(Matrix, Width, Height, HintsArray):-
writeln("Writing as classic view:"),
(for(I, 1, Height), param(Matrix, Width, HintsArray) do
write("["),
Row is Matrix[I],
(for(J, 1, Width), param(Row, HintsArray) do
ID is Row[J],
(_,_,Val) is HintsArray[ID],
write(" "),
write(Val),
write(" ")
),
writeln("]")
).
注释中的行应检查从 L..R - T..B 出发的子矩阵是否仅包含等于 ID 的元素。如何做到这一点?
运行 这给出了 "instantiation fault in _3264{1 .. 3} =< 3"
edit1:完整代码
edit2
似乎 eclipse 无法减少 LR/TB 变量的域来应用实例化。这是一个正确的假设吗?如果是这样,这将如何解决?
我没有 运行 你的代码,但是查看用于实例化域的 :: 运算符的 documentation,我们发现它需要域范围的下限和上限。对于您的示例,如果您只想让数组子集中的每个数字都等于 4,您可以简单地编写以下内容:
Matrix[A..B,C..D] :: 4..4
编辑
您收到的错误不是由该行代码触发的。它在将域变量与整数进行比较时给出实例化错误。我的猜测是你不小心在代码中的某个地方写了 =< 而不是 #=< 而不是这个问题,因为 {1..3} 的域实际上是 =< 3 并且不应该给出任何错误正确使用约束运算符。
如果您似乎无法弄清楚是哪一行代码产生了错误,请尝试执行跟踪 - 它(几乎)总能揭示原因。如果您使用 tkeclipse,可以使用内置的跟踪器工具。
我正在尝试在 EclipsE Prolog 中编写 Shikaku 求解器。 我的约束定义如下:
solve(Problemname):-
writeln("Start shikaku."),
problem(Problemname, Width, Height, Hints),
shikaku(Width, Height, Hints).
shikaku(Width, Height, Hints):-
length(Hints, HintCount),
array_list(HintsArray, Hints),
% Prepare the matrix and assign an ID to every Hint (from 1 to HintCount)
dim(Matrix, [Width, Height]),
Matrix[1..Width,1..Height] :: 1..HintCount,
%flatten_array(Matrix,FlattenedMatrix),
(for(ID,1,HintCount), foreach((HintX, HintY, HintNumber), Hints), param(Width, Height, Matrix, HintsArray) do
(
occurrences(ID, Matrix, HintNumber),
L :: 1..Width, R :: 1..Width,
T :: 1..Height, B :: 1..Height,
% Hint coordinates are inside the rectangle.
L #=< HintX,
R #>= HintX,
T #=< HintY,
B #>= HintY,
DeltaX #= R-L+1,
DeltaY #= B-T+1,
HintNumber #= DeltaX * DeltaY,
Matrix[L..R,T..B] :: ID..ID
%writematrix(Submatrix, DeltaX, DeltaY, HintsArray),
%flatten(Submatrix, FlatSubmatrix),
%array_list(FlatSubmatrixArray, FlatSubmatrix),
% Cell count in rectangle must equal HintNumber
%length(FlatSubmatrix, HintNumber),
% All cells in rectangle must have ID as value
%FlatSubmatrixArray[1..HintNumber] :: ID
)
),
% Start searching
labeling(Matrix),
writematrix(Matrix, Width, Height, HintsArray).
writematrix(Matrix, Width, Height, HintsArray):-
writeln("Writing as classic view:"),
(for(I, 1, Height), param(Matrix, Width, HintsArray) do
write("["),
Row is Matrix[I],
(for(J, 1, Width), param(Row, HintsArray) do
ID is Row[J],
(_,_,Val) is HintsArray[ID],
write(" "),
write(Val),
write(" ")
),
writeln("]")
).
注释中的行应检查从 L..R - T..B 出发的子矩阵是否仅包含等于 ID 的元素。如何做到这一点?
运行 这给出了 "instantiation fault in _3264{1 .. 3} =< 3"
edit1:完整代码
edit2 似乎 eclipse 无法减少 LR/TB 变量的域来应用实例化。这是一个正确的假设吗?如果是这样,这将如何解决?
我没有 运行 你的代码,但是查看用于实例化域的 :: 运算符的 documentation,我们发现它需要域范围的下限和上限。对于您的示例,如果您只想让数组子集中的每个数字都等于 4,您可以简单地编写以下内容:
Matrix[A..B,C..D] :: 4..4
编辑
您收到的错误不是由该行代码触发的。它在将域变量与整数进行比较时给出实例化错误。我的猜测是你不小心在代码中的某个地方写了 =< 而不是 #=< 而不是这个问题,因为 {1..3} 的域实际上是 =< 3 并且不应该给出任何错误正确使用约束运算符。
如果您似乎无法弄清楚是哪一行代码产生了错误,请尝试执行跟踪 - 它(几乎)总能揭示原因。如果您使用 tkeclipse,可以使用内置的跟踪器工具。