IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 日本電信電話株式会社の特許一覧 ▶ 国立大学法人 東京大学の特許一覧

特許7048032データ生成装置、データ生成方法、及びプログラム
<>
  • 特許-データ生成装置、データ生成方法、及びプログラム 図1
  • 特許-データ生成装置、データ生成方法、及びプログラム 図2
  • 特許-データ生成装置、データ生成方法、及びプログラム 図3
  • 特許-データ生成装置、データ生成方法、及びプログラム 図4
  • 特許-データ生成装置、データ生成方法、及びプログラム 図5
  • 特許-データ生成装置、データ生成方法、及びプログラム 図6
  • 特許-データ生成装置、データ生成方法、及びプログラム 図7
  • 特許-データ生成装置、データ生成方法、及びプログラム 図8
  • 特許-データ生成装置、データ生成方法、及びプログラム 図9
  • 特許-データ生成装置、データ生成方法、及びプログラム 図10
  • 特許-データ生成装置、データ生成方法、及びプログラム 図11A
  • 特許-データ生成装置、データ生成方法、及びプログラム 図11B
  • 特許-データ生成装置、データ生成方法、及びプログラム 図11C
  • 特許-データ生成装置、データ生成方法、及びプログラム 図12
  • 特許-データ生成装置、データ生成方法、及びプログラム 図13
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-03-28
(45)【発行日】2022-04-05
(54)【発明の名称】データ生成装置、データ生成方法、及びプログラム
(51)【国際特許分類】
   G06F 16/90 20190101AFI20220329BHJP
   G06N 5/02 20060101ALI20220329BHJP
