由于回溯,以下代码正如预期的那样输出 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
也会发生相同的行为。
为什么削减在被否定时没有任何副作用?例如,not
中的 write/1
与不在其中时具有相同的副作用。
最佳答案
关于prolog - 否定中的削减行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517857/