目前我正在使用Z3和Python。 我想创建一个断言堆栈,我可以在其中推送一个级别并稍后弹出它。 它应该与推送和弹出操作的任何其他“堆栈”完全一样。 因此,SMTLIB2标准定义了两个函数“push(n)”和“pop(n)”,带有可选的数字n。在我的情况下,n总是1。
但是在Z3中似乎有一些奇怪的行为。 为什么下面的代码导致“索引越界”?
s = Solver()
s.push() # expected: one new level on the stack, reality: emtpy stack
s.pop(1) # expected: stack is empty, reality: exception (index out of bounds)
如果我添加一个断言,Z3按预期工作。
s = Solver()
s.push()
s.add(True) # now there is one level on the stack,
s.pop(1) # pop is successful
即使这样也是正确的:
s = Solver()
s.add(True)
s.push() # now there is one level on the stack,
s.pop(1) # pop is successful
问题是,我不知道,在我的程序中创建了多少级别和多少断言。有可能,根本没有断言,只有一个级别。然后程序会崩溃(或捕获异常)。一个解决方法是添加一些像“True”这样的简单公式作为第一步,但这看起来很难看。
这是Z3中的错误还是这种行为正确?
答案 0 :(得分:1)
此错误已在unstable
(正在进行中)分支中修复。
它将在下一个正式版本中提供。在此期间,here是关于如何编译不稳定分支的一些指令。此修复程序也可在nightly builds的codeplex中找到。