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

Is one serie of constraints a subset of the other?

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

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

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

@false 的评论是正确的,据我所知:给定两组 SS':如果 SS'的子集,则S'与[=24的补集的交集=]S 应该是空集(S' 之外没有元素是 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' 的补码也可以写成:

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

如果你想要一个更通用的解决方案,你将不得不想出一种方法来找到任意一组约束的补充。请注意,您可以将 Prolog 连词(逗号)用作逻辑 AND,但不能将析取用作 OR。