Я пытаюсь написать решение Shikaku в EclipsE Prolog. Мои контрсилами определяются следующим образом:Как вы проверяете элементы подматрицы в Prolog
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. Как это может быть сделано?
Бег это дает "сбой создания экземпляра в _3264 {1 .. 3} = < 3"
edit1: полный код
edit2 Кажется, что затмение не в состоянии уменьшить область переменных LR/TB для применения экземпляра. Это правильное предположение? Если да, то как это будет разрешимо?
Ага, может быть, проблема заключается в том, что вы получаете доступ к матрице для подмножества L..R, T..B, но эти переменные не всегда могут быть заземлены при вводе строки кода. Вы не можете указывать диапазоны для подмножеств массивов, имеющих домен. Возможность может заключаться в выполнении поиска после установки домена переменных LRTB, но перед установкой домена ID..ID в подмножество Matrix. – SND
Как это сделать? :) – JorenV
Использование встроенного поиска ECLiPSe/6, как вы это делаете, делая вызов для маркировки/1. Только вместо того, чтобы вызывать его после цикла, вызовите его внутри цикла между экземплярами домена L..R и T..B, но перед строкой с матрицей [L..R, T..B] :: ID ..Я БЫ. – SND