这个问题是另一个问题的后续I posted earlier关于 Prolog 中的自定义标签。
contracting/1
谓词在对自定义标签谓词中的变量赋值后使用时,是否会从域中永久删除“不一致”的值?还是在回溯时恢复这些值?
最佳答案
这些值当然会在回溯时恢复。
纯 Prolog 谓词的性质,例如 CLP(FD) 约束,它们声明的所有内容在回溯时完全撤消。没有这个,许多重要的声明属性将不成立。参见 logical-purity获取更多信息。
您可以很容易地看到这也适用于 clpfd:contracting/1
,例如使用示例 session :
?- 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.
关于dynamic - 谓词 `contracting/1` 是否恢复已删除的不一致值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36272417/