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

标签 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 不再接受此代码(“未知常量”)。

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

最佳答案

是的,在 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))

关于scope - 声明在其范围之外仍然有效的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337783/

相关文章:

ruby-on-rails - 如何在复杂的 Rails has_many 作用域中进行外部连接?

javascript - 如何更改 if 语句中变量的值

c - 在 C 中,如果在 block 范围内声明的对象没有链接,为什么没有 "extern"的 main() 中的函数声明有效?

macros - 从 CL 宏中的字符串创建类访问器名称

android - 当我在此页面中声明方法时,为什么这段代码会给我一个 "Cannot find symbol"错误?

c - typedef 和变量名

c++ - 混合外部和常量

objective-c - 在 switch 语句中声明变量

枚举声明中的 C++ 变量声明

unicode - 卢比符号在 Firefox 中不起作用