У меня есть сетка 5x5, которая описывается max_size(5, 5)
. Мне нужно создать список всех ячеек из этого описания, используя DCG.
Вот код, который у меня есть:
:- use_module(library(clpfd)).
map_size(5, 5).
natnum(0).
natnum(X) :-
X #= X0 + 1,
natnum(X0).
list_all_cells(Visited) -->
{ length(Visited, 25) },
[].
list_all_cells(Visited) -->
[X-Y],
{ map_size(X_max, Y_max),
natnum(X), natnum(Y),
X #< X_max, Y #< Y_max,
maplist(dif(X-Y), Visited) },
list_all_cells([X-Y|Visited]).
Однако, он не генерирует список и выводит только 4 пары.
Возможный запрос к DCG выглядит как list_all_cells([])
, который должен перечислить все ячейки в сетке. Например, это будет [0-0, 1-0, 1-1, 0-1]
для сетки 2x2 (порядок не имеет значения).
На самом деле, мне нужен этот предикат для построения другого, называемого available_steps/2
, который генерировал бы список всех возможных ходов для данной позиции. Имея available_steps(CurrentPos, Visited)
, я смогу переиграть Hunt the Wumpus
игру и найти все возможные пути к золоту.