进行数组初始化时,验证时间差异很大

时间:2018-09-19 15:04:51

标签: arrays z3 smt

我正在使用初始化的数组,并执行涉及3个存储的一系列操作,然后执行一个选择,在该选择中,此选择返回的FIXED值(将在下面称为V_A)被复用为以下存储的索引。

我在声明如下的数组中初始化〜400个索引:

(declare-fun my_array0 () (Array (_ BitVec 30) (_ BitVec 32)))

使用下面的语句初始化〜400个索引时,Z3的验证时间约为30秒。

(= (select my_array0 ((_ extract 31 2) (_ bv0123456 32))) a_fixed_value_var)

当我更改仅对包含V_A的索引I_A初始化数组的方式时,我将其替换为下面的语句,验证时间更改为〜1sec。

(= my_array1 (store my_array0 ((_ extract 31 2) (_ bv`I_A index` 32)) `V_A`))

当我将该语句上下移动选择序列(初始化数组)时,验证时间会有所不同:当该语句接近选择序列(在文件中声明)的顶部时,〜10秒语句接近选择序列的底部时为0.1秒。

有人知道为什么验证有如此大的差异,以及如何减轻这种差异吗?

(我现在正在减少问题,但仍有大约1万行的smt文件需要通过。)

0 个答案:

没有答案