如果我们fail
在 cut ( ) 之后在谓词中使用!
,它仍然会以某种方式找到另一个使用回溯的解决方案,但我认为它不应该。考虑 Visual Prolog 中的下一个示例
implement main
open core, stdio
class facts
m : (integer M).
clauses
m(1).
m(2).
m(3).
m(4).
class predicates
p : () failure.
clauses
p() :-
m(X),
!,
write(X),
nl,
fail.
clauses
run() :-
p().
run().
end implement main
goal
console::runUtf8(main::run).
它的输出是
1
2
3
4
但是,我只期望1
,因为正如官方文档中所写,
切 ”!” 删除自当前谓词入口以来创建的所有回溯点,这意味着所有回溯点到后续子句,加上在“!”之前在当前子句中进行的谓词调用中的回溯点。
此外,如果我们在 SWI-Prolog 中运行类似的代码,其输出将是1
forp :- m(X), !, write(X), fail.
和1234
for p :- m(X), write(X), fail.
,正如预期的那样。我错过了什么?