一系列约束是另一组的子集吗?

时间:2015-05-18 13:04:00

标签: prolog constraints subset

我有两个系列的约束S和S',它们描述了可能无限大的集合。比如说Sx <= 10 and y <= xS'x <= 20 and y <= 20。 现在我想知道S是否是S'的一个子集?

我想我可以尝试解决类似:S' and not (S and S')的问题,如果它找不到解决方案S是S'的子集。

我如何把它放在prolog中,这是一个可靠的解决方案吗? 我正在使用gprolog但我可以切换到另一个实现。

1 个答案:

答案 0 :(得分:1)

@false的评论是正确的,据我所知:给定两组 S S &#39;:如果 S S &#39;的一个子集,然后是 S &#39;的补集的交集。和 S 应该是空集( S &#39;之外没有 S 的元素)。

如果处理整数,似乎constraint programming over finite domains应该可以做到。使用SWI-Prolog 7.3,手动完成示例,我得到:

?- use_module(library(clpfd)).
true.

?- \+ ( X #=< 10, Y #=< X, #\ X #=< 20 #\/ #\ Y #=< 20 ).
true.

第二个查询应为:

\+ ( % succeed if no solutions
    X #=< 10, Y #=< X, % set S and...
    #\ X #=< 20 #\/ #\ Y #=< 20 % complement of set S' (De Morgan's Law)
).

我认为 S &#39;的补充。也可以写成:

\# (X #=< 20 #/\ Y #=< 20)

如果您想拥有更通用的解决方案,则必须找到一种方法来查找任意一组约束的补充。请注意,可以使用Prolog结合(逗号)作为逻辑AND,但不能将析取作为OR使用。