Z3,求解器:在断言堆栈上按空级别,如smtlib2中所定义:push(n = 1)

时间:2013-03-18 21:04:32

标签: push z3 pop solver

目前我正在使用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中的错误还是这种行为正确?

1 个答案:

答案 0 :(得分:1)

此错误已在unstable(正在进行中)分支中修复。 它将在下一个正式版本中提供。在此期间,here是关于如何编译不稳定分支的一些指令。此修复程序也可在nightly buildscodeplex中找到。