私はSootを使用してJavaでいくつかの非常に単純なプログラム分析/変換を行っていますが、ブール式のいくつかの単純な組み合わせを実行する必要があることに気付きました。したがって、たとえば、分析中に、のような式があり、その式をOR演算子を介し(a < 25) && (b >= 10)
て結合して、のような完全な式を取得したいとします。基本的には、2つのブール式ツリーを1つの式に結合するだけです。さらに、式ツリーを同等の連言標準形のツリーに自動的に変換したい場合があります。(a >=-10)
(a >=-10) || (a < 25) && (b >= 10)
私が持っているもう1つの要件は、簡単に削除できる式がある場合に、式を(必要に応じてカスタムコードを介して)単純化する機能です。たとえば(a < 20) || (a >= 20)
、になりますTRUE
ので(a < 20) = (!(a >= 20))
、いくつかの用語を削除できます。
ブール式ツリーをコード化することは古典的な導入上の問題であることを私は知っています、そして私は以前にそれを実装したことをかなり確信しています(かつて、データ構造クラスのために:))必要です...しかし、これは以前に処理された可能性が高いことを考えると、上記に取り組むために調査する必要があるライブラリに関する推奨事項があるかどうか疑問に思います。おそらく完全に良いものがすでにそこにあるとき、私は車輪を再発明するのが嫌いです。
要約すると、私は次のようなJavaライブラリを探しています。
- ブール式ツリー
- 式の組み合わせ
- 用語の簡略化(これはかなり具体的であるため、「持っていると便利」です)
- CNFへの変換
何かお勧めはありますか?
(注:これらのツリーを評価しないので、各ノードはまたはのような未解決の述語になるvariable != 20
ためfoo >= 50
、評価は必須ではありませんが、ライブラリの一部である場合でも問題はありません。)