如何在网格上生成可用步骤列表?
How to generate a list of available steps on a grid?
我有一个由 max_size(5, 5)
描述的 5x5 网格。我需要使用 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([])
,它应该列出网格上的所有单元格。例如,对于 2x2 网格,它将是 [0-0, 1-0, 1-1, 0-1]
(顺序无关紧要)。
事实上,我需要这个谓词来构建另一个名为 available_steps/2
的谓词,它会生成一个包含给定位置所有可能移动的列表。拥有 available_steps(CurrentPos, Visited)
,我将能够暴力破解 Hunt the Wumpus
游戏并找到所有可能的金牌路线。
list_all_cells(Cells) :-
bagof(C,cell(C),Cells).
cell(X-Y) :-
between(0,4,X),
between(0,4,Y).
示例运行:
?- list_all_cells(Cells); true.
Cells= [0-0, 0-1, 0-2, 0-3, 0-4, 1-0, 1-1, 1-2, ... - ...|...] [write] % The letter w was pressed.
Cells= [0-0, 0-1, 0-2, 0-3, 0-4, 1-0, 1-1, 1-2, 1-3, 1-4, 2-0, 2-1, 2-2, 2-3, 2-4, 3-0, 3-1, 3-2, 3-3, 3-4, 4-0, 4-1, 4-2, 4-3, 4-4] ;
true.
我有一个由 max_size(5, 5)
描述的 5x5 网格。我需要使用 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([])
,它应该列出网格上的所有单元格。例如,对于 2x2 网格,它将是 [0-0, 1-0, 1-1, 0-1]
(顺序无关紧要)。
事实上,我需要这个谓词来构建另一个名为 available_steps/2
的谓词,它会生成一个包含给定位置所有可能移动的列表。拥有 available_steps(CurrentPos, Visited)
,我将能够暴力破解 Hunt the Wumpus
游戏并找到所有可能的金牌路线。
list_all_cells(Cells) :-
bagof(C,cell(C),Cells).
cell(X-Y) :-
between(0,4,X),
between(0,4,Y).
示例运行:
?- list_all_cells(Cells); true.
Cells= [0-0, 0-1, 0-2, 0-3, 0-4, 1-0, 1-1, 1-2, ... - ...|...] [write] % The letter w was pressed.
Cells= [0-0, 0-1, 0-2, 0-3, 0-4, 1-0, 1-1, 1-2, 1-3, 1-4, 2-0, 2-1, 2-2, 2-3, 2-4, 3-0, 3-1, 3-2, 3-3, 3-4, 4-0, 4-1, 4-2, 4-3, 4-4] ;
true.