【发布时间】:2019-09-01 17:21:25
【问题描述】:
我正在尝试使用 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] 中。
【问题讨论】:
-
第一个问题请参见stackoverflow.com/questions/52100801/…。在堆栈溢出的不同线程中提出不同的问题总是最好的。对于频率:您需要明确计算并对其声明 Pb 约束。
-
我怎样才能实现一个计数器并断言它的约束?
-
你试过什么?请将其表述为一个单独的问题,并向我们展示您尝试了什么以及哪里出了问题。