简体   繁体   中英

Apply OR constraint over the variables in a list

Suppose we have a list of variables. We want to apply a constraint over the variables, but the relation of these constraints are or . How we can do this in Eclipse CLP (prolog)?

We should notice that if the list is short like A is [X, Y, Z] the trivial solution is A[0] #= 0 or A[1] #= 0 or A[2] #= 0 (if the constraint is equality to zero). Hence, this does not work for a long list.

For general reifiable constraints, you can reflect their truth value into a 0/1 variable, and sum these up. Eg to state that at least one element of Xs is greater than 3 :

( foreach(X,Xs),foreach(B,Bs)  do  B #= (X#>3) ),
sum(Bs) #> 0.

Another option is to remember that Prolog is good at meta-programming, so you could symbolically construct the expression X1#>3 or X2#>3 or ... or Xn#>3 and then call it:

( foreach(X,Xs),fromto(0,Cs,(Cs or X#>3),Dis)  do  true ),
call(Dis).

For your specific example, where the constraint is "equal to zero" (or some other constant), it is actually easiest to use the global constraint atleast/3 :

atleast(1, Xs, 0)              % at least 1 element of Xs is equal to 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM