假设我们有一个变量列表。我们想对变量应用约束,但这些约束的关系是or
。我们如何在 Eclipse CLP(序言)中做到这一点?
我们应该注意到,如果列表很短,就像A is [X, Y, Z]
平凡的解决方案一样A[0] #= 0 or A[1] #= 0 or A[2] #= 0
(如果约束等于零)。因此,这不适用于长列表。
假设我们有一个变量列表。我们想对变量应用约束,但这些约束的关系是or
。我们如何在 Eclipse CLP(序言)中做到这一点?
我们应该注意到,如果列表很短,就像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).
对于您的具体示例,其中约束“等于零”(或其他一些常数),实际上最容易使用全局约束atleast/3:
atleast(1, Xs, 0) % at least 1 element of Xs is equal to 0