z3py:如何在z3中实现计数器?

时间:2015-08-03 17:00:55

标签: counter z3 smt z3py

我想在Z3py中设计类似于计数器的逻辑。

如果编写python脚本,我们通常会定义一个变量“counter”,然后在必要时继续增加它。但是,在Z3中,没有变体。因此,我不是定义变体,而是定义该变体的痕迹。

这是一个示例代码。假设有一个大小为5的数组“myArray”,并且数组中的元素是1或2.我想声明一个约束,即“myArray”中必须有两个“2”

from z3 import *

s = Solver()
myArray = IntVector('myArray',5)
for i in range(5):
    s.add(Or(myArray[i]==1,myArray[i]==2))
counterTrace = IntVector('counterTrace',6)
s.add(counterTrace[0]==0)
for i in range(5):
    s.add(If(myArray[i]==2,counterTrace[i+1]==counterTrace[i]+1,counterTrace[i+1]==counterTrace[i]))
s.add(counterTrace[5]==2)
print s.check()
print s.model()

我的问题是,这是在Z3中实现计数器概念的有效方法吗?在我真正的问题中,这更复杂,这实在是效率低下。

1 个答案:

答案 0 :(得分:1)

您可以这样做,但在myArray[i] == 2 ? 1 : 0上创建总和要容易得多。这样你就不需要断言任何东西而且你正在处理普通表达式。