Python 如何检查列表中元素之间的约束/这是约束编程吗?

Python 如何检查列表中元素之间的约束/这是约束编程吗?,python,constraints,constraint-programming,Python,Constraints,Constraint Programming,我有许多可变大小的列表,其中包含属性为foo的同一类的实例,对于每个列表,我必须应用如下规则: 如果有一个元素foo=A,那么[B,C,D]中就不能有foo的元素 如果有一个元素foo=X,则必须至少有一个元素foo在[Y,Z]中 最小和最大元素之间可能存在foo=BAR 结合以上三条规则可能足以表达我所需要的任何类似约束。这有点像在软件包中检查依赖关系,但我有数量,没有版本:) 天真的做法是: R_CONFLICT={ A: [B,C,D] } R_DEPENDS ={ X: [ [Y,Z

我有许多可变大小的列表,其中包含属性为foo的同一类的实例,对于每个列表,我必须应用如下规则:

  • 如果有一个元素foo=A,那么[B,C,D]中就不能有foo的元素
  • 如果有一个元素foo=X,则必须至少有一个元素foo在[Y,Z]中
  • 最小和最大元素之间可能存在foo=BAR
结合以上三条规则可能足以表达我所需要的任何类似约束。这有点像在软件包中检查依赖关系,但我有数量,没有版本:)

天真的做法是:

R_CONFLICT={ A: [B,C,D] }
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W
R_MIN     ={BAR: n, BAZ: m}
R_MAX     ={BAR: o, BAZ: p}
# now just loop over lists to check them..
这是一个安全问题吗?我实际上不需要解决一些问题来得到结果,我需要根据一些约束来验证我的列表,并检查它们是否满足。您将如何对这个问题进行分类以及如何解决它


值得一提的是,我正在用Python编写代码,但我欢迎一个通用编程答案:)如果结果证明我必须深入研究约束编程,我可能会从尝试开始。

简短回答-是的,这可以通过约束编程来检查,实际上,您提供了一个解决方案,并根据约束对其进行检查,而不是让解算器在潜在的域中搜索匹配的解决方案。这使得约束编程过于复杂,尤其是当您使用Python时,它可以很容易地检查这些条件

我在这台机器上没有Python,所以这段代码中可能有输入错误/错误,但它显示了您的目标,而不需要参与约束编程

conflict = set([B, C , D])
foos = set([x.foo for x in list])
if A in foos:
    if len(foos & conflict): #Set intersection
         return false

len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR
基本上,我会说,除非约束变得更加复杂,或者你想找到解决方案而不仅仅是测试,否则我会坚持使用代码而不是约束编程

conflict = set([B, C , D])
foos = set([x.foo for x in list])
if A in foos:
    if len(foos & conflict): #Set intersection
         return false

len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR