2013-05-15 126 views
0

我想製作一個類似於掃雷的遊戲,我需要檢查地圖上的一個正方形的鄰居,但是我在for for循環中收到語法錯誤,我正在使用SWI-Prolog序言for循環語法錯誤

checkneighbours(X,Y) :- 
retractall(vecini(_)), 
assert(vecini(0)), 
foreach(I in X-1..X+1, 
      (foreach J in Y-1..Y+1, 
       (map(I,J,Z), 
        (Z=:= "X" 
           -> vecini(V), 
           V1 is V+1, 
           assert(vecini(V1)) 
        ) 
       ) 
      ) 
     ). 

我沒有聲明循環的權利?或者我如何在X-1和X + 1之間循環?

+0

那麼什麼錯誤,你看見了什麼? – 2013-05-15 13:37:17

+0

語法錯誤在第一次foreach –

+0

只需將精確的錯誤輸出添加到問題。你在哪裏看到這個「我在X-1..X + 1」語法中? – 2013-05-15 14:00:36

回答

0

在Prolog中沒有像那樣的實際循環。我也不確定使用assert來動態更改事實數據庫是否明智(通常最好是在結構中表示數據)。但如果你真的堅持使用一個「循環」,其副作用,你應該使用forall

?- forall(between(-1,1,X), format('~d~n', [X])). 
-1 
0 
1 
true. 
+0

我試過這個「forall(之間(X-1,X + 1,I),格式('〜d〜n',[I]))」但如果我給出值6我得到這個錯誤:ERROR:between/3:Type error:'integer'expected,found'6-1' –

+0

是的,你首先需要用'is/2'來計算整數表達式'6-1'(或'X-1')爲一個整數。 ;那麼你可以將它粘貼到「/ 3」之間。總而言之,這就是爲什麼我說Prolog中沒有真正的循環,它並不意味着以這種方式使用,因此,您需要編寫更多的循環。 – 2013-05-15 14:46:46