2016-05-22 8 views
2

Я пытаюсь написать решение 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 для применения экземпляра. Это правильное предположение? Если да, то как это будет разрешимо?

+0

Ага, может быть, проблема заключается в том, что вы получаете доступ к матрице для подмножества L..R, T..B, но эти переменные не всегда могут быть заземлены при вводе строки кода. Вы не можете указывать диапазоны для подмножеств массивов, имеющих домен. Возможность может заключаться в выполнении поиска после установки домена переменных LRTB, но перед установкой домена ID..ID в подмножество Matrix. – SND

+0

Как это сделать? :) – JorenV

+0

Использование встроенного поиска ECLiPSe/6, как вы это делаете, делая вызов для маркировки/1. Только вместо того, чтобы вызывать его после цикла, вызовите его внутри цикла между экземплярами домена L..R и T..B, но перед строкой с матрицей [L..R, T..B] :: ID ..Я БЫ. – SND

ответ

1

Я не запускал ваш код, но, глядя на documentation оператора :: для создания экземпляров доменов, мы видим, что он ожидает нижней и верхней границ диапазона домена. Для примера, если вы просто хотите каждое число в подмножество массива равным, скажем, 4, вы могли бы просто написать следующее:

Matrix[A..B,C..D] :: 4..4 

РЕДАКТИРОВАНИЕ

ошибка вы получаете не запускается этой строкой кода. Он дает ошибку создания экземпляра при сравнении переменной домена с целым числом. Я предполагаю, что вы случайно написали = < вместо # = < где-то в коде, который не включен в этот вопрос, так как домен {1..3} на самом деле = < 3 и не должен приводить к ошибке операторы ограничения корректно используются.

Если вы не можете понять, какая строка кода создает ошибку, попробуйте выполнить трассировку - она ​​(почти) всегда обнаруживает причину. Если вы используете tkeclipse, имеется встроенный инструмент трассировки.

+0

изменение :: ID до :: ID..ID возвращается с той же ошибкой – JorenV

+0

Я изменил ответ. – SND

+0

см. Обновленный код. Отслеживание завершается неудачей при достижении линии Matrix :: ID..ID во второй раз.Кажется, что затмение не может уменьшить область переменных LR/TB, чтобы применить экземпляр – JorenV