Z3 4.12.0版本重复声明EnumSort触发异常,是否为缺陷?
重复声明同名EnumSort触发异常:正常行为而非缺陷
这是正常设计行为,并非Z3的缺陷。
Z3的枚举类型(EnumSort)名称属于全局命名空间,一旦用某个名称完成枚举声明,后续再使用相同名称创建枚举就会触发冲突——Z3不允许同一命名空间下存在同名的枚举、类型或函数,这是为了避免符号歧义,保证逻辑一致性。
你提供的代码中,两次调用enum_decl()都会尝试创建名为Color的枚举类型,第二次调用时Z3检测到该名称已被注册,因此抛出enumeration sort name is already declared异常,完全符合Z3的设计规范。
可行的解决方法
如果需要在函数中重复创建枚举类型,可参考以下方案:
- 使用唯一名称:每次调用时生成带唯一标识的名称(比如添加后缀)
from z3 import * count = 0 def enum_decl(): global count count += 1 Color, (red, green, blue) = EnumSort(f'Color_{count}', ['red', 'green', 'blue']) enum_decl() enum_decl() # 不会触发异常 - 用独立上下文隔离:每个
Context拥有独立的符号空间,不同上下文的同名枚举不会冲突from z3 import * def enum_decl(): ctx = Context() Color, (red, green, blue) = EnumSort('Color', ['red', 'green', 'blue'], ctx=ctx) enum_decl() enum_decl() # 不会触发异常 - 先检查再声明:提前判断枚举是否已存在,避免重复创建
from z3 import * def enum_decl(): ctx = main_ctx() # 检查当前上下文是否已存在该枚举 if not any(sort.name() == 'Color' for sort in ctx.enumeration_sorts()): Color, (red, green, blue) = EnumSort('Color', ['red', 'green', 'blue']) enum_decl() enum_decl() # 第二次调用会跳过声明,无异常
内容的提问来源于stack exchange,提问作者Lucent
相关产品推荐
相关产品推荐

