我在prolog中有一个简单的谓词,当MaxScore> 0时,它给出是,否则为否。因此,如果MaxScore是0,那么显然结果是否。但这不会发生。仔细看看:
或相应的代码:
aiPlay(PlayerNum, Board, Pos, BotType) :-
aiTryAll(Board, PlayerNum, ScoreList, 0),
scoreListGetPos(ScoreList, 1, Pos, MaxScore),
write('MaxScore: '), write(MaxScore), nl,
MaxScore > 0.
相应的输出:
| ? myQuery(Pos).
MaxScore: 0
MaxScore: 0
MaxScore: 1
Pos = 6 ?
yes
| ?
我对此感到疯狂。任何人都知道发生了什么事?
答案 0 :(得分:4)
没有真正的问题;考虑这段代码:
foo(0).
foo(0).
foo(1).
bar:-
foo(X),
write(X), nl,
X > 0.
Prolog首先将X
与0
(来自第一个foo(0)
)统一,将打印输出,然后失败,因为0 > 0
为false。然后prolog将回溯并选择第二个foo(0)
;再次相同。最后,X
将与1
统一,bar
将返回true
。
Naturall,打印等副作用无法逆转/回溯,所以在终端你会看到:
0
0
1
true
你如何解决它取决于你想做什么;如果您只想打印Max Core = 1
,则可以在检查MaxScore>0
后进行打印。但一般情况下,最好在最后进行打印(如果需要),而不是在程序深处进行打印。
哦,顺便说一下,发布实际代码和输出而不是截图更好;它可以更容易地复制粘贴调试代码。另外,建议给出一个可运行的例子:你在aiPlay/4
中使用的谓词的一半是未定义的,所以我只是猜测问题是我上面提到的:p