【发布时间】:2015-08-03 17:00:54
【问题描述】:
我想设计类似于 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 中实现计数器概念的有效方式吗?在我更复杂的实际问题中,这确实是低效的。
【问题讨论】: