缺少数组的QF_AUFBV查询模型

时间:2013-01-24 18:37:14

标签: z3

我有以下查询(使用SMT-LIB v1.0标准编写):

(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 (= (select a bv0[32]) bv0[32])) (iff constraint1 (= x bv1[32]))))
(and $x37 (and constraint0 constraint1)))
)

(查询有点多余,但会自动生成。)

通过Z3运行并询问模型,我收到以下内容:

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”)似乎都有效。

1 个答案:

答案 0 :(得分:1)

  

我再也没有“a”的作业。这是故意的吗?

是的,这是故意的。数组的任何值都将满足公式。 这是因为constraint0:

   (bvuge (select a bv0[32]) bv0[32])) 

等同于true。在无符号比较下,任何位向量值都大于或等于0。 所以'a'的价值是无所谓。