Python 在z3py中使用BitVec数组时,如何按数组顺序检索得到的解?

Python 在z3py中使用BitVec数组时,如何按数组顺序检索得到的解?,python,z3,z3py,Python,Z3,Z3py,我正在尝试使用z3中的数组类型解决一个问题。 因为我需要使用BitVec类型,所以我将数组声明为: numbers = [BitVec(chr(i), 8) for i in range(0, 4)] 然后: s = Solver() s.add(numbers[0] == 100) s.add(numbers[1] == numbers[0] + 2) s.add(numbers[3] == numbers[1] + numbers[0]) s.add(numbers[2] == numbe

我正在尝试使用z3中的数组类型解决一个问题。 因为我需要使用BitVec类型,所以我将数组声明为:

numbers = [BitVec(chr(i), 8) for i in range(0, 4)]
然后:

s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[1] == numbers[0] + 2)
s.add(numbers[3] == numbers[1] + numbers[0])
s.add(numbers[2] == numbers[1] - 4)
print(s.check())
print(s.model())
输出:

sat
[ = 98,  = 202,  = 102,  = 100]
但是它不会按顺序打印结果,有没有办法按顺序打印

例如:

[ = 100, = 102, = 98, = 202 ]
我还有一个疑问。有没有办法限制一个数字的频率:

numbers = [BitVec(chr(i), 8) for i in range(0, 4)]

s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[0] + numbers[1] + numbers[2] == 200)
s.add(collections.Counter(numbers)[100] == 1) # something like that
print(s.check())
print(s.model())

要设置数字100,必须只在数字[0]中出现。

对于您的第一个问题,我首先建议为变量提供一些可读的名称<范围(0,4)内的i的code>chr(i)是4个不可打印的字符。最好对数字0..9使用
chr(i+48)
或对字母A..Z使用
chr(i+65)

按与数组相同的顺序打印结果的最简单方法是:
print([s.model[n].as_long()表示n个数字])

对于第二个问题,我建议使用Z3的
Sum
函数。例如:

numbers = [BitVec('N'+chr(i+48), 8) for i in range(0, 4)]
s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[0] + numbers[1] + numbers[2] == 200)
s.add(Sum([If(n == 100, 1, 0) for n in numbers]) == 1)
print(s.check())
m = s.model()
print (m)
print ([m[n].as_long() for n in numbers])
哪些输出(在我的测试用例中):


对于第一个问题,请参阅可能的副本。在堆栈溢出问题上,最好在不同的线程中提出不同的问题。对于频率:您需要显式计数并在其上声明Pb约束。我如何实现计数器并在其上声明约束?您尝试了什么?请将其表述为一个单独的问题,并向我们展示您尝试了什么以及哪里出了问题。感谢您的回答,我在末尾使用了
numbers=[BitVec('{:2}'。格式(I),8)表示范围(32)]
,在模型准备就绪时,我对值进行了排序:`m=s.model();model=sorted([(d,m[d]),对于m中的d,key=lambda x:str(x[0]))`
sat
[N3 = 116, N1 = 106, N0 = 100, N2 = 250]
[100, 106, 250, 116]