Prolog EclipseCLP:获取网格上的所有相邻单元

Prolog EclipseCLP:获取网格上的所有相邻单元,prolog,eclipse-clp,clp,Prolog,Eclipse Clp,Clp,所以我的问题是:给定网格中X,Y坐标的某个点,我想返回它的所有相邻单元 (注意:在以下示例中,我使用的符号是UL=左上角、UM=中上角、UR=右上角、L=左、R=右、BL=左下角、BM=中下角和BR=右下角。) 例如: 对于5x5网格上(3,3)处的元素x 对于5x5网格上(1,1)处的元素x 现在,从上面的例子中可以看出,与当前元素x相邻的单元数量可能会根据元素x本身的x,Y坐标而变化 我想通过这样的方式来解决这个问题:指定坐标X左右的每个X,以及指定坐标Y上方和下方的每个Y都应该在1..N的

所以我的问题是:给定网格中X,Y坐标的某个点,我想返回它的所有相邻单元

(注意:在以下示例中,我使用的符号是UL=左上角、UM=中上角、UR=右上角、L=左、R=右、BL=左下角、BM=中下角和BR=右下角。)

例如:

对于5x5网格上(3,3)处的元素x

对于5x5网格上(1,1)处的元素x

现在,从上面的例子中可以看出,与当前元素x相邻的单元数量可能会根据元素x本身的x,Y坐标而变化

我想通过这样的方式来解决这个问题:指定坐标X左右的每个X,以及指定坐标Y上方和下方的每个Y都应该在1..N的范围内,然后定义它们的实际值:

% Adj_cells/2 :   (X,Y) coordinate, board width/height N
adjacent_cells((X,Y),N) :-
    [Xleft,Xright,Yup,Ydown] #:: 1..N,
    Xleft #= X-1, Xright #= X+1,
    Yup   #= Y-1, Ydown  #= Y+1,
    ...
然而,当然,每当越过电路板的边界时,该值都会被评估为false

我希望我不需要明确区分与董事会边界有关的情况;相反,我试图找到一些东西,而不是在到达越界坐标时计算为false,只是“丢弃”该结果并尝试计算其他相邻单元

我相信ECLiPSe中会有一个很好的解决方案,但我已经搜索了文档,到目前为止,似乎找不到适合我需要的东西


非常感谢您的帮助

您没有说明要以何种形式“返回”相邻单元格,但如果您只想为每个相邻单元格“做”些什么,您可以使用以下模式:

adjacent_cells([X,Y], N) :-
    ( multifor([I,J], [max(1,X-1),max(1,Y-1)], [min(N,X+1),min(N,Y+1)]), param(X,Y) do
        ( [I,J]==[X,Y] -> true ;
            writeln([I,J])
        )
    ).
比如说

?- adjacent_cells([1, 3], 6).
[1, 2]
[1, 4]
[2, 2]
[2, 3]
[2, 4]
Yes (0.00s cpu)

这正是我想要的,很有道理,谢谢!
adjacent_cells([X,Y], N) :-
    ( multifor([I,J], [max(1,X-1),max(1,Y-1)], [min(N,X+1),min(N,Y+1)]), param(X,Y) do
        ( [I,J]==[X,Y] -> true ;
            writeln([I,J])
        )
    ).
?- adjacent_cells([1, 3], 6).
[1, 2]
[1, 4]
[2, 2]
[2, 3]
[2, 4]
Yes (0.00s cpu)