[英]Z3, solver: push an empty level on assertion-stack, as defined in smtlib2: push(n=1)
目前,我正在使用Z3和Python。 我想创建一个断言堆栈,在其中可以推入一个级别并稍后将其弹出。 它应该与带有推入和弹出操作的任何其他“堆栈”完全一样。 因此,SMTLIB2标准定义了带有可选数字n的两个函数“ push(n)”和“ pop(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中的错误还是此行为正确?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.