2

我正在尝试使用约束X不成为列表中的值。

来自SICStus Prolog 手册

?X in_set +FDSet 

不过,我不知道如何将列表转换为 FDSet。我有一个整数列表,[2,3,8,9]我想将变量域限制X为不在该列表中。我怎么做?谢谢。

4

2 回答 2

4

文档来看,怎么样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.
于 2012-04-12T11:32:03.157 回答
0

我在这里实现了一个..

/** 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).
于 2015-08-03T18:18:56.487 回答