ECLiPSe CLP Ошибка типа в дим?

Я пытаюсь получить размеры платы судоку в ECLiPSE CLP, однако получаю следующую ошибку:

type error in dim([[_389, 9, 8, _395, _397, _399, _401, _403, _405], [_409, _411, _413, _415, 7, _419, _421, _423, _425], [_429, _431, _433, _435, 1, 5, _441, _443, _445], [1, _451, _453, _455, _457, _459, _461, _463, _465], [_469, _471, _473, 2, _477, _479, _481, _483, 9], [_489, _491, _493, 9, _497, 6, _501, 8, 2], [_509, _511, _513, _515, _517, _519, _521, 3, _525], [5, _531, 1, _535, _537, _539, _541, _543, _545], [_549, _551, _553, 4, _557, _559, _561, 2, _565]], [_567, _569])

Я получаю это, когда я звоню dim(Board,[R,C])где доска - доска судоку:

Board = [
[_, 9, 8, _, _, _, _, _, _],
[_, _, _, _, 7, _, _, _, _],
[_, _, _, _, 1, 5, _, _, _],
[1, _, _, _, _, _, _, _, _],
[_, _, _, 2, _, _, _, _, 9],
[_, _, _, 9, _, 6, _, 8, 2],
[_, _, _, _, _, _, _, 3, _],
[5, _, 1, _, _, _, _, _, _],
[_, _, _, 4, _, _, _, 2, _]].

Кто-нибудь знает, почему это происходит?

1 ответ

Решение

Вы вызываете dim/2, который ожидает массив в качестве первого аргумента. Однако плата в вашем случае представляет собой список. Простое преобразование можно получить, позвонив:

array_list(BoardArray,Board)

Небольшое примечание: поскольку у судоку всегда будет одинаковое количество строк и столбцов, вы также можете использовать одну и ту же переменную для определения размера. Вот так:

dim(Sudoku,[N,N])

РЕДАКТИРОВАТЬ:

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

(foreach(Row,Board), foreach(RowArray,Out)
do
  array_list(RowArray,Row)
),
array_list(BoardArray,Out)

Мы перебираем одновременно Board и Out, чтобы преобразовать каждый список строк в массив строк, а после цикла мы также преобразуем список родительских плат в массив плат.

На это, похоже, уже ответили.

Другие вопросы по тегам