次のブール関数があるとします。
or(x, y) := x || y
and(x, y) := x && y
not(x) := !x
foo(x, y, z) := and(x, or(y, z))
bar(x, y, z, a) := or(foo(x, y, z), not(a))
baz(x, y) := and(x, not(y))
ここで、それらから二分決定図を作成したいと思います。私はいくつかの論文を調べましたが、これらのようなネストされた論理式からそれらを構築する方法を見つけることができませんでした.
ブール関数は根付き有向非巡回グラフであると言われています。いくつかの非ターミナル ノードとターミナル ノードがあります。次に、各非終端ノードが、2 つの子ノードを持つブール変数(関数ではない) によってラベル付けされていることを示しています。上記の関数定義から、ブール変数が何であるかわかりません。ノードから子a
またはノードへのエッジは、それぞれノードの 0 または 1 への割り当てb
を表します。同形サブグラフがマージされ、2 つの子が同形であるノードが削除された場合、縮小されたと呼ばれます。これは縮小順序二分決定図 (ROBDD) です。
それから、そして私が遭遇したすべてのリソースから、これらの関数をBDD/ROBDDに変換する方法を理解できませんでした:
foo(1, 0, 1)
bar(1, 0, 1, 0)
baz(1, 0)
あるいは、変換する必要があるのは次のようなものかもしれません:
foo(x, y, z)
bar(x, y, z, a)
baz(x, y)
これを根付き有向非循環グラフにするために何をする必要があるかについての説明を探しています。データ構造がどのように見えるかを知ることも役に立ちます。これだけのようです:
var nonterminal = {
a: child,
b: child,
v: some variable, not sure what
}
しかし、問題は、これらの関数foo
、bar
、およびからグラフを構築する方法baz
です。