我正在尝试将约束X
用作列表中的值。
?X in_set +FDSet
但我无法弄清楚如何将列表转换为FDSet。
我有一个整数列表[2,3,8,9]
,我想限制变量X
的域不在该列表中。我怎么做?感谢。
答案 0 :(得分:4)
从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.
答案 1 :(得分:0)
我在这里实施了一个..
{{}}