【问题标题】:SWI-Prolog predicates are not called不调用 SWI-Prolog 谓词
【发布时间】:2013-05-15 16:49:54
【问题描述】:

我正在尝试制作类似于扫雷的游戏,并且我正在尝试计算地图上某个点附近的炸弹数量,但它只进入一个 countneighbour 并且它停止了,我怎样才能让它进入其他 countneighbor 谓词?

checkneighbours(X,Y) :- nb_setval(vecini,0),
        X1 is X-1,
        X2 is X+1,
        Y1 is Y-1,
        Y2 is Y+1,
        countneighbours(X1,Y),
        countneighbours(X1,Y1),
        countneighbours(X1,Y2),
        countneighbours(X,Y1),
        countneighbours(X,Y2),
        countneighbours(X2,Y1),
        countneighbours(X2,Y),
        countneighbours(X2,Y2),
        nb_getval(V,vecini),
         write(V).

countneighbours(X,Y) :- map(X,Y,Z),
                ( Z=:= "O"
                        -> nb_getval(V,vecini),
                        V1 is V+1,
                        nb_setval(vecini,V1)
                ).

【问题讨论】:

  • 您的map 谓词是什么?真的,一个全局变量?

标签: prolog


【解决方案1】:

整个方法有点问题,全局变量,复制粘贴而不是使用回溯等。你如何代表整个比赛场地?

无论如何,当 else 命中时 if-else 构造将失败。你需要这样写:

(  if_condition
-> action
;  true
).

如果没有与 else 相关的操作。

当然,也可以是别的东西……map 是做什么的?

【讨论】:

  • 我猜 map/3 是雷区
  • @CapelliC 我也这么认为,但如果没有它的定义,就无法知道countneighbours 中的 Z 可能有什么值
  • 将 else 设置为 true 解决了这个问题,map 是 SWI-Prolog 中的一个预定义术语,您设置它的大小,例如 size(2,2),然后设置地图的值,map (2,2,'a'), map(1,2,'b') 等
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多