Z3 缺少阵列的QF_AUFBV查询模型
我有以下查询(使用SMT-LIB v1.0标准编写): (查询有点多余,但它是自动生成的。) 通过Z3运行此命令,并询问模型,我收到以下消息:Z3 缺少阵列的QF_AUFBV查询模型,z3,Z3,我有以下查询(使用SMT-LIB v1.0标准编写): (查询有点多余,但它是自动生成的。) 通过Z3运行此命令,并询问模型,我收到以下消息: a -> as-array[k!0] constraint1 -> true x -> bv1[32] constraint0 -> true k!0 -> { bv0[32] -> bv0[32] else -> bv0[32] } 这很好,因为根据需要,我有“a”和“x”的值。但是,另一个查询与此类
a -> as-array[k!0]
constraint1 -> true
x -> bv1[32]
constraint0 -> true
k!0 -> {
bv0[32] -> bv0[32]
else -> bv0[32]
}
这很好,因为根据需要,我有“a”和“x”的值。但是,另一个查询与此类似,只是有一个小变化:
(benchmark gametime
:status unknown
:logic QF_AUFBV
:extrafuns ((x BitVec[32]))
:extrafuns ((a Array[32:32]))
:extrapreds ((constraint1 ))
:extrapreds ((constraint0 ))
:formula
(flet ($x37 (and (iff constraint0 (**bvuge** (select a bv0[32]) bv0[32])) (iff constraint1 (= x bv1[32]))))
(and $x37 (and constraint0 constraint1)))
)
这一变化突出显示出来:原来的相等现在是“bvuge”检查。我从Z3收到以下型号:
constraint1 -> true
x -> bv1[32]
constraint0 -> true
我再也没有“a”的作业了。这是故意的吗?如果模型中不存在变量,是否存在我应该假设的变量的“默认”值?(例如,这里的默认值是数组“a”处处为零。)
值得一提的是,这个问题只有在操作为“bvuge”时才会出现。其他(“bvsge”、“bvugt”、“bvsgt”、“bvult”、“bvslt”、“bvule”、“bvsle”)似乎起作用
我再也没有“a”的作业了。这是故意的吗
是的,这是故意的。数组的任何值都将满足该公式。
这是因为约束0:
(bvuge (select a bv0[32]) bv0[32]))
这相当于真的。在无符号比较下,任何位向量值都大于或等于0。
所以“a”的值是a不在乎。啊,谢谢!那么,是否没有办法“强制”一个值(即使是任意的)显示在模型中?
(bvuge (select a bv0[32]) bv0[32]))