对列表中的变量应用 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
假设我们有一个变量列表。我们想对变量应用约束,但这些约束的关系是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