如何通过prolog找到akari中的单元格的邻居

时间:2016-06-07 06:39:28

标签: prolog

我尝试在prolog中解决akari /点亮游戏。 首先,我想通过neighbors()找到一个单元格周围的四个单元格,但它只给出一个单元格...之后我想通过yneighbors()找到y中所有单元格的细胞....任何帮助都将是有用..... 我的代码:

size(8,8).

wall(1,6).
wall(2,2).
wall(2,3).
wall(3,7).
wall(4,1).
wall(4,5).
wall(5,4).
wall(5,8).
wall(6,2).
wall(7,6).
wall(7,7).
wall(8,3).

wallnum(1,6,1).
wallnum(2,2,3).
wallnum(3,7,0).
wallnum(5,4,4).
wallnum(5,8,0).
wallnum(6,2,2).
wallnum(7,6,1).

light(1,2).
light(1,7).
light(2,1).
light(2,8).
light(3,2).
light(4,4).
light(4,6).
light(5,3).
light(5,5).
light(6,1).
light(6,4).
light(7,2).
light(7,8).
light(8,6).

cell(X,Y):-X>0,X<9,Y>0,Y<9.

neighbors(X,Y,L):-cell(X,Y),
cell(X+1,Y),X1 is X + 1,Y1 is Y  ,L =[X1,Y1];
cell(X-1,Y),X1 is X - 1,Y1 is Y  ,L=[X1,Y1];
cell(X,Y+1),X1 is X    ,Y1 is Y + 1 ,L=[X1,Y1];
cell(X,Y-1),X1 is X    ,Y1 is Y - 1 ,L=[X1,Y1].

yneighbors(X,Y,L):-cell(X,Y+1),L=[X,Y].

1 个答案:

答案 0 :(得分:0)

这就是你要找的东西:

neighbor(X,Y,NX,Y):-
    NX is X-1,
    cell(NX,Y).

neighbor(X,Y,NX,Y):-
    NX is X+1,
    cell(NX,Y).

neighbor(X,Y,X,NY) :-
    NY is Y-1,
    cell(X,NY).

neighbor(X,Y,X,NY) :-
    NY is Y+1,
    cell(X,NY).

neighbors(X,Y,L) :-
    findall(neighbor(NX,NY),neighbor(X,Y,NX,NY),L).

说明:

cell(X+1,Y)这样的谓词调用是不正确的。这相当于cell(+(X,1),Y)。您应该注意到X + 1只是一个术语,而不是数学表达式。所以,它没有被评估。

数学表达式通过is / 2进行评估。

你应该检查你的Prolog知识,因为大多数代码都没有意义。

yneighbors(X,Y,L):-cell(X,Y+1),L=[X,Y].

总会失败。

如果你坚持像cell(X+Y,Z)这样的谓词调用,你应该评估cell / 2的参数:

cell(X,Y) :-
   EvalX is X,
   EvalY is Y,
   EvalY > 0, 
   ...

但是,我也不鼓励这种做法。