我使用Z3的PDR引擎来证明转换系统中的不变量。 当转换系统包括必须通过以达到特定状态的计数器循环时,性能会很慢。
在下面的源代码中,您将看到一个包含3个状态和3个转换的转换系统示例,该转换使用Z3 Fixedpoint Homepage上的Transition System Python类实现。在最后一行中,存在从状态L0开始到达状态L2的查询。因此,转换t2必须经过y次。
如果我初始化y == 10,则快速计算答案。但是初始化y == 1000时性能很慢。
L0 = L.L0
L1 = L.L1
L2 = L.L2
y=Int('y')
i = Int('i')
state = Const('state', L)
t1 = { "guard" : state == L0,
"effect" : [ L1, i ] }
t2 = { "guard" : And(state == L1),
"effect" : [ L1, i+1 ] }
t3 = { "guard" : And(state == L1,i>y),
"effect" : [ L2, i]}
ptr = TransitionSystem( And(state == L0, i == 0, y==10),[t1, t2, t3],[state, i])
ptr.query(state==L2)
是否有可能以其他方式计算从L0到L2的路径,Z3实现更好的性能?
答案 0 :(得分:2)
对于您的示例,目前在Z3中没有更快的方法。 Z3的实现大致花费了二次开销 当它试图推动时,反例循环的深度 (同样)展开深度的属性。
一般来说,Z3的PDR引擎并不太好 适合规划问题。有点好的时候 确定没有痕迹存在。