ECLiPSe clp:将所有相邻单元格放在网格上

时间:2016-03-23 09:28:32

标签: prolog eclipse-clp clp

所以我的问题如下:我希望,在网格中使用X,Y坐标给出一些点,以返回其所有相邻的单元格。

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

例如:

  

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

 _   _   _   _   _
 _   UL  UM  UR  _
 _   L   x   R   _
 _   BL  BM  BR  _
 _   _   _   _   _
  

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

 x   R   _   _   _
 BM  BR  _   _   _
 _   _   _   _   _
 _   _   _   _   _
 _   _   _   _   _

现在,如上例所示,与当前元素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,
    ...

然而,当然,只要董事会的边界越过,这就会被评估为假。

我希望我不会明确区分有关董事会边界的情况;相反,我试图找到一些东西,而不是在达到越界坐标时评估为假,只是“丢弃”'结果并尝试计算其他相邻的细胞。

我确信在ECLiPSe中有一个很好的小解决方案,但我已经搜索了文档,而且 - 似乎找不到适合我的东西需要。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

你没有说出你想要的形式"返回"相邻的细胞,但如果你只是想做"做"每个邻居的东西,你可以使用这种模式:

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)