Prolog中的琐事否则返回是

时间:2012-11-03 10:18:01

标签: prolog

我在prolog中有一个简单的谓词,当MaxScore> 0时,它给出是,否则为否。因此,如果MaxScore是0,那么显然结果是否。但这不会发生。仔细看看:https://dl.dropbox.com/u/18710637/prologIsInsane.png

或相应的代码:

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
| ?

我对此感到疯狂。任何人都知道发生了什么事?

1 个答案:

答案 0 :(得分:4)

没有真正的问题;考虑这段代码:

foo(0).
foo(0).
foo(1).

bar:-
    foo(X),
    write(X), nl,
    X > 0.

Prolog首先将X0(来自第一个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