强制执行列表的不平等?

Enforcing inequality of lists?

对于给定的 CSP,我使用了多种视点,其中之一是使用大小为 NxNxN 的可变数组的更具异国情调的布尔模型。然后我用这个片段强制执行各种子数组的不平等:

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

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

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

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

为了比较,您可以尝试音差运算符 ~=/2(在某些 Prolog 中称为 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)

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