【问题标题】:Apply OR constraint over the variables in a list对列表中的变量应用 OR 约束
【发布时间】:2019-04-24 00:04:59
【问题描述】:

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

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

【问题讨论】:

  • 在 clpfd 中,一般情况下有 (#\/)/2。但通常更好的一致性是可能的。

标签: prolog eclipse-clp


【解决方案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

【讨论】:

  • (foreach(X, [](1, 32, 6)), foreach(B, Bs) do B #= (X #> 3)), sum(Bs) #> 0. 的结果是No
  • @OmG foreach 用于列表。要遍历数组,请使用 foreacharg,即 (foreacharg(X, [](1, 32, 6)), foreach(B, Bs) do B #= (X #> 3)), sum(Bs) #> 0.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
相关资源
最近更新 更多