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

Dynamic 谓词'contracting/1'是否恢复已删除的不一致值?,dynamic,prolog,clpfd,logical-purity,Dynamic,Prolog,Clpfd,Logical Purity,这个问题紧接着另一个关于Prolog中自定义标签的问题 contracting/1谓词在自定义标签谓词中的变量赋值后使用时,是否从域中永久删除“不一致”的值?或者在回溯时是否恢复了这些值 这些值当然是在回溯时恢复的 纯Prolog谓词(如CLP(FD)约束)的本质是,它们声明的所有内容在回溯时都是完全撤消的。如果没有这一点,许多重要的声明性属性将无法保持。有关更多信息,请参阅 您可以很容易地看到,这也适用于clpfd:contracting/1,例如使用示例会话: ?- X in 0..5, X

这个问题紧接着另一个关于Prolog中自定义标签的问题


contracting/1
谓词在自定义标签谓词中的变量赋值后使用时,是否从域中永久删除“不一致”的值?或者在回溯时是否恢复了这些值

这些值当然是在回溯时恢复的

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. ?-X在0..5中,X模Y#=2,Y在0..2中。 0..5中的X, X模Y#=2, Y在1..2中。 ?-X在0..5中,X模Y#=2,Y在0..2中,clpfd:收缩([X,Y])。 错。 ?-X在0..5中,X模Y#=2,Y在0..2中,(clpfd:收缩([X,Y]);真)。 0..5中的X, X模Y#=2, Y在1..2中。
从纯声明性的角度来看,不需要恢复不一致的值。但是
contracting/1
可能会破坏域的表示,以至于无法使用。或者,域表示会导致此后更昂贵的搜索。