如果我们在剪切(fail
)之后的谓词中使用!
,它仍然会通过回溯找到某种溶剂,但我认为不应该。
考虑下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
,因为正如official doc所写,
剪切“!”删除从当前谓词进入以来创建的所有回溯点,这意味着所有后续子句的回溯点,以及当前子句中在“!”之前的谓词调用中的回溯点。
此外,如果我们在SWI-Prolog中运行类似的代码,则按预期,其输出将为1
的{{1}}和p :- m(X), !, write(X), fail.
的{{1}}。我想念什么?