BDD 具体例大全

基本論理、しきい値、等価性、比較器、加算器、到達可能性、アクセス制御まで、ROBDD がどのように形を変えるかを大量の例で確認する。

example-driven

0. このレポートの使い方

各カードは 1 つの Boolean 関数、推奨変数順序、その順序での ROBDD 図を示す。root は青、low 枝は破線、high 枝は実線である。

重要なのは「式の見た目」ではなく「変数順序に沿って現れる部分関数の再利用」である。同じ関数でも順序を変えると図も節点数も変わる。
catalog

1. 具体例カタログ

01
vars: 1

定数 0

\(f=0\)

全ての割当で偽。ROBDD は終端 0 だけになる。

02
vars: 1

定数 1

\(f=1\)

全ての割当で真。ROBDD は終端 1 だけになる。

03
vars: 1

リテラル

\(f=x_0\)

最小の非終端節点。low が 0、high が 1。

04
vars: 1

否定リテラル

\(f=\lnot x_0\)

low が 1、high が 0。

05
vars: 2

2 変数 AND

\(f=x_0\land x_1\)

x0=0 で即 0 へ行くため x1 を読まない。

06
vars: 2

2 変数 OR

\(f=x_0\lor x_1\)

x0=1 で即 1。短絡評価に似た形。

07
vars: 2

NAND

\(f=\lnot(x_0\land x_1)\)

AND の終端を反転した形。

08
vars: 2

含意

\(f=x_0\Rightarrow x_1=\lnot x_0\lor x_1\)

x0=0 で常に真、x0=1 のとき x1 を見る。

09
vars: 2

2 変数 XOR

\(f=x_0\oplus x_1\)

両方の分岐で x1 が現れるが low/high の向きが反転する。

10
vars: 2

2 変数同値

\(f=x_0\leftrightarrow x_1\)

XOR の否定。

11
vars: 3

if-then-else

\(f=\operatorname{ITE}(x_0,x_1,x_2)\)

BDD の Shannon 展開そのものを表す典型例。

12
vars: 3

3 変数多数決

\(f=x_0x_1\lor x_0x_2\lor x_1x_2\)

2 個以上が真なら真。

13
vars: 3

3 変数 exactly-one

\(f=\sum_i x_i=1\)

カウンタ制約の最小例。

14
vars: 4

4 変数 at-most-one

\(f=\sum_i x_i\le 1\)

一度 1 を見た後は、残りがすべて 0 でなければならない。

15
vars: 4

4 変数 at-least-two

\(f=\sum_i x_i\ge 2\)

しきい値関数。残り変数数による枝刈りが起きる。

16
vars: 4

4 変数 exactly-two

\(f=\sum_i x_i=2\)

個数制約 BDD は「これまでの 1 の数」を状態として共有する。

17
vars: 3

3 変数 parity

\(f=x_0\oplus x_1\oplus x_2\)

各 level で偶奇状態が 2 つずつ残る。

18
vars: 5

5 変数 parity

\(f=x_0\oplus x_1\oplus x_2\oplus x_3\oplus x_4\)

順序によらず線形サイズだが、毎層 2 状態を持つ。

19
vars: 4

one-hot 4

\(f=\sum_i x_i=1\)

exactly-one の 4 変数版。

20
vars: 3

3 変数全同値

\(f=(x_0=x_1=x_2)\)

000 と 111 だけが真。

21
vars: 5

入れ子条件

\(f=x_0?(x_1\lor x_2):(x_3\land x_4)\)

x0 の分岐で読む変数集合が大きく変わる。

22
vars: 6

4-to-1 MUX

\(f=\mathrm{MUX}_4(s_1s_0;d_0,d_1,d_2,d_3)\)

セレクタを先に読むと小さい。データを先に読むと膨らみやすい。

23
vars: 4

2-bit equality / interleaved

\(f=(a_0\leftrightarrow b_0)\land(a_1\leftrightarrow b_1)\)

対応するビットを隣接させる良い順序。

24
vars: 4

2-bit equality / grouped

\(f=(a_0\leftrightarrow b_0)\land(a_1\leftrightarrow b_1)\)

同じ関数だが、先に A 全体を読んでから B を読む順序。

25
vars: 6

3-bit equality / interleaved

\(f=\bigwedge_{i=0}^2(a_i\leftrightarrow b_i)\)

等価性は各ビットペアを処理して共有できる。

26
vars: 4

2-bit less-than

\(f=A

MSB で決まらない場合だけ LSB を読む。

27
vars: 4

2-bit less-or-equal

\(f=A\le B\)

比較器は辞書式の短絡が BDD に現れる。

28
vars: 2

半加算器 sum

\(s=x\oplus y\)

XOR と同じ。

29
vars: 2

半加算器 carry

\(c=x\land y\)

AND と同じ。

30
vars: 3

全加算器 carry

\(c_{out}=ab\lor a c_{in}\lor b c_{in}\)

3 変数多数決。

31
vars: 3

全加算器 sum

\(s=a\oplus b\oplus c_{in}\)

3 変数 parity。

32
vars: 2

矛盾 CNF

\((x_0\lor x_1)(\lnot x_0\lor x_1)(x_0\lor\lnot x_1)(\lnot x_0\lor\lnot x_1)\)

すべての割当を排除するため終端 0。SAT 判定が root=0 で終わる。

33
vars: 3

Horn 制約

\((\lnot x_0\lor x_1)\land(\lnot x_1\lor x_2)\)

含意チェーン x0⇒x1⇒x2。

34
vars: 3

小さな到達可能性

\(f=e_{13}\lor(e_{12}\land e_{23})\)

1 から 3 へ直接行くか、1→2→3 で行く。

35
vars: 4

2 並列パス信頼性

\(f=(e_{01}e_{13})\lor(e_{02}e_{23})\)

共有パスがない単純なネットワーク信頼性。

36
vars: 5

アクセス制御

\(admin\lor(editor\land owner)\lor(viewer\land public)\)

admin=1 の枝が終端 1 に飛ぶ。

37
vars: 4

隣接競合なし

\(\lnot(ab)\land\lnot(bc)\land\lnot(cd)\)

パスグラフ上の独立集合制約。

38
vars: 5

資源 1 個だけ選択

\(\sum_i r_i=1\)

one-hot 5。状態は「まだ 1 を見ていない」「すでに 1 を見た」に近い。

39
vars: 6

ペア積和

\(f=x_0y_0\lor x_1y_1\lor x_2y_2\)

対応ペアを隣接させると部分関数が早く確定する。

40
vars: 4

共通因子の共有

\(f=x_0x_1\lor x_0x_2\lor x_0x_3=x_0(x_1\lor x_2\lor x_3)\)

x0=0 で即 0、x0=1 で OR に移る。

interactive

2. 順序比較ラボ

例を選び、複数の順序で ROBDD の節点数を比較する。変数数が 6 以下なら全順列を試せる。

選択順序の ROBDD
順序を変えたときの形の変化を見る。
truth table

3. 真理値表ラボ

BDD は真理値表を圧縮したものとも見なせる。以下では選択した例の真理値表と充足割当の割合を表示する。

patterns

4. パターン別の読み方

短絡型

AND、OR、含意、比較器では、一部の枝が早く終端に落ちる。

状態共有型

parity、個数制約、one-hot では「ここまでの状態」が共有される。

対応ペア型

等価性や \(x_i y_i\) の積和は、対応変数を近くに置くと小さい。

セレクタ型

マルチプレクサはセレクタを先に読むと、選ばれるデータ線だけに絞れる。