2013-05-15 96 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