谓词“contracting/1”是否恢复已删除的不一致值?

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

此问题是关于 Prolog 中自定义标签的另一个问题 的后续问题。

contracting/1 谓词在对自定义标签谓词中的变量赋值后使用时,是否会从域中永久删除 "inconsistent" 值?还是在回溯时恢复这些值?

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

Prolog 谓词的性质,例如 CLP(FD) 约束,它们声明的所有内容都完全 未完成回溯。没有这个,许多重要的声明属性将不成立。有关详细信息,请参阅

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

?- 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.