一组约束是另一组的子集吗?
Is one serie of constraints a subset of the other?
我有两个系列的约束 S 和 S',它们描述了可能无限大的集合。例如 S
:x <= 10 and y <= x
和 S'
:x <= 20 and y <= 20
。
现在我想知道 S
是否是 S'
的子集?
我想我可以尝试解决类似的问题:S' and not (S and S')
,如果找不到解决方案 S 是 S' 的子集。
我怎么把它放在序言中,这是一个可靠的解决方案吗?
我正在使用 gprolog 但我可以切换到另一个实现。
@false 的评论是正确的,据我所知:给定两组 S 和 S':如果 S是S'的子集,则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。
我有两个系列的约束 S 和 S',它们描述了可能无限大的集合。例如 S
:x <= 10 and y <= x
和 S'
:x <= 20 and y <= 20
。
现在我想知道 S
是否是 S'
的子集?
我想我可以尝试解决类似的问题:S' and not (S and S')
,如果找不到解决方案 S 是 S' 的子集。
我怎么把它放在序言中,这是一个可靠的解决方案吗? 我正在使用 gprolog 但我可以切换到另一个实现。
@false 的评论是正确的,据我所知:给定两组 S 和 S':如果 S是S'的子集,则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。