【FI】
G06F16/90
G06N5/02
【請求項の数】 6
(21)【出願番号】P 2019026737
(22)【出願日】2019-02-18
(65)【公開番号】P2020135305
(43)【公開日】2020-08-31
【審査請求日】2021-02-04
(73)【特許権者】
【識別番号】000004226
【氏名又は名称】日本電信電話株式会社
(73)【特許権者】
【識別番号】504137912
【氏名又は名称】国立大学法人 東京大学
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100124844
【弁理士】
【氏名又は名称】石原 隆治
(72)【発明者】
【氏名】中村 健吾
(72)【発明者】
【氏名】西野 正彬
(72)【発明者】
【氏名】伝住 周平
【審査官】齊藤 貴孝
(56)【参考文献】
【文献】特開2014-154107(JP,A)
【文献】国際公開第2015/087957(WO,A1)
【文献】米国特許出願公開第2010/0275169(US,A1)
【文献】西野 正彬、外3名,グラフ部分構造列挙のためのゼロサプレス型項分岐決定図の効率的な構築法,情報処理学会 研究報告 アルゴリズム(AL),日本,情報処理学会,2016年09月16日,p.1-8
【文献】青木 洋士、外2名,写像枝を用いた系列二分決定グラフの効率化,情報処理学会 研究報告 アルゴリズム(AL),日本,情報処理学会,2013年05月10日,p.1-8
【文献】湊真一、外1名,ゼロサプレス型二分決定グラフを用いたトランザクションデータベースの効率的解析手法,電子情報通信学会論文誌,Vol.J89-D,No.2,社団法人電子情報通信学会,2006年02月01日,pp.172-182
(58)【調査した分野】(Int.Cl.,DB名)
G06F 16/00-16/958
G06N 5/02
(57)【特許請求の範囲】
【請求項1】
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される1つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応するグラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備える
データ生成装置。
【請求項2】
予め定められた規則に従って、前記順序木の各節点に節点番号を付与し、前記順序木の各辺の両端のノードに付された前記節点番号の差分に基づいて前記順序木の中で構造が同一な部分木を特定する前処理部をさらに備え、
前記構築部は、前記前処理部で特定した構造が同一な部分木を用いて、前記構造が同一な複数の部分構造を特定する
請求項1記載のデータ生成装置。
【請求項3】
前記構築部は、前記論理関数に対応するSDDを表すグラフ構造データを入力として、
前記入力されたグラフ構造データ中にリテラルを表すデータが含まれる場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分におきかえるとともに、
前記入力されたグラフ構造データ中に他の分解ノードへのポインタが含まれる場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先が、当該既に構築されたグラフ構造データの情報格納先となるようにポインタを変更する
請求項2記載のデータ生成装置。
【請求項4】
前記構築部は、前記順序木により特定される変数の分解の順序に従い、各変数の分解に対応する前記グラフ構造データを生成するものであり、
前記グラフ構造データは、その分解の要素がリテラルの場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分の値を格納し、
その分解の要素が定数の場合は定数を格納し、
その分解の要素が他の分解を参照するものである場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先を当該既に構築されたグラフ構造データの情報格納先を指すポインタの情報を格納し、そうでない場合には、前記他の分解に対応するグラフ構造データを作成すると共に当該他の分解に対応するグラフ構造データの情報格納先を指すポインタの情報を格納することにより生成される
請求項2記載のデータ生成装置。
【請求項5】
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するために、コンピュータにプログラムを実行させることにより、前記コンピュータが実行するデータ生成方法であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される1つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応するグラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを、前記コンピュータが生成する構築ステップ、を備える
データ生成方法。
【請求項6】
コンピュータを、請求項1ないし4のうちいずれか1項に記載のデータ生成装置の各部として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、論理関数をコンパクトかつ扱いやすい形で表現する知識コンパイレーションに関連するものである。
【背景技術】
【0002】
知識コンパイレーションとは、論理関数をコンパクトかつ扱いやすい形で表現する手法に関する分野である。ここで「扱いやすい」というのは、その表現形の下で、論理関数に関する問い合わせ(以下、クエリとよぶ)や、他の論理関数との論理演算が高速にできる、という意味である。
【0003】
このような表現形は、集積回路の論理設計や検証で昔から用いられている他、ベイジアンネットワークによる確率推論や、通信ネットワークの信頼性の最大化など数理最適化にも用いられる。そのような表現形は多数提案されているが、中でも非特許文献1の項分岐決定図(Sentential Decision Diagram、以下SDDとよぶ)は、コンパクトさと扱いやすさを両方備えており、近年幅広い応用分野で実際に使われている。
【先行技術文献】
【非特許文献】
【0004】
【文献】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.
【発明の概要】
【発明が解決しようとする課題】
【0005】
知識コンパイレーションで考えられる論理関数の表現形は、ひとたびある論理関数を表現するものを作ってしまえば、その論理関数に関するクエリを解いたり、他の論理関数と組み合わせたりする操作が、その表現形のままでできる。しかし、論理関数をその表現形で表現したときの大きさがどの程度になるかは一般にはわからない。
【0006】
実際、論理関数によっては表現のサイズが非常に大きくなってしまい、計算機のメモリに載らなくなってしまう例が存在する。また、例えメモリに載ったとしても、表現のサイズが大きいために種々のクエリや論理関数との組み合わせ演算に時間がかかってしまうことがある。そこで、なるべくサイズが小さくなり、かつクエリを解いたり他の論理関数と組み合わせたりする操作がより高速になるような表現形を作り出す技術が検討されている。
【0007】
非特許文献1のSDDは、非特許文献2の二分決定図(Binary Decision Diagram、以下BDDとよぶ)の構造を一般化して、BDDと同様な機能性(クエリや他の論理関数との組み合わせへの対応)を備えつつBDDよりも省サイズを実現したデータ構造である。しかし、SDDをもってしてもまだサイズが大きくなってしまう論理関数は多数存在する。そこで、SDDと同様の機能性を有しつつ、SDDよりもさらに小さな表現を実現する表現形が必要とされている。
【0008】
本発明は上記の点に鑑みてなされたものであり、論理関数をコンパクトかつ扱いやすい形で表現する手法において、SDDよりもさらに小さな表現を実現する表現形を得る技術を提供することを目的とする。
【課題を解決するための手段】
【0009】
開示の技術によれば、所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される1つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応するグラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備えるデータ生成装置が提供される。
【発明の効果】
【0010】
開示の技術によれば、論理関数をコンパクトかつ扱いやすい形で表現する手法において、SDDよりもさらに小さな表現を実現する表現形を得る技術が提供される。
【図面の簡単な説明】
【0011】
図1】SDDを説明するための図である。
図2】第1の実施の形態におけるデータ構造変換装置100の構成図である。
図3】装置のハードウェア構成の例を示す図である。
図4】前処理部M02の全体処理フローである。
図5】第1の実施の形態における動作の例を示す図である。
図6】ステップS023におけるアルゴリズムの例を示す図である。
図7】変換部M03の動作に対応するアルゴリズムの例を示す図である。
図8】構文木の例を示す図である。
図9】第2の実施の形態におけるデータ構造変換装置100の構成図である。
図10】構築部M13の動作に対応するアルゴリズムの例を示す図である。
図11A】構築部M13の動作に対応するアルゴリズムの例を示す図である。
図11B】構築部M13の動作に対応するアルゴリズムの例を示す図である。
図11C】構築部M13の動作に対応するアルゴリズムの例を示す図である。
図12】構築部M13の動作に対応するアルゴリズムの例を示す図である。
図13】モデルカウントのアルゴリズムの例を示す図である。
【発明を実施するための形態】
【0012】
以下、図面を参照して本発明の実施の形態(本実施の形態)を説明する。以下で説明する実施の形態は一例に過ぎず、本発明が適用される実施の形態は、以下の実施の形態に限られるわけではない。
【0013】
(SDDについて)
本実施の形態では、SDDの構造を改良した構造を提供するものであるので、まずはSDDについて説明する。
【0014】
まず、論理関数とは、真(true)か偽(false)の二値をとる変数を複数引数にとり、真か偽のどちらかの値を返す関数である。論理関数fが引数にとる変数たちをX、その分割をY、Zとすると、fは、Yの変数のみからなる部分論理関数p,...,pとZの変数たちのみからなる部分論理関数s,...,sを用いて下記のように分解することができる。
【0015】
f(X)=[p(Y)∧s(Z)]∨・・・∨[p(Y)∧s(Z)]
ここで、A∧Bは論理積(AかつB)、A∨Bは論理和(AまたはB)である。特にここでは、p,...,pが互いに素、すなわち、p(Y)とp(Y)が同時に真となるようなi≠jとYの変数たちへの真偽の割り当てが存在しないような分解を考えることにする。なお、このような分解は常に可能である。
【0016】
このような分解を再帰的に行うことで、コンパクトかつ扱いやすい表現形を実現したのがSDDである。このとき、どのように変数を分割してゆくかを定めるのがvtreeとよばれる木構造である。vtreeは、最も下にあるノード(以下、葉とよぶ)の各々が1つの変数に対応し、それ以外のノード(以下、内部節点とよぶ)の各々はエッジで繋がれた下のノード(以下、子ノードとよぶ)をちょうど2つ持つような木構造である。各々の内部節点は、変数を、左の子ノード以下にある葉たちに対応する変数と、右の子ノード以下にある葉たちに対応する変数に分割することを表す。なお、vtreeのノードを「節点」と称してもよい。
【0017】
vtreeの例を図1(a)に示す。このvtreeは、まず4つの変数{A,B,C,D}を左側の{A,B}と右側の{C,D}に分割し、次いで左側の{A,B}をさらに{B}と{A}に、右側の{C,D}をさらに{D}と{C}に分割することを表す。vtreeの各ノードには、図1(a)のように番号をつけておく。
【0018】
vtreeを用いると、SDDとそれが表す論理関数は次のように再帰的に定義できる。「vtree vに従うSDD」は、次の3種類のうちのいずれかである。ここで、SDD αに対し、αが表す論理関数を<α>と表す。
【0019】
【数1】
は、それ自体がSDDである。ここで、
【0020】
【数2】
すなわち恒真関数、
【0021】
【数3】
すなわち恒偽関数である。これらのSDDは以下では定数とよぶ。
【0022】
・変数Xに対し、vが変数Xに対応する葉であるならば、Xや¬Xはvに従うSDDである。<X>=X(Xが真ならば真、そうでなければ偽という関数)、<¬X>=¬X(Xが真なら偽、そうでなければ真という関数)である。これらのSDDは以下ではリテラルとよぶ。
【0023】
・p,...,pはvの左の子ノード以下に従うSDDで、<p>,...,<p>は互いに素、s,...,sはvの右の子ノード以下に従うSDDとする。このとき、これらを各々ペアにした{(p,s),...,(p,s)}はvに従うSDDである。このSDDは(<p>∧<s>)∨...∨(<p>∧<s>)という論理関数を表す。このようなSDDを以下では分解ノードとよぶ。
【0024】
計算機上では、定数やリテラルは定数長のデータとしてそのまま表現され、分解ノードは、従うvtreeのノード番号と、配列(p´,s´),...,(p´,s´)との組で表現される。ここで、配列の各要素(p´,s´)は、分解の1つのペア(p,s)を表していて、もしpやsが定数やリテラルのSDDならばそれがそのままp´やs´に格納され、分解ノードならばp´やs´はそのノードへのポインタである。
【0025】
図1(b)は、論理関数f=(A∧B)∨(B∧C)∨(C∧D)を表す、図1(a)のvtreeに従うSDDの例を図示したものである。図中では各分解ノードは丸で表現され、それが従うvtreeのノード番号は丸の中に書かれている。また、分解ノードがもつ各ポインタペアは丸から伸びる矢印で表現される。図1(b)において、各分解ノードから伸びる各矢印の先にある2つの四角の組がペア(p,s)に相当する。2つの四角のうち左側の四角がpに相当し、右側の四角がsに相当する。
【0026】
図1(b)のSDDでは、関数fは最初に((¬A∧B)∧C)∨((A∧B)∧true)∨(¬B∧(C∧D))という形で{A,B}と{C,D}に分解されている。同様に、図1(d)は、論理関数f=(A∧B)∨(C∧D)を表す、図1(c)のvtreeに従うSDDの例である。
【0027】
SDDは次のような操作ができる。論理関数fに対して、fをtrueにするような、変数へのtrueとfalseの割り当て方の総数をfのモデルカウントとよぶ。SDDが与えられたときに、そのSDDが表す論理関数のモデルカウントを計算するのはSDDサイズに比例した時間でできる。論理関数のモデルカウントはベイジアンネットワークによる確率推論や、ネットワーク信頼性の推定などに応用がある。
【0028】
次に、論理関数fとgを論理和∨や論理積∧などの演算で組み合わせることも、SDDのままで可能である。より具体的には、関数fを表すSDD αと関数gを表すSDD βが与えられれば、αとβが同じvtreeに従う限り、f∨gやf∧gなどの関数を表すSDDをαとβから効率的に作れる。この操作は論理関数からSDDを作る際に直接使えるほか、集積回路などのシステムの論理設計や検証でも頻繁に用いられる。
【0029】
SDDが小さな表現を達成するポイントの一つに、もし分解の途中で全く同じ論理関数が部分関数として複数出てきたとしても、その論理関数を表すSDDは一つだけ作ればよい、という点が挙げられる。これを部分構造の共有とよぶ。図1(d)のSDDでは、番号6がついた分解ノードはC∧Dという論理関数を表しているが、このノードは2箇所から(ポインタで)参照されている。これは、論理関数を分解する途中でC∧Dという関数が2回出てきたことを意味するが、この場合でも、C∧Dを表現する分解ノードは一つあればよい。
【0030】
しかし、前述したように、SDDをもってしてもまだサイズが大きくなってしまう論理関数は多数存在する。そこで、SDDと同様の機能性を有しつつ、SDDよりもさらに小さな表現を実現する表現形が必要とされている。以下、そのような表現形を提供する技術を本発明の実施の形態として説明する。
【0031】
(実施の形態の概要)
本実施の形態では、SDDの構造を考える際に、全く同じ論理関数が出てきた場合に部分構造の共有を起こすのに加えて、ある特定の種類の変数の置き換えによって同じ論理関数を表現するようになる場合にも部分構造の共有を起こすように、表現形を改良する。これにより、従来のSDDと比べて部分構造の共有を起こせる場所が増えるため、SDDより小さな論理関数の表現を得られる。
【0032】
これを可能にするために、本実施の形態では、SDDが従うvtreeノード番号を差分的に管理することとしている。この技術により、従来のSDDでは共有できなかった、形は同じだが変数の名前が異なる部分構造も、共有できるようになって表現のサイズが削減できる。また、SDDと同様の機能性を担保できる。特に、この技術を導入したことにより新たに共有が起こった部分構造を再び解(ほど)くことなく、論理関数に関するクエリを解いたり、他の論理関数と組み合わせたりできる。
【0033】
<"ある特定の種類の変数の置き換え"について>
ここで、本実施の形態に係る技術のポイントである「ある特定の種類の変数の置き換え」について説明する。例えば、図1(b)のSDDでは、下側中央の番号1がついたノードはA∧Bという論理関数を表し、下側右の番号5がついたノードはC∧Dという論理関数を表す。
【0034】
また、図1(a)のvtreeで、1番のノード以下の部分構造(以下、vtreeのあるノード以下の部分構造をあるノードの部分木とよぶ)と5番のノードの部分木は変数以外は全く同じ構造をしており、BをD、AをCに置き換えることによって1番の部分木を5番の部分木に書き換えられる。
【0035】
ここで、同様の変数の置き換えをA∧Bという論理関数に対して行うと、C∧Dとなる。さらに、図1(b)のSDDで下側中央の番号1のノード以下の構造に同様の変数の置き換え(B→D、A→C)を行うと、下側右の番号5のノード以下の構造そのものが得られる。このように、ある2つの分解ノードについて、従うvtreeの構造が一致して、そこから導かれる変数の置き換えの下で同一な論理関数を表しているならば、それらの分解ノードは変数の名前以外全く同じ構造を有している。そのような2つの分解ノードを、以下では合同である、とよぶことにする。図1(b)のSDDで下側中央の1番のノードと下側右の5番のノードは合同である。
【0036】
<VS-SDDについて>
上記のような合同な分解ノードを一つにまとめて、部分構造の共有を起こさせるように改良したSDDが、本実施の形態における変数シフトSDD(Variable Shift SDD、以下VS-SDDとよぶ)である。VS-SDDの技術は以下の通りである。
【0037】
SDDでは、各分解ノードは従うvtreeノードの番号を明示的に保持するとともに、各リテラルはそのまま保持されている。しかし、合同な分解ノードは違うvtreeノードに従っており、それ以下の部分構造中のリテラルも異なるので、もし合同な分解ノードを一つにまとめるのであれば、これらの情報は明示的に保持してはならない。これを解決する技術が、従うvtreeノードの番号を「差分的に」保持するという手法であり、VS-SDDの技術の原型である。
【0038】
以降、本発明の実施に形態として、第1の実施の形態と第2の実施の形態を説明する。第1の実施の形態では、まずVS-SDDの構造について説明しながら通常のSDDをVS-SDDに変換する手順について説明する。第2の実施の形態では、論理関数を直接VS-SDDの表現形に変換する手順ついて説明する。
【0039】
(第1の実施の形態)
<装置構成>
図2は、第1の実施の形態におけるデータ構造変換装置100の機能構成図である。データ構造変換装置100は、通常のSDDをVS-SDDに変換する装置である。図2に示すとおり、データ構造変換装置100は、入力部M01、前処理部M02、変換部M03、出力部M04を有する。各部の動作については後述する。なお、第1、第2の実施の形態では、あるデータ構造を変換してVS-SDDを生成するので、「データ構造変換装置」と称しているが、グラフ構造のデータであるVS-SDDを生成する装置であるのでこれを「データ生成装置」と称してもよい。
【0040】
第1の実施の形態におけるデータ構造変換装置100は、例えば、コンピュータに、本実施の形態で説明する処理内容を記述したプログラムを実行させることにより実現可能である。このようにコンピュータとプログラムでデータ構造変換装置を実現できる点は第2の実施の形態でも同様である。
【0041】
データ構造変換装置100は、コンピュータに内蔵されるCPUやメモリ等のハードウェア資源を用いて、当該データ構造変換装置100で実施される処理に対応するプログラムを実行することによって実現することが可能である。上記プログラムは、コンピュータが読み取り可能な記録媒体(可搬メモリ等)に記録して、保存したり、配布したりすることが可能である。また、上記プログラムをインターネットや電子メール等、ネットワークを通して提供することも可能である。
【0042】
図3は、本実施の形態における上記コンピュータのハードウェア構成例を示す図である。図3のコンピュータは、それぞれバスBで相互に接続されているドライブ装置1000、補助記憶装置1002、メモリ装置1003、CPU1004、インタフェース装置1005、表示装置1006、及び入力装置1007等を有する。
【0043】
当該コンピュータでの処理を実現するプログラムは、例えば、CD-ROM又はメモリカード等の記録媒体1001によって提供される。プログラムを記憶した記録媒体1001がドライブ装置1000にセットされると、プログラムが記録媒体1001からドライブ装置1000を介して補助記憶装置1002にインストールされる。但し、プログラムのインストールは必ずしも記録媒体1001より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置1002は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【0044】
メモリ装置1003は、プログラムの起動指示があった場合に、補助記憶装置1002からプログラムを読み出して格納する。CPU1004は、メモリ装置1003に格納されたプログラムに従って、当該データ構造変換装置100に係る機能を実現する。インタフェース装置1005は、ネットワークに接続するためのインタフェースとして用いられる。表示装置1006はプログラムによるGUI(Graphical User Interface)等を表示する。入力装置1007はキーボード及びマウス、ボタン、又はタッチパネル等で構成され、様々な操作指示を入力させるために用いられる。
【0045】
<データ構造変換装置100の動作>
以下、データ構造変換装置100の各部の動作について説明する。
【0046】
入力部M01は、vtree v及びSDD αを外部から受け取る。入力された情報は、メモリ等の記憶手段に格納される。前処理部M02は、記憶手段からvを読み出し、vの各ノードに番号をつけ直し、vtreeの同一な部分木を検出する。変換部M03は、前処理部M02で処理したvを用いて、記憶手段から読み出したαをVS-SDD βへ変換する。出力部M04はβを出力する。
【0047】
次に、前処理部M02の処理をより詳細に説明する。図4は、前処理部M02が実行する処理の手順を示すフローチャートである。
【0048】
ステップS021において、前処理部M02は記憶手段から読み出したvtree vを入力する。図1(a)等に例示したように、vは葉に変数が対応した二分木である。
【0049】
ステップS022において、vtree vの各ノードを一定の規則で辿って、その辿った順番に従って1から順に番号をつける。ここで、本実施の形態における「一定の規則」とは、次の3つの操作を各ノードで決められた順番で行う、ということである。
【0050】
・(L)左の子ノードの部分木を再帰的に辿る。
【0051】
・(R)右の子ノードの部分木を再帰的に辿る。
【0052】
・(N)自分自身のノードを辿る。
【0053】
特に、各ノードで(N)→(L)→(R)という順番で操作を行って得られる順番を行きがけ順とよぶ。例として、図1(a)のvtreeの行きがけ順による番号づけを図5(a)(左側)に示す。以降の説明は行きがけ順を用いて行うが、行きがけ順以外でも「一定の規則」の下で順番づけする限りはどの方法でもよい。例えば、通りがけ順や帰りがけ順を用いてもよい。
【0054】
ポイントは、このような規則で番号づけを行うと、木の各辺で両端のノード番号の差を考えたときに(これを差分番号づけとよぶ)、同一な部分木では差分番号づけも同一になる、ということである。例えば、図5(a)の右側は、左側に示す行きがけ順のノード番号に対して差分番号づけを描いたものであるが、行きがけ順番号2の部分木と5の部分木では、その差分番号づけは全く同じになっていることが分かる。
【0055】
ステップS023において、前処理部M02は、同一な構造を有するvtree部分の検出を行う。より具体的には、vの同一な部分木を、例えば図6に示すAlgorithm 1で示されるようなvに対する再帰的手続きの処理を実行することで検出する。
【0056】
図6に示すAlgorithm 1は、vtree vを入力とし、vのノードをキーとする連想配列eを出力する。vtreeノードwに対し、e(w)の値は、vのノードで部分木の構造がwの部分木と一致するもののうちノード番号が最も小さいものである。
【0057】
eは次のような性質をもつ。eは、v中の2つのvtreeノードu、wに対して、uの部分木とvの部分木の構造が一致するときに限りe(u)=e(v)となるような連想配列である。アルゴリズムの内部ではUniqTableという別の連想配列を用いる。UniqTableは、もしすでに部分木が一致するノードを処理していればそのノードを返す連想配列である。図6において、1行目~6行目に示すように、処理対象のvが葉でない限り、vの左の子ノードのvtreeと右の子ノードのvtreeに対してAlgorithm 1が適用され、7行目から9行目に示すように、UniqTableにより、もしすでに部分木が一致するノードを処理していればそのノードがe(v)の値になる。
【0058】
図4のステップS024において、前処理部M02は、ステップS022とS023で取得した、vの行きがけ順番号づけと連想配列eを出力する。変換部M03では、この新たな番号づけがされたvが使用される。
【0059】
次に、変換部M03の処理について説明する。ここでは、vtreeノード番号の差分を用いることが本技術のキーポイントである。
【0060】
まず、変換部M03により生成されるVS-SDDとはどのような表現形なのかを、SDDから1ステップずつ変換することで示す。続いて、擬似コードを示す。1ステップずつ変換する動作も、擬似コードに基づく動作もいずれも変換部M03の動作の例である。
【0061】
変換部M03は、まず、各分解ノードで従うvtreeノード番号を明示的に保持する代わりに、分解ノードを指す各ポインタに、指す先の分解ノードが従うvtreeノード番号と、指す元のノードが従うvtreeノード番号の差をもたせる。次に、各リテラルをそのまま保持する代わりに、そのリテラルの変数に対応する葉のvtreeノードの番号と、そのリテラルを分解としてもつ分解ノードが従うvtreeノード番号の差をもたせる。ここで使用するvtreeノード番号は、前処理部M02で得た行きがけ順番号づけによるものである。
【0062】
上記の処理を実行した具体例として、図1(b)のSDDに、図5(a)にあるvtreeの行きがけ順番号づけを考えた上で、vtree番号の差分化を行なった構造を図5(b)に示す。例えば、図5(b)において、一番左側の中段のポインタに付けられた差である「1」は、指す先の分解ノードが従うvtreeノード番号2から、指す元のノードが従うvtreeノード番号1を引いた差である。また、左下端にあったリテラルB(図1(b))は、Bに対応する葉のvtreeノードの番号3と、そのリテラルを分解(要素)としてもつ分解ノードが従うvtreeノード番号2の差である1になる。
【0063】
図5(b)に示すように、もとのSDDで合同だったノード以下の構造は、上の手続きで導入したvtreeノード番号の差も含めて全く同一な構造へと変換される。例えば、図5(b)において、下側中央と下側右の分解ノードは元々合同であったが、変換後にはそれ以下の構造も含めて全く同一になっている。変換部M03は、こうして生ずる同一な部分構造を共有するようにデータ構造を変換することで、ノード数の削減を達成する。
【0064】
図5(b)で生じた同一な部分構造を共有することにより得られる構造を図5(c)に示す。図5(c)に示すように、図5(b)において、一番上の分解ノードの中央と右の2つの要素(部分木の根ノード)のそれぞれから伸びるポインタの先の2つの分解ノード及びその先にある4つの要素が、図5(c)においては、一つの分解ノード及びその先の2つの要素からなる構造を共有する形になっている。
【0065】
このように、vtreeノード番号の差を用いた変換を行って、それにより生じた同一な部分構造を共有することによって得られる構造をVS-SDDとよぶ。
【0066】
変換部M03は、vtreeノード番号の差を用いるよう変換することと同一な部分構造を共有することを同時並行で行うこととしてもよい。そのような処理を実行する変換部M03の処理手順を示すAlgorithm 2を図7に示す。なお、vtreeノード番号の差を用いるよう変換することと同一な部分構造を共有することを同時並行で行う処理は、図5を参照して説明した上記の処理と本質的には同じである。
【0067】
ここで、SDD αに対して、αが従うvtreeノードをv(α)と表し、vtreeノードvに対してその行きがけ順による番号をnum(v)とする。
【0068】
図7に示すとおり、このアルゴリズムは、SDD αを入力とし、αをVS-SDDに変換した構造を出力する。アルゴリズムの内部では、前処理部M02で得られた連想配列eを用いている。前述したとおり、連想配列eは、vtree vのノードwに対し、e(w)の値が、vのノードで部分木の構造がwの部分木と一致するもののうちノード番号が最も小さいものであるような連想配列である。
【0069】
データ構造変換装置100上(つまりコンピュータ上)では、分解ノードのVS-SDDは配列{(p´,s´),...,(p´,s´)}で表現される。ここで各p´は、対応する要素pが定数の場合はそのもの、リテラルの場合はvtreeノード番号の差と否定リテラル(¬)かどうかを表すフラグとのペア、分解ノードの場合はvtreeノード番号の差とそのVS-SDDへのポインタのペアである。s´も同様である。
【0070】
Algorithm 2の中で、6行目が、対応する要素のpが定数の場合にp´をその定数とする処理である。7、8行目が、リテラルをvtreeノード番号の差に変換する処理である。7、8行目で使用されている「num(v(p))-num(v(α))」は、p(=リテラル)が従うvtreeノードの番号(つまり、当該リテラルに対応するvtreeノードの番号)から、p(=リテラル)を指す元のvtreeノードの番号を引いた差である。9行目が、pが分解ノードの場合に、vtreeノード番号の差と、当該分解ノードのVS-SDDへのポインタ(VS(p))のペアをp´とする処理を示す。
【0071】
図7に示すとおり、アルゴリズムの内部ではConvTableとUniqTableという2つの連想配列を用いる。
【0072】
ConvTableは、入力のSDD αのノードと、出力のVS-SDDのノードとの対応関係を保持する。UniqTableは、もしすでに合同な部分構造が処理されていたらその部分構造のVS-SDDへのポインタを返すような連想配列である。ここで、前処理部M02で作った連想配列eが、vtreeの部分木の構造が同一であるか判定するために用いられている。もしまだ合同な部分構造が処理されていなければ(12行目)、13行目でCreateNewNodeで新たな分解ノードのVS-SDDを作成する。
【0073】
例えば、図1(b)のSSDと図5(a)のvtreeが入力された際に、図5(c)に示すように{(p´,s´),...,(p´,s´)}(四角のペアのそれぞれ)に定数、差分、ポインタと差分、等がセットされる。また、図1(b)のSSDにおいて、vtreeノード番号5に従う分解ノードの処理の際には、その左側の分解ノードと合同となるので、UniqTableにより、その左側の分解ノードに対応するVS-SDDへのポインタが返される。よって、図5(c)のように、合同な構造を共有した構造が得られる。
【0074】
(第2の実施の形態)
<第2の実施の形態の概要>
次に、第2の実施の形態を説明する。第2の実施の形態では、論理関数をVS-SDDに直接変換するデータ構造変換装置200が提供される。
【0075】
第2の実施の形態において、論理関数は、定数(trueやfalse)や変数と、否定演算(¬)、及び、論理和(∨)、論理積(∧)、排他的論理和("+")などの二項演算との組み合わせで表現されるものとし、入力としてはその構文木、及びvtreeが与えられる(なお、本明細書のテキストでは、記載の便宜上、排他的論理和の記号(〇の中に+を入れた記号)を"+"と表した)。すなわち、どのような構造と順番で各種論理演算を適用するかが分かっている状態で、当該論理関数が与えられるものとする。
【0076】
例えば、(A∧B)∨(B∧C)∨(C∧D)という論理関数であれば、図8の構文木に示すように、まずAとBの論理積をとり、次にBとCの論理積をとり、次にCとDの論理積をとり、次に、AとBの論理積とBとCの論理積をとり、最後にそれら全ての論理和をとる、という順番で計算すればよい、ということが分かっているものとする。
【0077】
なお、例えば(A∧B)∨(B∧C)∨(C∧D)などの論理関数が文字列として与えられたとしても、文字列に対して構文解析を行うことで論理演算の構造や順番を特定することは一般的な技術である。従って、データ構造変換装置200に文字列としての論理関数を入力し、データ構造変換装置200が構文解析を行って、構文木を計算し、その構文木を使用することとしてもよい。
【0078】
(A∧B)∨(B∧C)∨(C∧D)を例にとると、データ構造変換装置200は、図8の構文木に従って、下の階層から上の階層に向けて順番に処理を行う。すなわち、まず、A∧B、B∧C、C∧DそれぞれのVS-SDDを作成し、次に、当該VS-SDDを使用して(A∧B)∨(B∧C)のVS-SDDを作成し、最後にその結果のVS-SDDとC∧DのVS-SDDとを使って(A∧B)∨(B∧C)∨(C∧D)のVS-SDDを作成する。このVS-SDDの作成において、後述する論理演算のアルゴリズム(Algorithm 3~5)を使用する。なお、A、B、C、DそれぞれのVS-SDDはA、B、C、Dであるから、例えば、A∧BのVS-SDDは、AというVS-SDDとBというVS-SDDに対して、後述する論理演算を行うことで得られる。
【0079】
第2の実施の形態におけるデータ構造変換装置200は、上記の処理を効率良く行うために、VS-SDD α、βが与えられたときに、αが表す論理関数の否定を表すVS-SDDや、αが表す論理関数とβが表す論理関数の論理和、論理積、排他的論理和を表すVS-SDDを、VS-SDDの表現形を保ったまま効率よく計算できる。
【0080】
<装置構成、動作>
第2の実施の形態における、論理関数を直接VS-SDDに変換するデータ構造変換装置200の構成図を図9に示す。
【0081】
図9に示すとおり、データ構造変換装置200は、入力部M11、前処理部M12、構築部M13、出力部M14を有する。
【0082】
入力部M11は、vtree vと論理関数f(ここでは構文木の形式)を受け取る。入力された情報は、メモリ等の記憶手段に格納される。前処理部M12は、記憶手段からvを読み出し、vの各ノードに番号をつけ直し、vtreeの同一な部分木を検出する。構築部M13は、前処理部M12で処理したvを用いて、fをVS-SDD αへ変換する。出力部M14は、αを出力する。前処理部M12の処理はSDDをVS-SDDに変換するシステムの前処理部M02の処理と全く同じなので、以降は構築部M13の処理を説明する。
【0083】
構築部M13は、vtree v及び前処理部M12の出力をもとに、論理関数f内の論理演算の構造と順番(これらは構文木の情報として持っている)に従って、前述したように各種論理演算を繰り返し適用する。構築部M13が実行する論理演算として、否定演算、二項演算を以下に説明する。
【0084】
構築部M13は、VS-SDDにおける否定演算を、図10におけるAlgorithm 3により実行する。
【0085】
図10に示すように、VS-SDD αに対して、αが従うvtreeノード番号をjαとすれば、Negate(α,jα,true)が返す結果が、αが表す論理関数の否定を表すVS-SDDとなる。
【0086】
Algorithm 3におけるConvTableは演算結果を保存しておくための連想配列であり、ConvTable(α,true)にはαの否定を表すVS-SDDノードへのポインタを保存し、ConvTable(α,false)にはαへのポインタを保存しておく。
【0087】
UniqTableは、演算した結果がすでに計算された結果のノードと一致した場合に、そのノードへのポインタを返す連想配列である。図10に示すAlgorithm 3の内容はより詳細には下記のとおりである。
【0088】
まず、1、2行目においては,既に同じα、flgに対してNegate(α,・,flg)を計算しているならば、その計算結果へのポインタを返す。これにより同じ計算が二度以上行われることを防ぐ。
【0089】
そうでなければ、4行目以下で実際に否定の演算を行う。論理関数fが{(p,s),...,(p,s)}と分解されているならば,論理関数¬fは{(p,¬s),...,(p,¬s)}と分解される。すなわち、p側はそのままにして、s側に否定の演算を行うことで、大元の関数の否定が計算できる。
【0090】
まず、6-9行目でp側の計算を行う。p側はそのままにするので、定数やリテラルなら変更を加えず、そうでない場合もflg=falseのNegateを実行することでそのまま同じものを返す。
【0091】
次に10-13行目でs側の計算を行う。s側はもしflg=falseならばpと同様に変更を加えないが、flg=trueならば、もしsが定数やリテラルならばそのまま否定を計算し(11行目)、そうでなければそれ以下のノードの否定を再帰的に計算する(13行目)。最後に15、16行目で、もしまだ合同な部分構造が既に現れていなければ新たな分解ノードのVS-SDDを作成する。合同な部分構造を処理済みであればそれに対応するVS-SDDへのポインタを返す。
【0092】
構築部M13は、VS-SDDが2つ与えられたときの、論理和や論理積、排他的論理和などの二項演算を、図11A~Cに示すAlgorithm 4により実行する。
【0093】
図11A~Cに示すように、VS-SDD α,βに対して、従うvtreeノード番号をそれぞれjα、jβとすれば、Apply(α,β,false,false,jα,jβ,〇)が返す結果が、α、βが表す論理関数に〇を適用した論理関数を表すVS-SDDとなる。なお、〇には論理和∨、論理積∧、排他的論理和+などの二項演算が入るものとする。
【0094】
Algorithm 4でも連想配列は2つ用いられており、ConvTableは演算結果を保存しておくため、UniqTableは演算済みのノードたちを格納するために使われる。擬似コード中で、3行目のLCAは、2つのvtreeノード番号x、yが入力されたときに、番号xのノードと番号yのノードからそれぞれ根の方向に木を辿ったときにどちらでも訪れるノードの中で、最も深いもの(最近共通祖先)を返す関数である。
【0095】
また、35行目のConsistentは、入力されたVS-SDDが表す論理関数がfalseでないかどうかを判定する関数で、その擬似コードはAlgorithm 5(図12)に示される。通常のSDDにおける同様の演算(Apply演算)と異なる点は、VS-SDDでは今注目しているノード(αとβ)が従うvtreeノードの番号(jα,jβ)を常に追跡するという点である。図11A~Cに示すAlgorithm 4の内容はより詳細には下記のとおりである。
【0096】
1-5行目は前処理である。ここでvと¬vはリテラルを表している。6-8行目では、もしαとβが両方定数か、片方が定数で片方がリテラルか,もしくは両方とも同じ変数に関するリテラルであれば、その演算結果α○βをすぐに返す。
【0097】
また、9、10行目では、既に同様の計算が行われていればその計算結果へのポインタを返すことにより、全く同じ計算を二度以上行うことを防ぐ。このとき、ConvTableの第5、6引数として,jαとjβの代わりに4、5行目で計算したeαとeβを使うことで、合同性から生じる実質的に等価な演算を二度以上行うことも防いでいる。これらいずれにも当てはまらないならば12行目以降で実際に演算を行う。
【0098】
vtree vαに従うαとvβに従うβの演算結果のVS-SDDは、vtree LCA(vα,vβ)に従う。そこで、12-23行目では、まずαとβの、LCA(vα,vβ)での分解をα´とβ´で格納しておいて、以降の計算はα´とβ´を用いて進める。
以降は、α´={(p,s),...,(p,s)},β´={(q,r),...,(q,r)}に対して、α´○β´の結果は{(p∧q,s○r),...,(p∧q,s○r),...,(p∧q,s○r),...,(p∧q,s○r)}となることを用いる。
【0099】
各α´中の(p,s,f{p,i},f{s,i})とβ´中の(q,r,f{q,l},f{r,l})の組に対して、26-30,32,33行目で必要な変換を行い、34行目でp∧qを計算する。
【0100】
もしp∧qがfalseになってしまったら、対応するs○rを計算する意味がないので、35行目のConsistentでこれを判定して、もしfalseでなければ36行目でs○rを計算する。37-40行目で変換を行って、41行目で(p∧q,s○r)を計算結果に加える。
【0101】
42-43行目では、Algorithm 3と同様に、まだ合同な部分構造が現れていなければ新たな分解ノードのVS-SDDを生成する。また、合同な部分構造を処理済みであれば、そのVS-SDDへのポインタを返す。
【0102】
(効果について)
VS-SDDの効果は端的には、SDDと比べて表現がコンパクトになり、それに従って種々のクエリや他の論理関数との組み合わせなどの処理も高速になるという点に集約される。まずVS-SDDのサイズに関して説明した後に、モデルカウント及び他の論理関数との組み合わせについて説明する。
【0103】
まずVS-SDDのサイズについて、VS-SDDをSDDから作るアルゴリズム(Algorithm 2(図7))で行なっていることは、vtreeノード番号の差を考えた結果同一になった部分構造を共有する、というだけなので、SDDをVS-SDDに変換する際にサイズが大きくなることはない。さらに、SDDよりVS-SDDの方が表現のサイズが指数倍小さくなるような論理関数も存在する。
【0104】
次に、VS-SDDにおけるモデルカウントについて説明する。VS-SDD αが与えられたとき、αが表す論理関数のモデルカウントはAlgorithm 6(図13)により計算できる。Algorithm 6の中で、整数jに対しnum-1(j)は(行きがけ順)ノード番号がjであるようなvtreeノードを表す。また、vtreeノードwに対して、l(w)はwを根とするvtreeの部分木内に存在する葉の数である。前述したとおり、vtreeノードvに対して、vやvはその左の子ノードや右の子ノードのことである。VS-SDDにおけるモデルカウントでは、vtreeノード番号の差を考えることにより新たに共有されたノードも一度しか走査しないことから、通常のSDDにおけるモデルカウントよりサイズが小さくなった分高速に動作する。
【0105】
最後に、VS-SDDにおける、他の論理関数との組み合わせの操作(Apply演算)について説明する。VS-SDDを用いて論理関数同士の論理積や論理和、排他的論理和などをとるアルゴリズムはAlgorithm 4(図11A~C)に示した通りである。VS-SDDにおけるApply演算でも、モデルカウントの計算と同様に、新たにノードが共有されたことによって、SDDにおけるApply演算で二回以上計算を行っていた部分を一回のみにする効果があり、サイズが小さくなった分高速に動作する。
【0106】
(実施の形態のまとめ)
以上、説明したように、本明細書には少なくとも下記の各項に記載された装置、方法、データ構造、及びプログラムが記載されている。
(第1項)
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される1つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築部、を備える
データ生成装置。
(第2項)
予め定められた規則に従って、前記順序木の各節点に節点番号を付与し、前記順序木の各辺の両端のノードに付された前記節点番号の差分に基づいて前記順序木の中で構造が同一な部分木を特定する前処理部をさらに備え、
前記構築部は、前記前処理部で特定した構造が同一な部分木を用いて、前記構造が同一な複数の部分構造を特定する
第1項記載のデータ生成装置。
(第3項)
前記構築部は、前記論理関数に対応するSDDを表すグラフ構造データを入力として、
前記入力されたグラフ構造データ中にリテラルを表すデータが含まれる場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分におきかえるとともに、
前記入力されたグラフ構造データ中に他の分解ノードへのポインタが含まれる場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先が、当該既に構築されたグラフ構造データの情報格納先となるようにポインタを変更する
第2項記載のデータ生成装置。
(第4項)
前記構築部は、前記順序木により特定される変数の分解の順序に従い、各変数の分解に対応する前記グラフ構造データを生成するものであり、
前記グラフ構造データは、その分解の要素がリテラルの場合は、当該リテラルに対応する前記節点番号と当該リテラルを含む分解ノードに対応する分解を表す前記部分木の根ノードの節点番号との差分の値を格納し、
その分解の要素が定数の場合は定数を格納し、
その分解の要素が他の分解を参照するものである場合は、前処理部で特定した構造が同一な部分木に対応する部分構造であるグラフ構造データが既に構築されている場合には、当該ポインタの指す先を当該既に構築されたグラフ構造データの情報格納先を指すポインタの情報を格納し、そうでない場合には、前記他の分解に対応するグラフ構造データを作成すると共に当該他の分解に対応するグラフ構造データの情報格納先を指すポインタの情報を格納することにより生成される
第2項記載のデータ生成装置。
(第5項)
所定の木構造に従って論理関数の分解を表現したグラフ構造データを生成するデータ生成装置が実行するデータ生成方法であって、
前記論理関数を分解する際の変数順序を特定する順序木に基づいて、前記論理関数の分解の中で構造が同一な分解を表す複数の部分構造が特定された場合に、当該複数の部分構造の中から選択される1つの部分構造を代表部分構造として、
残りの前記構造が同一の部分構造の親ノードに対応する前記グラフ構造中のデータが、前記代表部分構造に対応するグラフ構造データをポインタにより共有するように、前記論理関数に対応するグラフ構造データを生成する構築ステップ、を備える
データ生成方法。
(第6項)
所定の木構造に従って論理関数の分解を表現するグラフ構造のデータ構造であって、
前記所定の木構造における葉の変数に対応する要素の値を、当該葉に対応する前記所定の木構造における節点の節点番号と当該要素を持つノードが従う前記所定の木構造における節点の節点番号との差とし、
ポインタを有する要素の値を、当該ポインタが指す先のノードが従う前記所定の木構造の節点の節点番号と当該要素を持つノードが従う前記所定の木構造の節点の節点番号との差、及び当該ポインタとした
データ構造。
(第7項)
コンピュータを、第1項ないし第4項のうちいずれか1項に記載のデータ生成装置の各部として機能させるためのプログラム。
【0107】
以上、本実施の形態について説明したが、本発明はかかる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【符号の説明】
【0108】
100、200 データ構造変換装置
M01、M11 入力部
M02、M12 前処理部
M03、M13 変換部
M04、M14 出力部
1000 ドライブ装置
1002 補助記憶装置
1003 メモリ装置
1004 CPU
1005 インタフェース装置
1006 表示装置
1007 入力装置
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11A
図11B
図11C
図12
図13