[英]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).
對於您的特定示例,在約束為“等於零”(或其他常數)的情況下,實際上最容易使用全局約束atleast / 3 :
atleast(1, Xs, 0) % at least 1 element of Xs is equal to 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.