Пролог - Ограничения - 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),

Теперь кажется, что работает.

0 ответов

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