强迫名单不平等?

时间:2019-04-28 20:13:53

标签: list prolog constraints eclipse-clp

对于给定的CSP,我使用了各种观点,其中之一是某种更奇特的布尔模型,它使用大小为NxNxN的可变数组。然后,使用此代码段使各个子数组不相等:

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

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

1 个答案:

答案 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)

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