如何增量使用Z3进行抽象细化 我现在使用Z3C++接口来确定系统的抽象-系统可以被看作是一个图表。

如何增量使用Z3进行抽象细化 我现在使用Z3C++接口来确定系统的抽象-系统可以被看作是一个图表。,z3,smt,Z3,Smt,现在,要确定节点的传出转换,我必须求解以下形式的forumla: 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_

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

   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+1
b_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'(每个新解决方案的新标志),并使用假设运行下一次检查!标志(基本上不允许相应的解决方案)。但是,这种方法似乎会在解算器堆栈上生成大量不必要的(在以后的检查中从未使用过)断言,也就是说,我不能在以后的检查中(使用更多谓词)设置标志的值,因为这个标志可能会禁用部分解决方案