Применить ограничение OR к переменным в списке - PullRequest
0 голосов
/ 24 апреля 2019

Предположим, у нас есть список переменных.Мы хотим применить ограничение к переменным, но отношение этих ограничений равно or.Как мы можем сделать это в Eclipse CLP (пролог)?

Мы должны заметить, что если список короткий, как A is [X, Y, Z], тривиальное решение будет A[0] #= 0 or A[1] #= 0 or A[2] #= 0 (если ограничение равно нулю).Следовательно, это не работает для длинного списка.

1 Ответ

1 голос
/ 25 апреля 2019

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