如何逐步使用Z3进行抽象细化

时间:2014-05-21 15:16:19

标签: z3 smt

我目前正在使用Z3 C ++接口来确定系统的抽象 - 系统可以被视为图形。

现在,要确定节点的传出转换,我必须解决以下形式的论坛:

   guard   
&& b_0_0 == predicate_0 && b_0_1 == predicate_1 && ... && b_0_N == predicate_N
&& b_1_0 == predicate1_0 && b_1_1 == predicate1_1 && ... && b_1_N == predicateN_N
&& ...
&& b_M_0 == predicateM_0&& b_M_1 == predicateM_1 && ... && b_M_N == predicateM_N

其中b_j_i是自由变量,而guard和谓词都是整数的布尔公式,例如guard可能是x>y+1b_0_i变量对源进行编码,而其他变量(b_j_i,j> 0)对可能的目标节点进行编码。

解决这个问题一旦运行良好且速度可以接受。然而,问题就出现了。

首先,我需要这个公式的所有解决方案。由于Z3没有AllSat功能,我现在通过首先推送求解器状态并将先前解决方案的否定添加到模型来确定所有解决方案,直到不存在令人满意的估值。最后,我弹出解算器状态,以摆脱我只需要枚举的“否定解决方案”。

在我的分析的某个稍后部分,我可能需要改进抽象系统。这归结为解决由M断言扩展的相同公式:

   guard   
&& b_0_0 == predicate0_0 && b_0_1 == predicate0_1 && ... && b_0_N == predicate0_N && b_0_N+1 == predicate0_N+1
&& b_1_0 == predicate1_0 && b_1_1 == predicate1_1 && ... && b_1_N == predicate1_N && b_1_N+1 == predicate1_N+1
&& ...
&& b_M_0 == predicateM_0 && b_M_1 == predicateM_1 && ... && b_M_N == predicateM_N && b_M_N+1 == predicateM_N+1
显然,希望以某种方式利用Z3的增量性,因为公式的大多数部分已经在某个较早的时间点得到解决。但是,由于枚举所提到的第一个公式的所有解决方案所需的推送和弹出,求解器对象不具有在该较早点处导出的任何信息。假设似乎也不合适(由于必须进行枚举)。

我错过了什么吗?是否有明显的方法来利用增量性?

编辑:我认为可以使用假设来枚举所有解决方案,但我不确定合适的编码可能是什么样子。我想到的一个原始方法是添加一个断言'last_solution == flag'(每个新解决方案的新标志)并使用假设!标志运行下一个检查(这基本上不允许相应的解决方案)。然而,这种方法似乎在求解器的堆栈上产生大量不必要的(从未在后面的检查中使用)断言,即我不能在以后的检查中设置标志的值(具有更多谓词),因为这个标志可能会禁用部分解决方案。

0 个答案:

没有答案