【问题标题】:How to generate a list of available steps on a grid?如何在网格上生成可用步骤列表?
【发布时间】:2019-03-10 08:30:10
【问题描述】:

我有一个由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 游戏并找到所有可能的获得金币的途径。

【问题讨论】:

    标签: search prolog dcg wumpus-world


    【解决方案1】:
    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.
    

    【讨论】:

    • 为什么我们的目标中有true
    • @RadicalEd 将;true 添加到目标中用于强制SWI-Prolog 在返回之前提示用户输入,以便输入w 以显示整个答案。如果没有;true,则以... 返回答案,然后结束。我这样做是为了向您展示所有 25 个值都在列表中。当您在代码中使用它时,不需要; true。请参阅:SWI-Prolog how to show entire answer (list)?。我将此作为评论留下,因为它不是答案的一部分,也是任何优秀的 Prolog 程序员在开始时都应该知道的。
    • 为什么不cell(X-Y)
    • @repeat 谢谢,再次。固定的。是的,应该是cell(X-Y). 过去几周我一直在做 DCG,返回没有名称的结构,因此使用functor((parm1,pam2,...)).。甚至没有注意到我做到了。
    • 这些额外的括号可以产生影响,有时它们是必要的,有时它们是小问题。考虑复合术语f((a,b,c,d)):这不是f/4,而是f/1,内部带有(默认)“逗号列表”:(a,b,c,d) == (a,(b,(c,d))),它比arity 4的复合占用更多内存,访问速度也更慢(因为它是一棵树,而不是平坦的)。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多