声明在其范围之外仍然有效的符号

时间:2011-09-07 17:07:59

标签: scope declaration symbols z3

Z3 2.x具有符号声明未被弹出的特征(好吧,可能更确切地说是错误),例如Z3 2.x接受以下代码:

(push)
(declare-fun x () Int)
; Assumptions made in this scope will be popped correctly
(pop)
(assert (= x x))

Z3 3.x不再接受此代码(“未知常量”)。

有没有办法恢复旧的行为?或者另一种方式如何在范围内声明符号,使声明(只有声明,而不是假设)是全局的,即不弹出?

1 个答案:

答案 0 :(得分:0)

是的,在Z3 2.x中,所有声明都是全球性的。我们在Z3 3.x中更改了此行为,因为SMT-LIB 2.0标准规定所有声明都应该作用域。 您可以使用选项:global-decls恢复旧行为。

(set-option :global-decls true)
(push)
(declare-fun x () Int)
(pop)
(assert (= x x))