0

我在序言中有一个简单的谓词,当 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
| ?

我快疯了。有人知道发生了什么吗?

4

1 回答 1

4

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

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

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

Prolog 将首先X0(从第一个foo(0))统一,将打印输出然后失败,因为0 > 0它是错误的。然后 prolog 将回溯并选择第二个foo(0);再次相同。最后,X将统一1bar返回true

自然,打印等副作用无法逆转/回溯,因此在终端中您将看到:

0
0
1
true

你如何解决它取决于你想做什么;如果你想打印,Max Core = 1那么你可以在检查 if 后进行打印MaxScore>0。一般来说,最好在最后进行打印(如果需要),而不是在程序深处的谓词中。

哦,对了,最好贴出实际代码和输出,而不是截图;它使复制粘贴调试代码变得更加容易。此外,建议给出一个可运行的示例:您使用的一半谓词aiPlay/4是未定义的,所以我只是猜测问题是我上面提到的:p

于 2012-11-03T10:32:19.790 回答