Пролог - Ограничения - Light-Up/Akari
Я пытаюсь разгадать загадку Light-Up, и у меня возникают проблемы с закреплением ограничений.
Мой основной предикат:
akari(Rows, Size) :-
length(Rows, Size), maplist(length_list(Size), Rows),
append(Rows, Board),
domain(Board, 0, 2),
processRows(Rows, Rows, 0-0, Size),
% transpose(Rows, Columns),
% processRows(Columns, Columns, 0-0, Size),
labeling([], Board),
write(Board), nl,
printBoard(Board, Size).
Rows
в форме матрицы, например, с каждым свободным квадратом:
start :-
akari([[_,_,_],
[_,_,_],
[_,_,_]], 3).
Для обработки каждой строки я использую:
processRows([], _Board, _Row-_Col, _Size).
processRows([H|T], Board, Row-Col, Size) :-
processRow(H, Board, Row-Col, Size, []),
NewRow is Row + 1,
processRows(T, Board, NewRow-0, Size).
processRow([], _Board, _Row-_Col, _Size, _VarList).
processRow([H|T], _Board, _Row-Col, _Size, _VarList) :-
H == 2,
NewCol is Col + 1,
processRow(T, Board, Row-NewCol, Size, []).
processRow([H|T], Board, Row-Col, Size, VarList) :-
gatherLeft(Board, Row-Col, Row-Col, Size, VarList).
NewCol is Col + 1,
processRow(T, Board, Row-NewCol, Size, []).
Итак, я прохожу каждый элемент матрицы и собираю, начиная с gatherLeft
- который вызывает другие кардинальные сборки, справа, вверх и вниз - строку и столбец квадрата, который я обрабатываю. Идея состоит в том, что на каждом пересечении строки и столбца - если хотите, креста - можно использовать не более одной лампочки.
Но если я сделаю что-то вроде этого:
count2([],0).
count2([H|T], Count) :-
H #= 1 #<=> C,
count2(T, C2),
Count #= C + C2.
Или эта сумма (VarList, #=<, 1)
Мое намерение - "Каждый крест может иметь не более одной лампочки", но я заканчиваю тем, что выбираю каждое пространство, и в итоге говорю: "На всей доске может быть не более одного источника света". И я получаю пустую доску.
редактировать
Для потомков решение, которое я придумал, было:
Каждый квадрат может иметь не более одного источника света, поэтому sum([H], #=<, 1)
,
Если взять квадрат, столбец и строка могут иметь не более одного источника света, поэтому sum(Row, #=<, 1)
,
В окрестности квадрата должен быть хотя бы один свет, поэтому sum(VarList, #>=, 1)
,
Теперь кажется, что работает.