Использование ограничения 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).
Другие вопросы по тегам