我正在尝试使用约束X
不成为列表中的值。
?X in_set +FDSet
不过,我不知道如何将列表转换为 FDSet。我有一个整数列表,[2,3,8,9]
我想将变量域限制X
为不在该列表中。我怎么做?谢谢。
我正在尝试使用约束X
不成为列表中的值。
?X in_set +FDSet
不过,我不知道如何将列表转换为 FDSet。我有一个整数列表,[2,3,8,9]
我想将变量域限制X
为不在该列表中。我怎么做?谢谢。
从文档来看,怎么样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).