2017-08-10 51 views
0

最小示例如下:给定一组可能的整数[1, 2, 3]使用z3py创建大小为5的任意列表。允许重复。如何获取z3中给定的可能整数集合中的整数列表?

预期的结果是一样的东西[1, 1, 1, 1, 1][3, 1, 2, 2, 3]

如何解决这个问题,以及如何实现“选择”?最后,我想找到所有解决方案,可以通过添加其他约束来解决,如link中所述。任何帮助将非常感激。

回答

0

下面应该工作:

from z3 import * 

def choose(elts, acceptable): 
    s = Solver() 
    s.add(And([Or([x == v for v in acceptable]) for x in Ints(elts)])) 

    models = [] 
    while s.check() == sat: 
     m = s.model() 
     if not m: 
      break 
     models.append(m) 
     block = Not(And([v() == m[v] for v in m])) 
     s.add(block) 

    return models 

print choose('a b c d e', [1, 2, 3]) 
+0

惊人!我看到你不使用任何'数组'或量词,但你只需为每个字段分别定义一个变量并放置约束。很好,谢谢! – Aliman

相关问题