Z3会支持AUFBV吗?
对于以下脚本:
(set-logic AUFBV)
(declare-fun x () (_ BitVec 16))
(declare-const t (Array (_ BitVec 16) (_ BitVec 16)))
(assert (= (select t #x0000) #x0000))
在线Z3演示似乎对set-logic
来电感到满意,但随后又抱怨排序BitVec
和Array
。 (顺便提一下,无论逻辑名称如何,在线演示似乎都对set-logic
调用感到满意,即使是(set-logic blarg)
这样的虚假名称。)
SMT-Lib网站既没有提及UFBV也没有提到AUFBV,但鉴于他们的无量词对应物(QF_UFBV和QF_AUFBV),我希望Z3也能支持AUFBV。
毋庸置疑,阵列在实践中起着非常重要的作用。我认为,鉴于有限性论证,AUFBV逻辑应保持可判定性。看到Z3支持它真的很高兴。
谢谢!
答案 0 :(得分:6)
Z3使用set-logic
命令配置自身。如果SMT脚本不包含set-logic
,则启用所有理论解算器。如果从脚本中删除set-logic
命令,则Z3将按预期工作。
正如你所说,AUFBV逻辑是可判定的。但是,复杂性非常高(NEXPTIME-complete)。理论上,基于模型的量化实例化(MBQI)模块保证Z3是该逻辑的决策过程,但由于高复杂性,Z3将在许多脚本中失败(无内存和/或时间运行)。
逻辑AUFBV不在官方支持的逻辑列表中。 Z3没有认出它,也没有安装任何理论解算器。因此,要在Z3 3.1中使用此逻辑,不应使用set-logic
命令。
关于诸如(set-logic blarg)
之类的虚假命令,我添加了用于显示警告消息的代码,表示逻辑未被识别,并且Z3将使用所有可用的理论。修改将在Z3 3.2中提供。我还将AUFBV列入官方支持的逻辑列表。