对于给定的CSP,我使用了各种观点,其中之一是某种更奇特的布尔模型,它使用大小为NxNxN
的可变数组。然后,使用此代码段使各个子数组不相等:
(foreach(X, List1),
foreach(Y, List2),
foreach((X #\= Y), Constraints)
do true),
1 #=< sum(Constraints).
模型的性能很差,所以我很想知道更多有关幕后情况的信息。这是确保两个给定列表不同的正确方法吗?我是否正确理解,X #\= Y
列表中的每个约束(Constraints
)在计算总和之前都需要实例化,这意味着所有相应的变量也需要实例化吗?
答案 0 :(得分:1)
约束库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)
这是否整体上更快取决于您的应用程序。