[英]How to retrieve the obtained solution in array order when using arrays of BitVec in z3py?
我正在尝试使用 z3 中的 Array 类型解决问题。 因为我需要使用 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 必须仅出现在 numbers[0] 中。
对于您的第一个问题,我首先建议为变量提供一些可读的名称。 chr(i) for i in range(0, 4)
是 4 个不可打印的字符。 最好将chr(i+48)
用于数字 0..9 或chr(i+65)
用于字母 A..Z
以与数组相同的顺序打印结果的最简单方法是: print ([s.model[n].as_long() for n in numbers])
。
对于你的第二个问题,我建议使用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])
哪些输出(在我的测试用例中):
sat
[N3 = 116, N1 = 106, N0 = 100, N2 = 250]
[100, 106, 250, 116]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.