Z3 支持AUFBV?

Z3 支持AUFBV?,z3,Z3,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调用很满意,而不管逻辑名称是什么,

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支持它


谢谢

Z3使用
set logic
命令来配置自身。如果SMT脚本不包含
设置逻辑
,则启用所有理论解算器。如果从脚本中删除
set logic
命令,那么Z3将按预期工作

正如你所说,AUFBV的逻辑是可判定的。但是,复杂性非常高(nextime complete)。理论上,基于模型的量词实例化(MBQI)模块保证Z3是该逻辑的决策过程,但由于高度复杂性,Z3在许多脚本中会失败(在没有内存和/或时间的情况下运行)

逻辑AUFBV不在官方支持的逻辑列表中。Z3没有识别它,也没有安装任何理论解算器。因此,要在Z3.1中使用此逻辑,不应使用
set logic
命令

顺便说一句,你并不真的需要数组。它们可以使用量词在UFBV中编码。 在许多情况下,如果使用量词,最好避免使用数组理论。 Z3中的阵列理论求解器针对无量词问题进行了优化


关于诸如
(set logic blarg)
之类的伪命令,我添加了用于显示警告消息的代码,表示逻辑未被识别,Z3将使用所有可用的理论。修改将在Z3.2中提供。我还将AUFBV包括在官方支持的逻辑列表中。

Z3.2已经发布。它解决了这个问题。