2016-06-07 84 views
0

我嘗試解決序言中的akari/light-up遊戲。 首先,我想通過neighbors()找到一個單元格周圍的四個單元格,但它只給出一個單元格......之後,我想通過yneighbors()找到y中的所有單元格。有用..... 我的代碼:如何通過序言找到akari中的細胞鄰居

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

這是你在找什麼:

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, 
    ... 

不過,我也打消了這樣的做法。