我正在使用Soot在 Java 中进行一些非常简单的程序分析/转换,我发现自己需要做一些简单的布尔表达式组合。因此,例如,在我的分析过程中,我将有一个表达式 like(a < 25) && (b >= 10)
并且我想(a >=-10)
通过 OR 运算符加入该表达式以获得完整的表达式,例如(a >=-10) || (a < 25) && (b >= 10)
. 基本上,只需将两个布尔表达式树组合成一个表达式。我可能还希望自动将表达式树转换为树的等效合取范式版本。
我的另一个要求是当我们有可以轻松消除的表达式时,能够简化表达式(如果需要,通过自定义代码)。例如(a < 20) || (a >= 20)
归约到TRUE
, since (a < 20) = (!(a >= 20))
, 所以我们可以在进行过程中消除一些项。
我知道编写布尔表达式树是一个经典的介绍性问题,而且我很确定我之前已经实现过它(一次,很久以前,用于数据结构类:))我知道我可以再做一次,如果需要......但鉴于这可能是以前处理过的事情,我想知道是否有关于我应该研究解决上述问题的库的任何建议。当可能已经有一个非常好的轮子时,我讨厌重新发明轮子。
所以总结一下,我正在寻找一个 Java 库,它具有:
- 布尔表达式树
- 表达式的组合
- 术语的简化(这是非常具体的,所以“很高兴”)
- 转换为 CNF
有什么建议吗?
(注意:我不会评估这些树,因此每个节点都将是未解析的谓词,例如variable != 20
or foo >= 50
,因此评估不是必需的,但如果它是库的一部分也没有什么坏处。)