使用in_set / 2约束

时间:2012-04-12 03:29:54

标签: prolog constraints sicstus-prolog clpfd

我正在尝试将约束X用作列表中的值。

来自SICStus Prolog manual

?X in_set +FDSet 

但我无法弄清楚如何将列表转换为FDSet。 我有一个整数列表[2,3,8,9],我想限制变量X的域不在该列表中。我怎么做?感谢。

2 个答案:

答案 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)

我在这里实施了一个..

{{}}