优化谓词与启发式算法:提升性能与表达能力
在程序分析和验证领域,谓词处理和搜索启发式算法对于提高算法效率和结果质量至关重要。本文将介绍一系列优化方法,包括谓词的语义处理、新型搜索启发式算法,以及相关的实现细节和评估结果。
谓词的语义处理
Refine 算法在处理谓词时,最坏情况下的运行时间与谓词数量呈指数关系。因此,生成少量相关谓词并在递归调用中进行筛选至关重要。以下是几种优化谓词集合大小的方法:
1. 改进的谓词过滤 :在 Servois 中,初始谓词列表构建后,SMT 求解器会对每个谓词进行两次查询,丢弃恒真或恒假的谓词。在此基础上,我们增加了一层语法过滤,丢弃以下类型的谓词:
- 对两个相同项的自反操作。
- 两个常量之间的操作。
- 已包含的另一个谓词的对称情况。
由于这些过滤操作纯粹基于语法,因此可以节省 SMT 求解的工作量。
2. 利用蕴含关系进行剪枝 :通过语法蕴含规则(如 x > y ⇒ x + n > y + n)确定谓词之间的蕴含关系,计算逻辑蕴含关系的闭包,并将谓词分类到等价类中。这样可以去除冗余谓词,减少谓词集合的大小。
基于逻辑蕴含关系,我们可以构建一个谓词偏序集的格。在搜索过程中,利用这个格信息动态剪枝那些由于选择其他相关谓词而变得冗余的谓词。例如,在 LIA 基准测试 multiVarA ▷◁ multiVarB 中,格可以识别出如 0 > (2x + y) ⇒ (2x + y) ≤ 0 ⇒ 2 > (2x + y) ⇒ (2x + y) ≤ 2 或 0 > (2x + y) ⇒ 0 ̸= (2
超级会员免费看
订阅专栏 解锁全文
423

被折叠的 条评论
为什么被折叠?



