Search 如何在网格上生成可用步骤的列表?

Search 如何在网格上生成可用步骤的列表?,search,prolog,dcg,wumpus-world,Search,Prolog,Dcg,Wumpus World,我有一个5x5网格,由max\u 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_

我有一个5x5网格,由
max\u 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]).
:-使用_模块(库(clpfd))。
地图大小(5,5)。
纳特纳姆(0)。
纳特纳姆(X):-
X#=X0+1,
纳特纳姆(X0)。
列出所有单元格(已访问)-->
{长度(已访问,25)},
[]. 
列出所有单元格(已访问)-->
[X-Y],
{映射大小(X_max,Y_max),
纳特纳姆(X),纳特纳姆(Y),
X#
但是,它不生成列表,只输出4对

对DCG的可能查询类似于
list\u all\u cells([])
,它应该列出网格上的所有单元格。例如,对于2x2网格,它将是
[0-0,1-0,1-1,0-1]
(顺序无关紧要)

事实上,我需要这个谓词来构建另一个名为
available\u steps/2
的谓词,该谓词将为给定位置生成所有可能移动的列表。有了
可用的\u步骤(CurrentPos,已访问)
,我将能够用蛮力
狩猎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.

@盖伊,更新了问题,希望现在一切都清楚了。谢天谢地,一切都已修复:)我试图做一些类似于描述的
path\u from\u to
的事情让我们来看看。为什么我们的目标中有
true
?@RadicalEd adding
;如果目标为true,则使用SWI Prolog在返回前提示用户输入,这样就可以输入
w
来显示整个答案。没有
;如果为true
,则返回的答案带有
,然后结束。我这样做是为了向您显示所有25个值都在列表中。当您在代码中使用此选项时,
;不需要true
。请参阅:。我将此作为评论,因为它不是答案的一部分,也是任何优秀的Prolog程序员在开始时都应该知道的。为什么不
cell(X-Y)
?@再次重复Thx。固定的是的,它应该是
单元格(X-Y)。
过去几周我一直在做DCGs,返回没有名字的结构,因此使用
函子((parm1,pam2,…)。
。我甚至没有注意到我做了。这些额外的括号可以起作用,有时是必要的,有时是小问题。考虑复合项<代码> f((a,b,c,d)< /代码>:不是<代码> f/4 ,而是<代码> f/1 < /COD>内有(DeFabug)“逗号列表”内:<代码>(a,b,c,d)=(a,(b,,(c,d))),它占用的内存多于一个复杂度4,并且访问速度也慢(因为它是一棵树,不是平面)。嗯