我正在使用初始化的数组,并执行涉及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文件需要通过。)