对列表中的变量应用 OR 约束

Apply OR constraint over the variables in a list

假设我们有一个变量列表。我们想对变量应用约束,但这些约束的关系是or。我们如何在 Eclipse CLP (prolog) 中做到这一点?

我们应该注意到,如果列表很短,如 A is [X, Y, Z],则简单的解决方案是 A[0] #= 0 or A[1] #= 0 or A[2] #= 0(如果约束等于零)。因此,这不适用于长列表。

对于一般的具体化约束,可以将它们的真值反映到一个0/1的变量中,然后求和。例如。声明 Xs 的至少一个元素大于 3:

( foreach(X,Xs),foreach(B,Bs)  do  B #= (X#>3) ),
sum(Bs) #> 0.

另一种选择是记住 Prolog 擅长元编程,因此您可以符号化地构造表达式 X1#>3 or X2#>3 or ... or Xn#>3 然后调用它:

( foreach(X,Xs),fromto(0,Cs,(Cs or X#>3),Dis)  do  true ),
call(Dis).

对于您的特定示例,其中约束是 "equal to zero"(或其他一些常量),实际上最容易使用全局约束 atleast/3:

atleast(1, Xs, 0)              % at least 1 element of Xs is equal to 0