关于动态:谓词” contracting / 1″是否还原已删除的不一致值?

Does the predicate `contracting/1` restore deleted inconsistent values?

这个问题是我之前在Prolog中关于自定义标签发布的另一个问题。

contracting/1谓词在将值分配给自定义标签谓词中的变量后使用时,是否从域中永久删除"不一致"的值?还是在回溯时恢复这些值?


这些值当然会在回溯时恢复。

纯Prolog谓词(例如CLP(FD)约束)的本质是,它们陈述的所有内容在回溯时都完全被撤消。没有这一点,许多重要的声明性属性将不成立。有关更多信息,请参见逻辑纯度。

例如,使用示例会话,您可以轻松地看到这也适用于clpfd:contracting/1

1
2
3
4
5
6
7
8
9
10
11
12
?- X in 0..5, X mod Y #= 2, Y in 0..2.
X in 0..5,
X mod Y#=2,
Y in 1..2.

?- X in 0..5, X mod Y #= 2, Y in 0..2, clpfd:contracting([X,Y]).
false.

?- X in 0..5, X mod Y #= 2, Y in 0..2, ( clpfd:contracting([X,Y]) ; true ).
X in 0..5,
X mod Y#=2,
Y in 1..2.