3

123正如预期的那样,由于回溯,以下代码会输出:

between(1,3,X), write(X), false.

这个带有 cut outputs 的1,也如预期的那样:

between(1,3,X), write(X), !, false.

但是这个输出123令人惊讶:

between(1,3,X), write(X), not(!).

not(!)评估为假,因此在一种方式上,它回溯是有道理的,但同时它应该已经切割,因此没有其他可能性可供探索。

相同的行为发生在\+而不是not/1

为什么在否定时削减没有任何副作用?例如write/1,在 anot中与不在其中时具有相同的副作用。

4

1 回答 1

2

(\+)/1它是内置的元调用,并且(引用!/0文档)

元调用对剪辑是不透明的。

这些示例,特别是 t4,说明了操作语义

于 2015-09-11T07:33:50.530 回答