Z3,解算器:按smtlib2:push(n=1)中的定义,在断言堆栈上推一个空级别

Z3,解算器:按smtlib2:push(n=1)中的定义,在断言堆栈上推一个空级别,z3,solver,Z3,Solver,目前,我在Python中使用Z3。 我想创建一个断言堆栈,在这里我可以推送一个级别并在以后弹出它。 它的工作原理应该与其他具有推送和弹出操作的“堆栈”完全相同。 因此,SMTLIB2标准定义了两个功能“push(n)”和“pop(n)”,可选数字为n。在我的例子中,n总是1 但在Z3中似乎有一些奇怪的行为。 为什么下面的代码会导致“索引越界” 如果我添加一个断言,Z3将按预期工作 s = Solver() s.push() s.add(True) # now there is one leve

目前,我在Python中使用Z3。 我想创建一个断言堆栈,在这里我可以推送一个级别并在以后弹出它。 它的工作原理应该与其他具有推送和弹出操作的“堆栈”完全相同。 因此,SMTLIB2标准定义了两个功能“push(n)”和“pop(n)”,可选数字为n。在我的例子中,n总是1

但在Z3中似乎有一些奇怪的行为。 为什么下面的代码会导致“索引越界”

如果我添加一个断言,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中的错误还是行为正确?

此错误已在
不稳定
(正在工作)分支中修复。

它将在下一个正式版本中提供。同时,还有一些关于如何编译不稳定分支的说明。该修复程序也可在中找到。

此错误已在
不稳定
(正在工作)分支中修复。
它将在下一个正式版本中提供。同时,还有一些关于如何编译不稳定分支的说明。此修复程序也可从中获得。

感谢您的帮助。不稳定的分支按预期工作。感谢您的帮助。不稳定的分支按预期工作。
s = Solver()
s.add(True)
s.push()     # now there is one level on the stack,
s.pop(1)     # pop is successful