Использование ограничения in_set/2
Я пытаюсь использовать ограничение X
чтобы не быть значением в списке.
Из руководства SICStus Prolog:
?X in_set +FDSet
Однако я не могу понять, как преобразовать список в FDSet. У меня есть список целых чисел [2,3,8,9]
и я хочу ограничить область переменной X
чтобы не быть в этом списке. Как я могу это сделать? Благодарю.
2 ответа
Судя по документации, как насчет 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.
Я реализовал один, как здесь..
/** Constraint domain to memebers of a list (of numbers only) **/
domain_list_constraint(_, []) :- !.
domain_list_constraint(DomainVar, List) :- member(E, List),
(atom(E)->atom_number(E, I),
DomainVar #= I;
DomainVar #= E).