0

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

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

4

1 回答 1

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
于 2019-04-24T23:16:01.327 回答