簡體   English   中英

對列表中的變量應用OR約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM