(57)【要約】【課題】論理関数をコンパクトかつ扱いやすい形で表現する手法において、ＳＤＤよりもさらに小さな表現を実現する表現形を得る技術を提供する。【解決手段】所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置において、前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、  残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備える。【選択図】図５
2020135305.tif 000002
【特許請求の範囲】
【請求項１】
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備える
データ生成装置。
【請求項２】
予め定められた規則に従って、前記順序木の各節点に節点番号を付与し、前記順序木の各辺の両端のノードに付された前記節点番号の差分に基づいて前記順序木の中で構造が同一な部分木を特定する前処理部をさらに備え、
前記構築部は、前記前処理部で特定した構造が同一な部分木を用いて、前記構造が同一な複数の部分構造を特定する
請求項１記載のデータ生成装置。
【請求項３】
前記構築部は、前記論理関数に対応するＳＤＤを表すグラフ構造データを入力として、
前記入力されたグラフ構造データ中にリテラルを表すデータが含まれる場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分におきかえるとともに、
前記入力されたグラフ構造データ中に他の分解ノードへのポインタが含まれる場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先が、当該既に構築されたグラフ構造データの情報格納先となるようにポインタを変更する
請求項２記載のデータ生成装置。
【請求項４】
前記構築部は、前記順序木により特定される変数の分解の順序に従い、各変数の分解に対応する前記グラフ構造データを生成するものであり、
前記グラフ構造データは、その分解の要素がリテラルの場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分の値を格納し、
その分解の要素が定数の場合は定数を格納し、
その分解の要素が他の分解を参照するものである場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先を当該既に構築されたグラフ構造データの情報格納先を指すポインタの情報を格納し、そうでない場合には、前記他の分解に対応するグラフ構造データを作成すると共に当該他の分解に対応するグラフ構造データの情報格納先を指すポインタの情報を格納することにより生成される
請求項２記載のデータ生成装置。
【請求項５】
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置が実行するデータ生成方法であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築ステップ、を備える
データ生成方法。
【請求項６】
所定の木構造に従って論理関数の分解を表現するグラフ構造のデータ構造であって、
前記所定の木構造における葉の変数に対応する要素の値を、当該葉に対応する前記所定の木構造における節点の節点番号と当該要素を持つノードが従う前記所定の木構造における節点の節点番号との差とし、
ポインタを有する要素の値を、当該ポインタが指す先のノードが従う前記所定の木構造の節点の節点番号と当該要素を持つノードが従う前記所定の木構造の節点の節点番号との差、及び当該ポインタとした
データ構造。
【請求項７】
コンピュータを、請求項１ないし４のうちいずれか１項に記載のデータ生成装置の各部として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、論理関数をコンパクトかつ扱いやすい形で表現する知識コンパイレーションに関連するものである。
【背景技術】
【０００２】
知識コンパイレーションとは、論理関数をコンパクトかつ扱いやすい形で表現する手法に関する分野である。ここで「扱いやすい」というのは、その表現形の下で、論理関数に関する問い合わせ（以下、クエリとよぶ）や、他の論理関数との論理演算が高速にできる、という意味である。
【０００３】
このような表現形は、集積回路の論理設計や検証で昔から用いられている他、ベイジアンネットワークによる確率推論や、通信ネットワークの信頼性の最大化など数理最適化にも用いられる。そのような表現形は多数提案されているが、中でも非特許文献１の項分岐決定図（Sentential Decision Diagram、以下ＳＤＤとよぶ）は、コンパクトさと扱いやすさを両方備えており、近年幅広い応用分野で実際に使われている。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】Adnan Darwiche. SDD: a new canonical representation of propositional knowledge bases. In Proceedings of the Twenty-Fifth AAAI Conference on Artificial Intelligence, pp. 819-826, 2011.
【非特許文献２】Randal E. Bryant. Graph-based algorithms for Boolean function manipulation. IEEE Transactions on Computers, Vol. C-35, pp. 677-691, 1986.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
知識コンパイレーションで考えられる論理関数の表現形は、ひとたびある論理関数を表現するものを作ってしまえば、その論理関数に関するクエリを解いたり、他の論理関数と組み合わせたりする操作が、その表現形のままでできる。しかし、論理関数をその表現形で表現したときの大きさがどの程度になるかは一般にはわからない。
【０００６】
実際、論理関数によっては表現のサイズが非常に大きくなってしまい、計算機のメモリに載らなくなってしまう例が存在する。また、例えメモリに載ったとしても、表現のサイズが大きいために種々のクエリや論理関数との組み合わせ演算に時間がかかってしまうことがある。そこで、なるべくサイズが小さくなり、かつクエリを解いたり他の論理関数と組み合わせたりする操作がより高速になるような表現形を作り出す技術が検討されている。
【０００７】
非特許文献１のＳＤＤは、非特許文献２の二分決定図（Binary Decision Diagram、以下ＢＤＤとよぶ）の構造を一般化して、ＢＤＤと同様な機能性（クエリや他の論理関数との組み合わせへの対応）を備えつつＢＤＤよりも省サイズを実現したデータ構造である。しかし、ＳＤＤをもってしてもまだサイズが大きくなってしまう論理関数は多数存在する。そこで、ＳＤＤと同様の機能性を有しつつ、ＳＤＤよりもさらに小さな表現を実現する表現形が必要とされている。
【０００８】
本発明は上記の点に鑑みてなされたものであり、論理関数をコンパクトかつ扱いやすい形で表現する手法において、ＳＤＤよりもさらに小さな表現を実現する表現形を得る技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
開示の技術によれば、所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備えるデータ生成装置が提供される。
【発明の効果】
【００１０】
開示の技術によれば、論理関数をコンパクトかつ扱いやすい形で表現する手法において、ＳＤＤよりもさらに小さな表現を実現する表現形を得る技術が提供される。
【図面の簡単な説明】
【００１１】
【図１】ＳＤＤを説明するための図である。
【図２】第１の実施の形態におけるデータ構造変換装置１００の構成図である。
【図３】装置のハードウェア構成の例を示す図である。
【図４】前処理部Ｍ０２の全体処理フローである。
【図５】第１の実施の形態における動作の例を示す図である。
【図６】ステップＳ０２３におけるアルゴリズムの例を示す図である。
【図７】変換部Ｍ０３の動作に対応するアルゴリズムの例を示す図である。
【図８】構文木の例を示す図である。
【図９】第２の実施の形態におけるデータ構造変換装置１００の構成図である。
【図１０】構築部Ｍ１３の動作に対応するアルゴリズムの例を示す図である。
【図１１Ａ】構築部Ｍ１３の動作に対応するアルゴリズムの例を示す図である。
【図１１Ｂ】構築部Ｍ１３の動作に対応するアルゴリズムの例を示す図である。
【図１１Ｃ】構築部Ｍ１３の動作に対応するアルゴリズムの例を示す図である。
【図１２】構築部Ｍ１３の動作に対応するアルゴリズムの例を示す図である。
【図１３】モデルカウントのアルゴリズムの例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施の形態（本実施の形態）を説明する。以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。
【００１３】
（ＳＤＤについて）
本実施の形態では、ＳＤＤの構造を改良した構造を提供するものであるので、まずはＳＤＤについて説明する。
【００１４】
まず、論理関数とは、真（ｔｒｕｅ）か偽（ｆａｌｓｅ）の二値をとる変数を複数引数にとり、真か偽のどちらかの値を返す関数である。論理関数ｆが引数にとる変数たちをＸ、その分割をＹ、Ｚとすると、ｆは、Ｙの変数のみからなる部分論理関数ｐ１，...，ｐｎとＺの変数たちのみからなる部分論理関数ｓ１，...，ｓｎを用いて下記のように分解することができる。
【００１５】
ｆ（Ｘ）＝［ｐ１（Ｙ）∧ｓ１（Ｚ）］∨・・・∨［ｐｎ（Ｙ）∧ｓｎ（Ｚ）］
ここで、Ａ∧Ｂは論理積（ＡかつＢ）、Ａ∨Ｂは論理和（ＡまたはＢ）である。特にここでは、ｐ１，...，ｐｎが互いに素、すなわち、ｐｉ（Ｙ）とｐｊ（Ｙ）が同時に真となるようなｉ≠ｊとＹの変数たちへの真偽の割り当てが存在しないような分解を考えることにする。なお、このような分解は常に可能である。
【００１６】
このような分解を再帰的に行うことで、コンパクトかつ扱いやすい表現形を実現したのがＳＤＤである。このとき、どのように変数を分割してゆくかを定めるのがｖｔｒｅｅとよばれる木構造である。ｖｔｒｅｅは、最も下にあるノード（以下、葉とよぶ）の各々が１つの変数に対応し、それ以外のノード（以下、内部節点とよぶ）の各々はエッジで繋がれた下のノード（以下、子ノードとよぶ）をちょうど２つ持つような木構造である。各々の内部節点は、変数を、左の子ノード以下にある葉たちに対応する変数と、右の子ノード以下にある葉たちに対応する変数に分割することを表す。なお、ｖｔｒｅｅのノードを「節点」と称してもよい。
【００１７】
ｖｔｒｅｅの例を図１（ａ）に示す。このｖｔｒｅｅは、まず４つの変数｛Ａ，Ｂ，Ｃ，Ｄ｝を左側の｛Ａ，Ｂ｝と右側の｛Ｃ，Ｄ｝に分割し、次いで左側の｛Ａ，Ｂ｝をさらに｛Ｂ｝と｛Ａ｝に、右側の｛Ｃ，Ｄ｝をさらに｛Ｄ｝と｛Ｃ｝に分割することを表す。ｖｔｒｅｅの各ノードには、図１（ａ）のように番号をつけておく。
【００１８】
ｖｔｒｅｅを用いると、ＳＤＤとそれが表す論理関数は次のように再帰的に定義できる。「ｖｔｒｅｅ  ｖに従うＳＤＤ」は、次の３種類のうちのいずれかである。ここで、ＳＤＤ  αに対し、αが表す論理関数を＜α＞と表す。
【００１９】
【数１】
2020135305.tif 000003
は、それ自体がＳＤＤである。ここで、
【００２０】
【数２】
2020135305.tif 000004
すなわち恒真関数、
【００２１】
【数３】
2020135305.tif 000005
すなわち恒偽関数である。これらのＳＤＤは以下では定数とよぶ。
【００２２】
・変数Ｘに対し、ｖが変数Ｘに対応する葉であるならば、Ｘや¬Ｘはｖに従うＳＤＤである。＜Ｘ＞＝Ｘ（Ｘが真ならば真、そうでなければ偽という関数）、＜¬Ｘ＞＝¬Ｘ（Ｘが真なら偽、そうでなければ真という関数）である。これらのＳＤＤは以下ではリテラルとよぶ。
【００２３】
・ｐ１，...，ｐｎはｖの左の子ノード以下に従うＳＤＤで、＜ｐ１＞，...，＜ｐｎ＞は互いに素、ｓ１，...，ｓｎはｖの右の子ノード以下に従うＳＤＤとする。このとき、これらを各々ペアにした｛（ｐ１，ｓ１），...，（ｐｎ，ｓｎ）｝はｖに従うＳＤＤである。このＳＤＤは（＜ｐ１＞∧＜ｓ１＞）∨...∨（＜ｐｎ＞∧＜ｓｎ＞）という論理関数を表す。このようなＳＤＤを以下では分解ノードとよぶ。
【００２４】
計算機上では、定数やリテラルは定数長のデータとしてそのまま表現され、分解ノードは、従うｖｔｒｅｅのノード番号と、配列（ｐ´１，ｓ´１），...，（ｐ´ｎ，ｓ´ｎ）との組で表現される。ここで、配列の各要素（ｐ´ｉ，ｓ´ｉ）は、分解の１つのペア（ｐｉ，ｓｉ）を表していて、もしｐｉやｓｉが定数やリテラルのＳＤＤならばそれがそのままｐ´ｉやｓ´ｉに格納され、分解ノードならばｐ´ｉやｓ´ｉはそのノードへのポインタである。
【００２５】
図１（ｂ）は、論理関数ｆ＝（Ａ∧Ｂ）∨（Ｂ∧Ｃ）∨（Ｃ∧Ｄ）を表す、図１（ａ）のｖｔｒｅｅに従うＳＤＤの例を図示したものである。図中では各分解ノードは丸で表現され、それが従うｖｔｒｅｅのノード番号は丸の中に書かれている。また、分解ノードがもつ各ポインタペアは丸から伸びる矢印で表現される。図１（ｂ）において、各分解ノードから伸びる各矢印の先にある２つの四角の組がペア（ｐｉ，ｓｉ）に相当する。２つの四角のうち左側の四角がｐｉに相当し、右側の四角がｓｉに相当する。
【００２６】
図１（ｂ）のＳＤＤでは、関数ｆは最初に（（¬Ａ∧Ｂ）∧Ｃ）∨（（Ａ∧Ｂ）∧ｔｒｕｅ）∨（¬Ｂ∧（Ｃ∧Ｄ））という形で｛Ａ，Ｂ｝と｛Ｃ，Ｄ｝に分解されている。同様に、図１（ｄ）は、論理関数ｆ＝（Ａ∧Ｂ）∨（Ｃ∧Ｄ）を表す、図１（ｃ）のｖｔｒｅｅに従うＳＤＤの例である。
【００２７】
ＳＤＤは次のような操作ができる。論理関数ｆに対して、ｆをｔｒｕｅにするような、変数へのｔｒｕｅとｆａｌｓｅの割り当て方の総数をｆのモデルカウントとよぶ。ＳＤＤが与えられたときに、そのＳＤＤが表す論理関数のモデルカウントを計算するのはＳＤＤサイズに比例した時間でできる。論理関数のモデルカウントはベイジアンネットワークによる確率推論や、ネットワーク信頼性の推定などに応用がある。
【００２８】
次に、論理関数ｆとｇを論理和∨や論理積∧などの演算で組み合わせることも、ＳＤＤのままで可能である。より具体的には、関数ｆを表すＳＤＤ  αと関数ｇを表すＳＤＤ  βが与えられれば、αとβが同じｖｔｒｅｅに従う限り、ｆ∨ｇやｆ∧ｇなどの関数を表すＳＤＤをαとβから効率的に作れる。この操作は論理関数からＳＤＤを作る際に直接使えるほか、集積回路などのシステムの論理設計や検証でも頻繁に用いられる。
【００２９】
ＳＤＤが小さな表現を達成するポイントの一つに、もし分解の途中で全く同じ論理関数が部分関数として複数出てきたとしても、その論理関数を表すＳＤＤは一つだけ作ればよい、という点が挙げられる。これを部分構造の共有とよぶ。図１（ｄ）のＳＤＤでは、番号６がついた分解ノードはＣ∧Ｄという論理関数を表しているが、このノードは２箇所から（ポインタで）参照されている。これは、論理関数を分解する途中でＣ∧Ｄという関数が２回出てきたことを意味するが、この場合でも、Ｃ∧Ｄを表現する分解ノードは一つあればよい。
【００３０】
しかし、前述したように、ＳＤＤをもってしてもまだサイズが大きくなってしまう論理関数は多数存在する。そこで、ＳＤＤと同様の機能性を有しつつ、ＳＤＤよりもさらに小さな表現を実現する表現形が必要とされている。以下、そのような表現形を提供する技術を本発明の実施の形態として説明する。
【００３１】
（実施の形態の概要）
本実施の形態では、ＳＤＤの構造を考える際に、全く同じ論理関数が出てきた場合に部分構造の共有を起こすのに加えて、ある特定の種類の変数の置き換えによって同じ論理関数を表現するようになる場合にも部分構造の共有を起こすように、表現形を改良する。これにより、従来のＳＤＤと比べて部分構造の共有を起こせる場所が増えるため、ＳＤＤより小さな論理関数の表現を得られる。
【００３２】
これを可能にするために、本実施の形態では、ＳＤＤが従うｖｔｒｅｅノード番号を差分的に管理することとしている。この技術により、従来のＳＤＤでは共有できなかった、形は同じだが変数の名前が異なる部分構造も、共有できるようになって表現のサイズが削減できる。また、ＳＤＤと同様の機能性を担保できる。特に、この技術を導入したことにより新たに共有が起こった部分構造を再び解（ほど）くことなく、論理関数に関するクエリを解いたり、他の論理関数と組み合わせたりできる。
【００３３】
＜"ある特定の種類の変数の置き換え"について＞
ここで、本実施の形態に係る技術のポイントである「ある特定の種類の変数の置き換え」について説明する。例えば、図１（ｂ）のＳＤＤでは、下側中央の番号１がついたノードはＡ∧Ｂという論理関数を表し、下側右の番号５がついたノードはＣ∧Ｄという論理関数を表す。
【００３４】
また、図１（ａ）のｖｔｒｅｅで、１番のノード以下の部分構造（以下、ｖｔｒｅｅのあるノード以下の部分構造をあるノードの部分木とよぶ）と５番のノードの部分木は変数以外は全く同じ構造をしており、ＢをＤ、ＡをＣに置き換えることによって１番の部分木を５番の部分木に書き換えられる。
【００３５】
ここで、同様の変数の置き換えをＡ∧Ｂという論理関数に対して行うと、Ｃ∧Ｄとなる。さらに、図１（ｂ）のＳＤＤで下側中央の番号１のノード以下の構造に同様の変数の置き換え（Ｂ→Ｄ、Ａ→Ｃ）を行うと、下側右の番号５のノード以下の構造そのものが得られる。このように、ある２つの分解ノードについて、従うｖｔｒｅｅの構造が一致して、そこから導かれる変数の置き換えの下で同一な論理関数を表しているならば、それらの分解ノードは変数の名前以外全く同じ構造を有している。そのような２つの分解ノードを、以下では合同である、とよぶことにする。図１（ｂ）のＳＤＤで下側中央の１番のノードと下側右の５番のノードは合同である。
【００３６】
＜ＶＳ−ＳＤＤについて＞
上記のような合同な分解ノードを一つにまとめて、部分構造の共有を起こさせるように改良したＳＤＤが、本実施の形態における変数シフトＳＤＤ（Ｖａｒｉａｂｌｅ  Ｓｈｉｆｔ  ＳＤＤ、以下ＶＳ−ＳＤＤとよぶ）である。ＶＳ−ＳＤＤの技術は以下の通りである。
【００３７】
ＳＤＤでは、各分解ノードは従うｖｔｒｅｅノードの番号を明示的に保持するとともに、各リテラルはそのまま保持されている。しかし、合同な分解ノードは違うｖｔｒｅｅノードに従っており、それ以下の部分構造中のリテラルも異なるので、もし合同な分解ノードを一つにまとめるのであれば、これらの情報は明示的に保持してはならない。これを解決する技術が、従うｖｔｒｅｅノードの番号を「差分的に」保持するという手法であり、ＶＳ−ＳＤＤの技術の原型である。
【００３８】
以降、本発明の実施に形態として、第１の実施の形態と第２の実施の形態を説明する。第１の実施の形態では、まずＶＳ−ＳＤＤの構造について説明しながら通常のＳＤＤをＶＳ−ＳＤＤに変換する手順について説明する。第２の実施の形態では、論理関数を直接ＶＳ−ＳＤＤの表現形に変換する手順ついて説明する。
【００３９】
（第１の実施の形態）
＜装置構成＞
図２は、第１の実施の形態におけるデータ構造変換装置１００の機能構成図である。データ構造変換装置１００は、通常のＳＤＤをＶＳ−ＳＤＤに変換する装置である。図２に示すとおり、データ構造変換装置１００は、入力部Ｍ０１、前処理部Ｍ０２、変換部Ｍ０３、出力部Ｍ０４を有する。各部の動作については後述する。なお、第１、第２の実施の形態では、あるデータ構造を変換してＶＳ−ＳＤＤを生成するので、「データ構造変換装置」と称しているが、グラフ構造のデータであるＶＳ−ＳＤＤを生成する装置であるのでこれを「データ生成装置」と称してもよい。
【００４０】
第１の実施の形態におけるデータ構造変換装置１００は、例えば、コンピュータに、本実施の形態で説明する処理内容を記述したプログラムを実行させることにより実現可能である。このようにコンピュータとプログラムでデータ構造変換装置を実現できる点は第２の実施の形態でも同様である。
【００４１】
データ構造変換装置１００は、コンピュータに内蔵されるＣＰＵやメモリ等のハードウェア資源を用いて、当該データ構造変換装置１００で実施される処理に対応するプログラムを実行することによって実現することが可能である。上記プログラムは、コンピュータが読み取り可能な記録媒体（可搬メモリ等）に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットや電子メール等、ネットワークを通して提供することも可能である。
【００４２】
図３は、本実施の形態における上記コンピュータのハードウェア構成例を示す図である。図３のコンピュータは、それぞれバスＢで相互に接続されているドライブ装置１０００、補助記憶装置１００２、メモリ装置１００３、ＣＰＵ１００４、インタフェース装置１００５、表示装置１００６、及び入力装置１００７等を有する。
【００４３】
当該コンピュータでの処理を実現するプログラムは、例えば、ＣＤ−ＲＯＭ又はメモリカード等の記録媒体１００１によって提供される。プログラムを記憶した記録媒体１００１がドライブ装置１０００にセットされると、プログラムが記録媒体１００１からドライブ装置１０００を介して補助記憶装置１００２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１００１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１００２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００４４】
メモリ装置１００３は、プログラムの起動指示があった場合に、補助記憶装置１００２からプログラムを読み出して格納する。ＣＰＵ１００４は、メモリ装置１００３に格納されたプログラムに従って、当該データ構造変換装置１００に係る機能を実現する。インタフェース装置１００５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１００６はプログラムによるＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）等を表示する。入力装置１００７はキーボード及びマウス、ボタン、又はタッチパネル等で構成され、様々な操作指示を入力させるために用いられる。
【００４５】
＜データ構造変換装置１００の動作＞
以下、データ構造変換装置１００の各部の動作について説明する。
【００４６】
入力部Ｍ０１は、ｖｔｒｅｅ  ｖ及びＳＤＤ  αを外部から受け取る。入力された情報は、メモリ等の記憶手段に格納される。前処理部Ｍ０２は、記憶手段からｖを読み出し、ｖの各ノードに番号をつけ直し、ｖｔｒｅｅの同一な部分木を検出する。変換部Ｍ０３は、前処理部Ｍ０２で処理したｖを用いて、記憶手段から読み出したαをＶＳ−ＳＤＤ  βへ変換する。出力部Ｍ０４はβを出力する。
【００４７】
次に、前処理部Ｍ０２の処理をより詳細に説明する。図４は、前処理部Ｍ０２が実行する処理の手順を示すフローチャートである。
【００４８】
ステップＳ０２１において、前処理部Ｍ０２は記憶手段から読み出したｖｔｒｅｅ  ｖを入力する。図１（ａ）等に例示したように、ｖは葉に変数が対応した二分木である。
【００４９】
ステップＳ０２２において、ｖｔｒｅｅ  ｖの各ノードを一定の規則で辿って、その辿った順番に従って１から順に番号をつける。ここで、本実施の形態における「一定の規則」とは、次の３つの操作を各ノードで決められた順番で行う、ということである。
【００５０】
・（Ｌ）左の子ノードの部分木を再帰的に辿る。
【００５１】
・（Ｒ）右の子ノードの部分木を再帰的に辿る。
【００５２】
・（Ｎ）自分自身のノードを辿る。
【００５３】
特に、各ノードで（Ｎ）→（Ｌ）→（Ｒ）という順番で操作を行って得られる順番を行きがけ順とよぶ。例として、図１（ａ）のｖｔｒｅｅの行きがけ順による番号づけを図５（ａ）（左側）に示す。以降の説明は行きがけ順を用いて行うが、行きがけ順以外でも「一定の規則」の下で順番づけする限りはどの方法でもよい。例えば、通りがけ順や帰りがけ順を用いてもよい。
【００５４】
ポイントは、このような規則で番号づけを行うと、木の各辺で両端のノード番号の差を考えたときに（これを差分番号づけとよぶ）、同一な部分木では差分番号づけも同一になる、ということである。例えば、図５（ａ）の右側は、左側に示す行きがけ順のノード番号に対して差分番号づけを描いたものであるが、行きがけ順番号２の部分木と５の部分木では、その差分番号づけは全く同じになっていることが分かる。
【００５５】
ステップＳ０２３において、前処理部Ｍ０２は、同一な構造を有するｖｔｒｅｅ部分の検出を行う。より具体的には、ｖの同一な部分木を、例えば図６に示すＡｌｇｏｒｉｔｈｍ  １で示されるようなｖに対する再帰的手続きの処理を実行することで検出する。
【００５６】
図６に示すＡｌｇｏｒｉｔｈｍ  １は、ｖｔｒｅｅ  ｖを入力とし、ｖのノードをキーとする連想配列ｅを出力する。ｖｔｒｅｅノードｗに対し、ｅ（ｗ）の値は、ｖのノードで部分木の構造がｗの部分木と一致するもののうちノード番号が最も小さいものである。
【００５７】
ｅは次のような性質をもつ。ｅは、ｖ中の２つのｖｔｒｅｅノードｕ、ｗに対して、ｕの部分木とｖの部分木の構造が一致するときに限りｅ（ｕ）＝ｅ（ｖ）となるような連想配列である。アルゴリズムの内部ではＵｎｉｑＴａｂｌｅという別の連想配列を用いる。ＵｎｉｑＴａｂｌｅは、もしすでに部分木が一致するノードを処理していればそのノードを返す連想配列である。図６において、１行目〜６行目に示すように、処理対象のｖが葉でない限り、ｖの左の子ノードのｖｔｒｅｅと右の子ノードのｖｔｒｅｅに対してＡｌｇｏｒｉｔｈｍ  １が適用され、７行目から９行目に示すように、ＵｎｉｑＴａｂｌｅにより、もしすでに部分木が一致するノードを処理していればそのノードがｅ（ｖ）の値になる。
【００５８】
図４のステップＳ０２４において、前処理部Ｍ０２は、ステップＳ０２２とＳ０２３で取得した、ｖの行きがけ順番号づけと連想配列ｅを出力する。変換部Ｍ０３では、この新たな番号づけがされたｖが使用される。
【００５９】
次に、変換部Ｍ０３の処理について説明する。ここでは、ｖｔｒｅｅノード番号の差分を用いることが本技術のキーポイントである。
【００６０】
まず、変換部Ｍ０３により生成されるＶＳ−ＳＤＤとはどのような表現形なのかを、ＳＤＤから１ステップずつ変換することで示す。続いて、擬似コードを示す。１ステップずつ変換する動作も、擬似コードに基づく動作もいずれも変換部Ｍ０３の動作の例である。
【００６１】
変換部Ｍ０３は、まず、各分解ノードで従うｖｔｒｅｅノード番号を明示的に保持する代わりに、分解ノードを指す各ポインタに、指す先の分解ノードが従うｖｔｒｅｅノード番号と、指す元のノードが従うｖｔｒｅｅノード番号の差をもたせる。次に、各リテラルをそのまま保持する代わりに、そのリテラルの変数に対応する葉のｖｔｒｅｅノードの番号と、そのリテラルを分解としてもつ分解ノードが従うｖｔｒｅｅノード番号の差をもたせる。ここで使用するｖｔｒｅｅノード番号は、前処理部Ｍ０２で得た行きがけ順番号づけによるものである。
【００６２】
上記の処理を実行した具体例として、図１（ｂ）のＳＤＤに、図５（ａ）にあるｖｔｒｅｅの行きがけ順番号づけを考えた上で、ｖｔｒｅｅ番号の差分化を行なった構造を図５（ｂ）に示す。例えば、図５（ｂ）において、一番左側の中段のポインタに付けられた差である「１」は、指す先の分解ノードが従うｖｔｒｅｅノード番号２から、指す元のノードが従うｖｔｒｅｅノード番号１を引いた差である。また、左下端にあったリテラルＢ（図１（ｂ））は、Ｂに対応する葉のｖｔｒｅｅノードの番号３と、そのリテラルを分解（要素）としてもつ分解ノードが従うｖｔｒｅｅノード番号２の差である１になる。
【００６３】
図５（ｂ）に示すように、もとのＳＤＤで合同だったノード以下の構造は、上の手続きで導入したｖｔｒｅｅノード番号の差も含めて全く同一な構造へと変換される。例えば、図５（ｂ）において、下側中央と下側右の分解ノードは元々合同であったが、変換後にはそれ以下の構造も含めて全く同一になっている。変換部Ｍ０３は、こうして生ずる同一な部分構造を共有するようにデータ構造を変換することで、ノード数の削減を達成する。
【００６４】
図５（ｂ）で生じた同一な部分構造を共有することにより得られる構造を図５（ｃ）に示す。図５（ｃ）に示すように、図５（ｂ）において、一番上の分解ノードの中央と右の２つの要素（部分木の根ノード）のそれぞれから伸びるポインタの先の２つの分解ノード及びその先にある４つの要素が、図５（ｃ）においては、一つの分解ノード及びその先の２つの要素からなる構造を共有する形になっている。
【００６５】
このように、ｖｔｒｅｅノード番号の差を用いた変換を行って、それにより生じた同一な部分構造を共有することによって得られる構造をＶＳ−ＳＤＤとよぶ。
【００６６】
変換部Ｍ０３は、ｖｔｒｅｅノード番号の差を用いるよう変換することと同一な部分構造を共有することを同時並行で行うこととしてもよい。そのような処理を実行する変換部Ｍ０３の処理手順を示すＡｌｇｏｒｉｔｈｍ  ２を図７に示す。なお、ｖｔｒｅｅノード番号の差を用いるよう変換することと同一な部分構造を共有することを同時並行で行う処理は、図５を参照して説明した上記の処理と本質的には同じである。
【００６７】
ここで、ＳＤＤ  αに対して、αが従うｖｔｒｅｅノードをｖ（α）と表し、ｖｔｒｅｅノードｖに対してその行きがけ順による番号をｎｕｍ（ｖ）とする。
【００６８】
図７に示すとおり、このアルゴリズムは、ＳＤＤ  αを入力とし、αをＶＳ−ＳＤＤに変換した構造を出力する。アルゴリズムの内部では、前処理部Ｍ０２で得られた連想配列ｅを用いている。前述したとおり、連想配列ｅは、ｖｔｒｅｅ  ｖのノードｗに対し、ｅ（ｗ）の値が、ｖのノードで部分木の構造がｗの部分木と一致するもののうちノード番号が最も小さいものであるような連想配列である。
【００６９】
データ構造変換装置１００上（つまりコンピュータ上）では、分解ノードのＶＳ−ＳＤＤは配列｛（ｐ´１，ｓ´１），...，（ｐ´ｎ，ｓ´ｎ）｝で表現される。ここで各ｐ´ｉは、対応する要素ｐｉが定数の場合はそのもの、リテラルの場合はｖｔｒｅｅノード番号の差と否定リテラル（¬）かどうかを表すフラグとのペア、分解ノードの場合はｖｔｒｅｅノード番号の差とそのＶＳ−ＳＤＤへのポインタのペアである。ｓ´ｉも同様である。
【００７０】
Ａｌｇｏｒｉｔｈｍ  ２の中で、６行目が、対応する要素のｐｉが定数の場合にｐ´ｉをその定数とする処理である。７、８行目が、リテラルをｖｔｒｅｅノード番号の差に変換する処理である。７、８行目で使用されている「ｎｕｍ（ｖ（ｐｉ））−ｎｕｍ（ｖ（α））」は、ｐｉ（＝リテラル）が従うｖｔｒｅｅノードの番号（つまり、当該リテラルに対応するｖｔｒｅｅノードの番号）から、ｐｉ（＝リテラル）を指す元のｖｔｒｅｅノードの番号を引いた差である。９行目が、ｐｉが分解ノードの場合に、ｖｔｒｅｅノード番号の差と、当該分解ノードのＶＳ−ＳＤＤへのポインタ（ＶＳ（ｐｉ））のペアをｐ´ｉとする処理を示す。
【００７１】
図７に示すとおり、アルゴリズムの内部ではＣｏｎｖＴａｂｌｅとＵｎｉｑＴａｂｌｅという２つの連想配列を用いる。
【００７２】
ＣｏｎｖＴａｂｌｅは、入力のＳＤＤ  αのノードと、出力のＶＳ−ＳＤＤのノードとの対応関係を保持する。ＵｎｉｑＴａｂｌｅは、もしすでに合同な部分構造が処理されていたらその部分構造のＶＳ−ＳＤＤへのポインタを返すような連想配列である。ここで、前処理部Ｍ０２で作った連想配列ｅが、ｖｔｒｅｅの部分木の構造が同一であるか判定するために用いられている。もしまだ合同な部分構造が処理されていなければ（１２行目）、１３行目でＣｒｅａｔｅＮｅｗＮｏｄｅで新たな分解ノードのＶＳ−ＳＤＤを作成する。
【００７３】
例えば、図１（ｂ）のＳＳＤと図５（ａ）のｖｔｒｅｅが入力された際に、図５（ｃ）に示すように｛（ｐ´１，ｓ´１），...，（ｐ´ｎ，ｓ´ｎ）｝（四角のペアのそれぞれ）に定数、差分、ポインタと差分、等がセットされる。また、図１（ｂ）のＳＳＤにおいて、ｖｔｒｅｅノード番号５に従う分解ノードの処理の際には、その左側の分解ノードと合同となるので、ＵｎｉｑＴａｂｌｅにより、その左側の分解ノードに対応するＶＳ−ＳＤＤへのポインタが返される。よって、図５（ｃ）のように、合同な構造を共有した構造が得られる。
【００７４】
（第２の実施の形態）
＜第２の実施の形態の概要＞
次に、第２の実施の形態を説明する。第２の実施の形態では、論理関数をＶＳ−ＳＤＤに直接変換するデータ構造変換装置２００が提供される。
【００７５】
第２の実施の形態において、論理関数は、定数（ｔｒｕｅやｆａｌｓｅ）や変数と、否定演算（¬）、及び、論理和（∨）、論理積（∧）、排他的論理和（"＋"）などの二項演算との組み合わせで表現されるものとし、入力としてはその構文木、及びｖｔｒｅｅが与えられる（なお、本明細書のテキストでは、記載の便宜上、排他的論理和の記号（〇の中に＋を入れた記号）を"＋"と表した）。すなわち、どのような構造と順番で各種論理演算を適用するかが分かっている状態で、当該論理関数が与えられるものとする。
【００７６】
例えば、（Ａ∧Ｂ）∨（Ｂ∧Ｃ）∨（Ｃ∧Ｄ）という論理関数であれば、図８の構文木に示すように、まずＡとＢの論理積をとり、次にＢとＣの論理積をとり、次にＣとＤの論理積をとり、次に、ＡとＢの論理積とＢとＣの論理積をとり、最後にそれら全ての論理和をとる、という順番で計算すればよい、ということが分かっているものとする。
【００７７】
なお、例えば（Ａ∧Ｂ）∨（Ｂ∧Ｃ）∨（Ｃ∧Ｄ）などの論理関数が文字列として与えられたとしても、文字列に対して構文解析を行うことで論理演算の構造や順番を特定することは一般的な技術である。従って、データ構造変換装置２００に文字列としての論理関数を入力し、データ構造変換装置２００が構文解析を行って、構文木を計算し、その構文木を使用することとしてもよい。
【００７８】
（Ａ∧Ｂ）∨（Ｂ∧Ｃ）∨（Ｃ∧Ｄ）を例にとると、データ構造変換装置２００は、図８の構文木に従って、下の階層から上の階層に向けて順番に処理を行う。すなわち、まず、Ａ∧Ｂ、Ｂ∧Ｃ、Ｃ∧ＤそれぞれのＶＳ−ＳＤＤを作成し、次に、当該ＶＳ−ＳＤＤを使用して（Ａ∧Ｂ）∨（Ｂ∧Ｃ）のＶＳ−ＳＤＤを作成し、最後にその結果のＶＳ−ＳＤＤとＣ∧ＤのＶＳ−ＳＤＤとを使って（Ａ∧Ｂ）∨（Ｂ∧Ｃ）∨（Ｃ∧Ｄ）のＶＳ−ＳＤＤを作成する。このＶＳ−ＳＤＤの作成において、後述する論理演算のアルゴリズム（Ａｌｇｏｒｉｔｈｍ  ３〜５）を使用する。なお、Ａ、Ｂ、Ｃ、ＤそれぞれのＶＳ−ＳＤＤはＡ、Ｂ、Ｃ、Ｄであるから、例えば、Ａ∧ＢのＶＳ−ＳＤＤは、ＡというＶＳ−ＳＤＤとＢというＶＳ−ＳＤＤに対して、後述する論理演算を行うことで得られる。
【００７９】
第２の実施の形態におけるデータ構造変換装置２００は、上記の処理を効率良く行うために、ＶＳ−ＳＤＤ  α、βが与えられたときに、αが表す論理関数の否定を表すＶＳ−ＳＤＤや、αが表す論理関数とβが表す論理関数の論理和、論理積、排他的論理和を表すＶＳ−ＳＤＤを、ＶＳ−ＳＤＤの表現形を保ったまま効率よく計算できる。
【００８０】
＜装置構成、動作＞
第２の実施の形態における、論理関数を直接ＶＳ−ＳＤＤに変換するデータ構造変換装置２００の構成図を図９に示す。
【００８１】
図９に示すとおり、データ構造変換装置２００は、入力部Ｍ１１、前処理部Ｍ１２、構築部Ｍ１３、出力部Ｍ１４を有する。
【００８２】
入力部Ｍ１１は、ｖｔｒｅｅ  ｖと論理関数ｆ（ここでは構文木の形式）を受け取る。入力された情報は、メモリ等の記憶手段に格納される。前処理部Ｍ１２は、記憶手段からｖを読み出し、ｖの各ノードに番号をつけ直し、ｖｔｒｅｅの同一な部分木を検出する。構築部Ｍ１３は、前処理部Ｍ１２で処理したｖを用いて、ｆをＶＳ−ＳＤＤ  αへ変換する。出力部Ｍ１４は、αを出力する。前処理部Ｍ１２の処理はＳＤＤをＶＳ−ＳＤＤに変換するシステムの前処理部Ｍ０２の処理と全く同じなので、以降は構築部Ｍ１３の処理を説明する。
【００８３】
構築部Ｍ１３は、ｖｔｒｅｅ  ｖ及び前処理部Ｍ１２の出力をもとに、論理関数ｆ内の論理演算の構造と順番（これらは構文木の情報として持っている）に従って、前述したように各種論理演算を繰り返し適用する。構築部Ｍ１３が実行する論理演算として、否定演算、二項演算を以下に説明する。
【００８４】
構築部Ｍ１３は、ＶＳ−ＳＤＤにおける否定演算を、図１０におけるＡｌｇｏｒｉｔｈｍ  ３により実行する。
【００８５】
図１０に示すように、ＶＳ−ＳＤＤ  αに対して、αが従うｖｔｒｅｅノード番号をｊαとすれば、Ｎｅｇａｔｅ（α，ｊα，ｔｒｕｅ）が返す結果が、αが表す論理関数の否定を表すＶＳ−ＳＤＤとなる。
【００８６】
Ａｌｇｏｒｉｔｈｍ  ３におけるＣｏｎｖＴａｂｌｅは演算結果を保存しておくための連想配列であり、ＣｏｎｖＴａｂｌｅ（α，ｔｒｕｅ）にはαの否定を表すＶＳ−ＳＤＤノードへのポインタを保存し、ＣｏｎｖＴａｂｌｅ（α，ｆａｌｓｅ）にはαへのポインタを保存しておく。
【００８７】
ＵｎｉｑＴａｂｌｅは、演算した結果がすでに計算された結果のノードと一致した場合に、そのノードへのポインタを返す連想配列である。図１０に示すＡｌｇｏｒｉｔｈｍ  ３の内容はより詳細には下記のとおりである。
【００８８】
まず、１、２行目においては，既に同じα、ｆｌｇに対してＮｅｇａｔｅ（α，・，ｆｌｇ）を計算しているならば、その計算結果へのポインタを返す。これにより同じ計算が二度以上行われることを防ぐ。
【００８９】
そうでなければ、４行目以下で実際に否定の演算を行う。論理関数ｆが｛（ｐ１，ｓ１），...，（ｐｎ，ｓｎ）｝と分解されているならば，論理関数¬ｆは｛（ｐ１，¬ｓ１），...，（ｐｎ，¬ｓｎ）｝と分解される。すなわち、ｐｉ側はそのままにして、ｓｉ側に否定の演算を行うことで、大元の関数の否定が計算できる。
【００９０】
まず、６−９行目でｐｉ側の計算を行う。ｐｉ側はそのままにするので、定数やリテラルなら変更を加えず、そうでない場合もｆｌｇ＝ｆａｌｓｅのＮｅｇａｔｅを実行することでそのまま同じものを返す。
【００９１】
次に１０−１３行目でｓｉ側の計算を行う。ｓｉ側はもしｆｌｇ＝ｆａｌｓｅならばｐｉと同様に変更を加えないが、ｆｌｇ＝ｔｒｕｅならば、もしｓｉが定数やリテラルならばそのまま否定を計算し（１１行目）、そうでなければそれ以下のノードの否定を再帰的に計算する（１３行目）。最後に１５、１６行目で、もしまだ合同な部分構造が既に現れていなければ新たな分解ノードのＶＳ−ＳＤＤを作成する。合同な部分構造を処理済みであればそれに対応するＶＳ−ＳＤＤへのポインタを返す。
【００９２】
構築部Ｍ１３は、ＶＳ−ＳＤＤが２つ与えられたときの、論理和や論理積、排他的論理和などの二項演算を、図１１Ａ〜Ｃに示すＡｌｇｏｒｉｔｈｍ  ４により実行する。
【００９３】
図１１Ａ〜Ｃに示すように、ＶＳ−ＳＤＤ  α，βに対して、従うｖｔｒｅｅノード番号をそれぞれｊα、ｊβとすれば、Ａｐｐｌｙ（α，β，ｆａｌｓｅ，ｆａｌｓｅ，ｊα，ｊβ，〇）が返す結果が、α、βが表す論理関数に〇を適用した論理関数を表すＶＳ−ＳＤＤとなる。なお、〇には論理和∨、論理積∧、排他的論理和＋などの二項演算が入るものとする。
【００９４】
Ａｌｇｏｒｉｔｈｍ  ４でも連想配列は２つ用いられており、ＣｏｎｖＴａｂｌｅは演算結果を保存しておくため、ＵｎｉｑＴａｂｌｅは演算済みのノードたちを格納するために使われる。擬似コード中で、３行目のＬＣＡは、２つのｖｔｒｅｅノード番号ｘ、ｙが入力されたときに、番号ｘのノードと番号ｙのノードからそれぞれ根の方向に木を辿ったときにどちらでも訪れるノードの中で、最も深いもの（最近共通祖先）を返す関数である。
【００９５】
また、３５行目のＣｏｎｓｉｓｔｅｎｔは、入力されたＶＳ−ＳＤＤが表す論理関数がｆａｌｓｅでないかどうかを判定する関数で、その擬似コードはＡｌｇｏｒｉｔｈｍ  ５（図１２）に示される。通常のＳＤＤにおける同様の演算（Ａｐｐｌｙ演算）と異なる点は、ＶＳ−ＳＤＤでは今注目しているノード（αとβ）が従うｖｔｒｅｅノードの番号（ｊα，ｊβ）を常に追跡するという点である。図１１Ａ〜Ｃに示すＡｌｇｏｒｉｔｈｍ  ４の内容はより詳細には下記のとおりである。
【００９６】
１−５行目は前処理である。ここでｖと¬ｖはリテラルを表している。６−８行目では、もしαとβが両方定数か、片方が定数で片方がリテラルか，もしくは両方とも同じ変数に関するリテラルであれば、その演算結果α○βをすぐに返す。
【００９７】
また、９、１０行目では、既に同様の計算が行われていればその計算結果へのポインタを返すことにより、全く同じ計算を二度以上行うことを防ぐ。このとき、ＣｏｎｖＴａｂｌｅの第５、６引数として，ｊαとｊβの代わりに４、５行目で計算したｅαとｅβを使うことで、合同性から生じる実質的に等価な演算を二度以上行うことも防いでいる。これらいずれにも当てはまらないならば１２行目以降で実際に演算を行う。
【００９８】
ｖｔｒｅｅ  ｖαに従うαとｖβに従うβの演算結果のＶＳ−ＳＤＤは、ｖｔｒｅｅ  ＬＣＡ（ｖα，ｖβ）に従う。そこで、１２−２３行目では、まずαとβの、ＬＣＡ（ｖα，ｖβ）での分解をα´とβ´で格納しておいて、以降の計算はα´とβ´を用いて進める。
以降は、α´＝｛（ｐ１，ｓ１），...，（ｐｎ，ｓｎ）｝，β´＝｛（ｑ１，ｒ１），...，（ｑｍ，ｒｍ）｝に対して、α´○β´の結果は｛（ｐ１∧ｑ１，ｓ１○ｒ１），...，（ｐ１∧ｑｍ，ｓ１○ｒｍ），...，（ｐｎ∧ｑ１，ｓｎ○ｒ１），...，（ｐｎ∧ｑｍ，ｓｎ○ｒｍ）｝となることを用いる。
【００９９】
各α´中の（ｐｉ，ｓｉ，ｆ｛ｐ，ｉ｝，ｆ｛ｓ，ｉ｝）とβ´中の（ｑｌ，ｒｌ，ｆ｛ｑ，ｌ｝，ｆ｛ｒ，ｌ｝）の組に対して、２６−３０，３２，３３行目で必要な変換を行い、３４行目でｐｉ∧ｑｌを計算する。
【０１００】
もしｐｉ∧ｑｌがｆａｌｓｅになってしまったら、対応するｓｉ○ｒｌを計算する意味がないので、３５行目のＣｏｎｓｉｓｔｅｎｔでこれを判定して、もしｆａｌｓｅでなければ３６行目でｓｉ○ｒｌを計算する。３７−４０行目で変換を行って、４１行目で（ｐｉ∧ｑｌ，ｓｉ○ｒｌ）を計算結果に加える。
【０１０１】
４２−４３行目では、Ａｌｇｏｒｉｔｈｍ  ３と同様に、まだ合同な部分構造が現れていなければ新たな分解ノードのＶＳ−ＳＤＤを生成する。また、合同な部分構造を処理済みであれば、そのＶＳ−ＳＤＤへのポインタを返す。
【０１０２】
（効果について）
ＶＳ−ＳＤＤの効果は端的には、ＳＤＤと比べて表現がコンパクトになり、それに従って種々のクエリや他の論理関数との組み合わせなどの処理も高速になるという点に集約される。まずＶＳ−ＳＤＤのサイズに関して説明した後に、モデルカウント及び他の論理関数との組み合わせについて説明する。
【０１０３】
まずＶＳ−ＳＤＤのサイズについて、ＶＳ−ＳＤＤをＳＤＤから作るアルゴリズム（Ａｌｇｏｒｉｔｈｍ  ２（図７））で行なっていることは、ｖｔｒｅｅノード番号の差を考えた結果同一になった部分構造を共有する、というだけなので、ＳＤＤをＶＳ−ＳＤＤに変換する際にサイズが大きくなることはない。さらに、ＳＤＤよりＶＳ−ＳＤＤの方が表現のサイズが指数倍小さくなるような論理関数も存在する。
【０１０４】
次に、ＶＳ−ＳＤＤにおけるモデルカウントについて説明する。ＶＳ−ＳＤＤ  αが与えられたとき、αが表す論理関数のモデルカウントはＡｌｇｏｒｉｔｈｍ  ６（図１３）により計算できる。Ａｌｇｏｒｉｔｈｍ  ６の中で、整数ｊに対しｎｕｍ−１（ｊ）は（行きがけ順）ノード番号がｊであるようなｖｔｒｅｅノードを表す。また、ｖｔｒｅｅノードｗに対して、ｌ（ｗ）はｗを根とするｖｔｒｅｅの部分木内に存在する葉の数である。前述したとおり、ｖｔｒｅｅノードｖに対して、ｖｌやｖｒはその左の子ノードや右の子ノードのことである。ＶＳ−ＳＤＤにおけるモデルカウントでは、ｖｔｒｅｅノード番号の差を考えることにより新たに共有されたノードも一度しか走査しないことから、通常のＳＤＤにおけるモデルカウントよりサイズが小さくなった分高速に動作する。
【０１０５】
最後に、ＶＳ−ＳＤＤにおける、他の論理関数との組み合わせの操作（Ａｐｐｌｙ演算）について説明する。ＶＳ−ＳＤＤを用いて論理関数同士の論理積や論理和、排他的論理和などをとるアルゴリズムはＡｌｇｏｒｉｔｈｍ  ４（図１１Ａ〜Ｃ）に示した通りである。ＶＳ−ＳＤＤにおけるＡｐｐｌｙ演算でも、モデルカウントの計算と同様に、新たにノードが共有されたことによって、ＳＤＤにおけるＡｐｐｌｙ演算で二回以上計算を行っていた部分を一回のみにする効果があり、サイズが小さくなった分高速に動作する。
【０１０６】
（実施の形態のまとめ）
以上、説明したように、本明細書には少なくとも下記の各項に記載された装置、方法、データ構造、及びプログラムが記載されている。
（第１項）
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備える
データ生成装置。
（第２項）
予め定められた規則に従って、前記順序木の各節点に節点番号を付与し、前記順序木の各辺の両端のノードに付された前記節点番号の差分に基づいて前記順序木の中で構造が同一な部分木を特定する前処理部をさらに備え、
前記構築部は、前記前処理部で特定した構造が同一な部分木を用いて、前記構造が同一な複数の部分構造を特定する
第１項記載のデータ生成装置。
（第３項）
前記構築部は、前記論理関数に対応するＳＤＤを表すグラフ構造データを入力として、
前記入力されたグラフ構造データ中にリテラルを表すデータが含まれる場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分におきかえるとともに、
前記入力されたグラフ構造データ中に他の分解ノードへのポインタが含まれる場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先が、当該既に構築されたグラフ構造データの情報格納先となるようにポインタを変更する
第２項記載のデータ生成装置。
（第４項）
前記構築部は、前記順序木により特定される変数の分解の順序に従い、各変数の分解に対応する前記グラフ構造データを生成するものであり、
前記グラフ構造データは、その分解の要素がリテラルの場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分の値を格納し、
その分解の要素が定数の場合は定数を格納し、
その分解の要素が他の分解を参照するものである場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先を当該既に構築されたグラフ構造データの情報格納先を指すポインタの情報を格納し、そうでない場合には、前記他の分解に対応するグラフ構造データを作成すると共に当該他の分解に対応するグラフ構造データの情報格納先を指すポインタの情報を格納することにより生成される
第２項記載のデータ生成装置。
（第５項）
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置が実行するデータ生成方法であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される１つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築ステップ、を備える
データ生成方法。
（第６項）
所定の木構造に従って論理関数の分解を表現するグラフ構造のデータ構造であって、
前記所定の木構造における葉の変数に対応する要素の値を、当該葉に対応する前記所定の木構造における節点の節点番号と当該要素を持つノードが従う前記所定の木構造における節点の節点番号との差とし、
ポインタを有する要素の値を、当該ポインタが指す先のノードが従う前記所定の木構造の節点の節点番号と当該要素を持つノードが従う前記所定の木構造の節点の節点番号との差、及び当該ポインタとした
データ構造。
（第７項）
コンピュータを、第１項ないし第４項のうちいずれか１項に記載のデータ生成装置の各部として機能させるためのプログラム。
【０１０７】
以上、本実施の形態について説明したが、本発明はかかる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【符号の説明】
【０１０８】
１００、２００  データ構造変換装置
Ｍ０１、Ｍ１１  入力部
Ｍ０２、Ｍ１２  前処理部
Ｍ０３、Ｍ１３  変換部
Ｍ０４、Ｍ１４  出力部
１０００  ドライブ装置
１００２  補助記憶装置
１００３  メモリ装置
１００４  ＣＰＵ
１００５  インタフェース装置
１００６  表示装置
１００７  入力装置
【図１】
2020135305.tif 000006
【図２】
2020135305.tif 000007
【図３】
2020135305.tif 000008
【図４】
2020135305.tif 000009
【図５】
2020135305.tif 000010
【図６】
2020135305.tif 000011
【図７】
2020135305.tif 000012
【図８】
2020135305.tif 000013
【図９】
2020135305.tif 000014
【図１０】
2020135305.tif 000015
【図１１Ａ】
2020135305.tif 000016
【図１１Ｂ】
2020135305.tif 000017
【図１１Ｃ】
2020135305.tif 000018
【図１２】
2020135305.tif 000019
【図１３】
2020135305.tif 000020