否定削减的行为

Behavior of cuts in negation

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

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

这个带有剪切输出 1,也符合预期:

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

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

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

not(!) 的计算结果为 false,因此从某种意义上说,它回溯是有道理的,但同时它应该被切断,因此没有其他可能性可供探索。

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

为什么在取消时切割没有任何副作用?例如 write/1not 中与不在

中时具有相同的副作用。

(\+)/1 it's a metacall builtin, and (citing the !/0 文档)

Meta calling is opaque to the cut.

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