Для общих ограничений на повторное перечисление вы можете отразить их истинное значение в переменной 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