1

对于给定的 CSP,我使用了多种观点,其中之一是一个更奇特的布尔模型,它使用一个可变的 size 数组NxNxN。然后我用这个片段强制各种子数组的不等式:

(foreach(X, List1), 
 foreach(Y, List2), 
 foreach((X #\= Y), Constraints) 
 do true),
1 #=< sum(Constraints).

该模型的性能很差,所以我很想知道更多关于幕后发生的事情。这是确保两个给定列表不同的正确方法吗?我是否正确理解列表X #\= Y中的每个约束()都Constraints需要在计算总和之前实例化,这意味着所有相应的变量也需要实例化?

4

1 回答 1

1

约束库library(ic_global)确实在这里缺少约束;它应该提供lex_ne/2,类似于lex_lt/2。这将具有与您编写的代码相同的逻辑和操作行为,即在其参数列表中只剩下一个变量时传播:

?- B#::0..1, lex_ne([1,0,1], [1,B,1]).
B = 1

为了比较,您可以尝试声音差异运算符~=/2(在某些 Prologs 中称为 dif/2 )。这是有效实现的,但它不了解域,因此不会传播;它只是等到双方都实例化然后失败或成功:

?- B#::0..1, [1,0,1] ~= [1,B,1].
B = B{[0, 1]}
There is 1 delayed goal.

?- B#::0..1, [1,0,1] ~= [1,B,1], B = 0.
No (0.00s cpu)

这是否总体上更快将取决于您的应用程序。

于 2019-04-29T02:05:31.430 回答