Dynamic 谓词'contracting/1'是否恢复已删除的不一致值?
这个问题紧接着另一个关于Prolog中自定义标签的问题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
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
可能会破坏域的表示,以至于无法使用。或者,域表示会导致此后更昂贵的搜索。