如何检查列表元素之间的约束/这算约束编程吗?
我有很多大小不一的列表,这些列表里包含同一个类的实例,每个实例都有一个属性叫做foo。对于每个列表,我必须遵循一些规则,比如:
- 如果列表里有一个元素的foo是A,那么就不能有foo是[B,C,D]中的任何一个元素。
- 如果列表里有一个元素的foo是X,那么至少要有一个元素的foo是[Y,Z]中的某一个。
- 列表里可以有的foo是BAR的元素数量要在MIN和MAX之间。
把这三条规则结合起来,基本上可以表达我需要的任何类似限制。这有点像软件包中的依赖检查,不过我关注的是数量而不是版本 :)
一个简单的方法可能是:
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-constraint。
1 个回答
4
简单来说,是的,可以用约束编程来检查这个问题。实际上,你是在提供一个解决方案,然后把它和一些规则进行对比,而不是让程序去寻找可能的解决方案。这样做有点过于复杂,尤其是如果你用的是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
总的来说,我觉得除非这些规则变得非常复杂,或者你想要找到解决方案而不仅仅是测试一下,否则还是用代码比较好,而不是用约束编程。