Prolog中的普通No返回Yes
我在prolog中有一个简单的谓词,当MaxScore>0时,它给出yes,否则就是no。所以如果MaxScore为0,那么结果显然是no。但这不会发生。仔细看看这个: 或相应的代码:Prolog中的普通No返回Yes,prolog,Prolog,我在prolog中有一个简单的谓词,当MaxScore>0时,它给出yes,否则就是no。所以如果MaxScore为0,那么结果显然是no。但这不会发生。仔细看看这个: 或相应的代码: aiPlay(PlayerNum, Board, Pos, BotType) :- aiTryAll(Board, PlayerNum, ScoreList, 0), scoreListGetPos(ScoreList, 1, Pos, MaxScore), write('MaxScore
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
| ?
我越来越疯狂了。有人知道发生了什么事吗?没有什么问题;考虑这个代码:
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
自然,打印等副作用无法逆转/回溯,因此在终端中您将看到:
0
0
1
true
你如何解决它取决于你想做什么;如果只想打印Max Core=1
,则可以在检查MaxScore>0
后进行打印。一般来说,最好在最后打印(如果需要的话),而不是在程序中的谓词中
哦,顺便说一下,最好发布实际代码和输出,而不是屏幕截图;它使复制粘贴调试代码变得更容易。另外,建议给出一个可运行的例子:在
aiPlay/4
中使用的谓词有一半是未定义的,所以我只是猜测问题是我上面提到的:p实际上没有问题;考虑这个代码:
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
自然,打印等副作用无法逆转/回溯,因此在终端中您将看到:
0
0
1
true
你如何解决它取决于你想做什么;如果只想打印Max Core=1
,则可以在检查MaxScore>0
后进行打印。一般来说,最好在最后打印(如果需要的话),而不是在程序中的谓词中
哦,顺便说一下,最好发布实际代码和输出,而不是屏幕截图;它使复制粘贴调试代码变得更容易。另外,建议给出一个可运行的例子:在
aiPlay/4
中使用的谓词有一半是未定义的,所以我只是猜测问题是我上面提到的:p请尝试对你的接受率进行更多的研究。请尝试对你的接受率进行更多的研究。谢谢你的回答。我花了3个小时计算这是回溯,但如果发生这种情况是因为我的一个谓词是mall形式的,因为它们是严格的规则,不允许maxscore大于0。关于打印屏幕,我想应该更清楚地理解:D谢谢大家。谢谢你的回答。我花了3个小时计算这是回溯,但如果发生这种情况是因为我的一个谓词是mall形式的,因为它们是严格的规则,不允许maxscore大于0。关于打印屏幕,我想应该更清楚地理解:D谢谢大家。