Судя по documentation, а как насчет list_to_fdset/2
? Вы можете перевести на FDSet
, а затем построить его дополнение, а затем сообщение in_set/2
. Если ваша версия не имеет list_to_fdset/2
, вы можете легко преобразовать список в обычное выражение домена, а затем отправить отрицательное ограничение in/2
. В вашем примере, вы бы тогда пост:
#\ X in {2}\/{3}\/{8}\/{9}
и у вас есть только описать связь между списком и выражением домена, состоящим из одиночек, который легко:
list_domain([I|Is], Dom) :-
foldl(integer_domain_, Is, {I}, Dom).
integer_domain_(I, D0, D0 \/ {I}).
Пример запросы:
?- list_domain([1,2,3], Dom).
Dom = {1}\/{2}\/{3}.
?- list_domain([1,2,3], Dom), X in Dom.
Dom = {1}\/{2}\/{3},
X in 1..3.
О: 'X in \ ({2} \/{3} \/{8} \/{9})' – false