[1. d-DNNFのファイル出力の方法]
gpmc の実行時に，-ddnnfオプションと-nnfoutオプションを付ける．

$ ./gpmc -mode=2 -ddnnf -nnfout=test.nnf test.cnf

test.nnf というファイル名でファイル出力される．


[2. d-DNNFファイルの内容について]
大きく2つのパートに分かれている．
(a) 前処理の簡単化前後の投射変数の対応関係についての情報
(b) 簡単化後のCNF式に対するd-DNNF出力（投射モデル集合を表現するd-DNNF）


<(a) 前処理の簡単化前後の投射変数の対応関係についての情報>

(i) ヘッダ
p vmap [元CNFの投射変数の数] [簡単化後の投射変数の数] [値が確定した変数の数] [自由変数群の数] [従属変数の数]


(ii) 値が確定した投射変数（a から始まる行．1行のみ．）
例えば，
a -1 2 0
の場合，どのモデル（式を真にする割り当て）においても
元のCNF式の変数 1 は 偽，
           変数 2 は 真
という割り当てしかありえないことを表している．


(iii) 自由な投射変数群の数（f から始まる行．複数行あり．）
例えば，
f 1 -2 3 0
f -4 5 0
という2行が出力されている場合，
変数1, 2, 3 の３つの変数は他の変数への割り当てと独立して真偽のどちらも割り当てることが可能．
ただし，
- 変数1が真のとき，変数2は偽，変数3は真
-        偽のとき，変数2は真，変数3は偽
と同期しないといけない．
変数4, 5についても同様に，
- 変数4が真のとき，変数2は偽，変数3は真
-        偽のとき，変数2は真，変数3は偽

モデルの数だけを求めるときは，
fから始まる行数がn行あれば，d-DNNFの計数結果を単に2^n倍すればよい．


(iv) 従属変数（d から始まる行．1行のみ．）
d 1 2 3 0
ならば，元のCNF式の投射変数 1, 2, 3 は従属変数であるため削除されている．つまり，
他の変数の割り当てが決まれば，変数1, 2, 3 の割り当ては一意に決まることがわかっている．
変数1, 2, 3 以外の変数への割り当て（部分モデル）は列挙可能である．
変数1, 2, 3 へ具体的にどんな値が割り当たるのかについてはd-DNNFだけからではわからない．
完全な割り当てにするために変数1, 2, 3への割り当て補完するためには，
部分割り当てを仮定してCNF式に対するSAT判定を行うなどの処理が必要になる．


(v) 簡単化前後のCNF式の投射変数の対応関係
v 123 1		/* 元のCNF式での投射変数123 は簡単化後の変数1の正リテラル と一致 */
v 124 2		/*              投射変数124 は          変数2の正リテラル と一致 */
v 125 -1        /*              投射変数125 は          変数1の負リテラル と一致 */
...



<(b) 簡単化後のCNF式に対するd-DNNF出力>

(i) ヘッダ
nnf [ノード数] [辺の数]


!! ヘッダの次の行を0行目と考える．各ノードのIDは何行目かに対応する．!!

(ii) リテラルノード
L 1		/* 変数1の正リテラルノード */
L -1		/* 変数1の負リテラルノード */
...

(iii) OR ノード

O 123 2 10 11

という行であれば，以下のようなORノードを表す．
- 簡単化後の変数123の決定に対応する
- IDが10, 11 である２ノードを子ノードにもつ


(iv) AND ノード
A 3 10 11 12

という行があれば，以下のようなANDノードを表す．
- 子ノードの数は 3
- 子ノードは，IDが10, 11, 12である3ノード．

