prolog - 否定中的削减行为

标签 prolog iso-prolog

由于回溯,以下代码正如预期的那样输出 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 与不在其中时具有相同的副作用。

最佳答案

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

Meta calling is opaque to the cut.

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

关于prolog - 否定中的削减行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32517857/

相关文章:

prolog - 序言中的“如果”?

javascript - Javascript 中的 Prolog 系统

prolog - 替换序言中的空格

binary - Prolog - 二进制加法?

prolog - 两种变体实现之间的差异

prolog - 在 Prolog 中将列表转换为术语

PROLOG 规则在找到第一个匹配后停止

prolog - 为什么 SWI-Prolog 将带引号和不带引号的字符串(不带空格)统一为同一规则?

prolog - 在序言中,仿函数与谓词和目标

memory-management - 为什么 gprolog 需要这么多内存?