Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中的普通No返回Yes_Prolog - Fatal编程技术网

Prolog中的普通No返回Yes

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

我在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: '), 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谢谢大家。