假设我们有一个变量列表。我们希望对变量应用约束,但是这些约束的关系为or
。我们如何在Eclipse CLP(prolog)中做到这一点?
我们应该注意,如果列表像A is [X, Y, Z]
一样短,那么简单的解就是A[0] #= 0 or A[1] #= 0 or A[2] #= 0
(如果约束等于零)。因此,这对于较长的列表不起作用。
答案 0 :(得分:1)
对于一般可约束约束,您可以将其真值反映为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).
对于您的特定示例,在约束为“等于零”(或其他常数)的情况下,使用全局约束atleast/3实际上最简单:
atleast(1, Xs, 0) % at least 1 element of Xs is equal to 0