Does the predicate `contracting/1` restore deleted inconsistent values?
这个问题是我之前在Prolog中关于自定义标签发布的另一个问题。
contracting/1谓词在将值分配给自定义标签谓词中的变量后使用时,是否从域中永久删除"不一致"的值?还是在回溯时恢复这些值?
- 从纯粹声明性的angular来看,不需要恢复不一致的值。但是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. |