我尝试在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].
答案 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,
...
但是,我也不鼓励这种做法。