論理式に基づいて二分決定図(BDD)を作成し、作成したBDDを用いて論理式を満たすか否かを判定する方法がある。図1は、BDDの例を示す。図1に示すBDDは、論理式(A and (B or C) and D) or E or (F and G)に基づくものである。この論理式は単なる例示であり、当然のことであるが、以後論理式(A and (B or C) and D) or E or (F and G)を用いて説明する事項は、この論理式に限定される事項ではなく、他の論理式にも成り立つ事項である。論理式中のAは、例えば、「判定対象のデータはAというデータを含む」という命題を意味する。命題Aは、判定対象のデータがAというデータを含む場合に、「真」であると判定される。判定対象のデータは、例えば、文字列、画像、音声などの形式のデータである。B,C,D,E,FおよびGについても同様である。「and」は論理積の演算子であり、「or」は論理和の演算子である。BDDを用いた判定処理おいては、命題の判定結果が「真」である場合には実線で図示される矢印の先の命題の判定に移行し、命題の判定結果が「偽」である場合には点線で図示される矢印の先の命題の判定に移行する。例えば、図1に示すBDDでは、まず、命題Aを満たすか否か(「真」か「偽」か)の判定が行われる。その後、命題Aの判定が「真」である場合には命題Bの判定が行われ、命題Aの判定が「偽」である場合には命題Eの判定が行われる。BDDは、さらに「真(T:True)」と「偽(F:False)」という情報を有する。BDDに基づく順序で各命題の判定が行われ、図1のBDDにおいては、例えば、命題Eの判定結果が「真」である場合に、データが論理式全体を満たす(「真(T:True)」である)と判断される。
図1のBDDを用いて論理式の判定処理を行なった場合に、判定結果が必要な命題の数が判定対象のデータによって異なることがある。例えば、A,C,Fを含むレコードに対しては、命題A(真)→命題B(偽)→命題C(真)→命題D(偽)→命題E(偽)→命題F(真)→命題G(偽)→「偽」の順で判定処理が行なわれ、判定結果が必要な命題の数が7となる。また、A〜Gのいずれも含まないレコードに対しては、命題A(偽)→命題E(偽)→命題F(偽)→「偽」の順で判定処理が行なわれ、判定結果が必要な命題の数が3となる。
上記の論理式は、3つの論理式が論理和演算子で接続されており、そのいずれが満たされても論理式は満たされる。この形式を加法標準形といい、論理和演算子、論理積演算子及び論理否定演算子を含む論理式は、二重否定の除去、ド・モルガンの法則、分配法則といった論理的に等価な変換を行う法則により、加法標準形に変換可能である。3つの論理式とは、(A and (B or C) and D)およびEおよび(F and G)である。逆に、3つの論理式それぞれについて一部でも満たされない場合には、上記の論理式は満たされない。例えば、D((A and (B or C) and D)の一部)と、Eと、F((F and G)の一部)と、を満たさない場合には、上記の論理式は満たされない。
そこで、例えば、命題D、E及びFのいずれも満たさないか(「偽」であるか)の判定処理により、D、E及びFのいずれも「偽」であるという判定結果が、図1のBDDに基づく判定処理の結果よりも先に得られた場合には、図1のBDDに基づく判定処理は終了させてもよい。命題D、E及びFのいずれも「偽」であることが明らかになれば、別途行なわれている論理式の判定処理の結果を得るまでもなく、論理式全体について「偽」であることが明らかなためである。上述したA,C,Fを含むレコードに対して図1のBDDに基づいて判定処理を行なうと、判定結果が必要な命題の数が7であるのに対し、D、E及びFの3つの命題についての判定結果により結果を得ることができる。
論理式に含まれる各命題の判定処理に要する時間は、互いに異なることがある。命題によって判定対象のデータと照合させるデータ(命題Aであれば「A」というデータ)のサイズが異なれば、照合に要する演算量も異なる。また、例えば、ある命題の判定処理においてデータ読み出しなどにエラーが発生した場合など、各命題の内容と関係なく、処理に時間がかかることもある。
上述の通り、例えば、A,C,Fを含むレコードに対しては、命題A(真)→命題B(偽)→命題C(真)→命題D(偽)→命題E(偽)→命題F(真)→命題G(偽)→「偽」の順で、7つの命題に対して判定処理が行なわれる。例えば、上記の論理式に含まれる命題Cの処理に多くの時間を要したとすると、命題Cの判定処理の遅れにより、A,C,Fを含むレコードに対して図1のBDDに基づいて行なわれる検索処理全体が遅れてしまう。しかしながら、命題D、E及びFの判定処理の結果が「偽」であることが先に明らかになる場合には、命題Cの判定処理が遅れたとしても、論理式全体についての処理時間が長くなることが抑制される。
上記のような論理式の判定処理は、例えば、検索処理に用いられる。検索条件を論理式で表し、データベースから順次読み出されるデータに対して論理式を満たすか否かの判定処理を行ない、論理式を満たすデータを検索条件に合致するデータとして返すなどにより、検索処理が行なわれる。
図2は、本実施形態におけるシステム構成例を示す。図2に示すシステムは、コンピュータ1、記憶装置2、ネットワーク3、コンピュータ4、ネットワーク5を含む。コンピュータ1は、例えば、記憶装置2に記憶されたファイルの格納処理、管理、検索処理(判定処理を含む)を行なう。記憶装置2は、記録媒体2aを含み、コンピュータ1の制御に応じて記録媒体2aへのデータの書き込み・読み出しを行なう。コンピュータ4は、ネットワーク3を介してコンピュータ1と通信する。コンピュータ4は、例えば、コンピュータ1に検索要求を送信し、コンピュータ1から検索結果を受信する。また、例えば、コンピュータ4は、コンピュータ1にファイルをアップロードする。コンピュータ4は図2に示す台数に限定されるものではない。ネットワーク3は、例えば、インターネットやイントラネットなどのネットワークである。コンピュータ1と記憶装置2とは、ネットワーク5を介して通信する。ネットワーク5はインターネットやイントラネットでもよいし、SAN(Storage Area Network)など、ファイバチャネルなどを用いたネットワークでもよい。コンピュータ1は、例えば、コンピュータ4から検索要求を受けた場合に、記憶装置2に記憶されたファイルを検索し、検索結果をコンピュータ4に送信する。また、例えば、コンピュータ1は、コンピュータ4からファイルのアップロード要求を受けた場合に、記憶装置2に含まれる記録媒体2aにファイルを書込む。
図3は、図2に示すシステム構成に含まれるコンピュータ1の機能構成例を示す。コンピュータ1は、処理部11、記憶部12、通信部13及び通信部14を含む。処理部11は、受付部111、生成部112、読出部113、判定部114及び通知部115を含む。処理部11は、記憶装置2への検索処理、ファイル管理処理、ファイル格納処理に関する演算と、記憶部12、通信部13及び通信部14の制御を行なう。記憶部12は、処理部11のワークエリアとしてデータを記憶する。通信部13は、ネットワーク3を介したコンピュータ4との通信処理を行なう。通信部14は、ネットワーク5を介した記憶装置2との通信処理を行なう。
受付部111は、例えば、コンピュータ4から通信部13を介して検索要求を受け付け、受け付けた検索要求について、記憶部12に記憶された管理テーブルT1(図10参照)に情報を書込む。生成部112は、受付部111が受け付けた検索要求に含まれる検索条件の論理式に基づいて、論理式の判定処理に用いる論理判定テーブルT2(図11A〜C参照)を生成する。
生成部112が生成する論理判定テーブルT2は、判定部114(または、後述の論理判定部1141)の論理判定において用いられる。論理判定テーブルT2は、命題及びその命題の判定結果の組と、他の命題と、を関連付けた情報を含む。例えば、命題及びその判定結果の1つの組に対して、1または複数の命題、もしくは論理式全体の判定結果を示す情報が関連付けられる。命題同士がどのように関連付けられるかは、生成部112により、受付部111が受け付けた論理式に基づいて決められる。論理判定テーブルT2の生成方法の詳細については後述する。例えば、論理式(Aand(BorC)andD)orEor(FandG)について作成した論理判定テーブルT2には、図1に示される全ての命題同士の関連性が含まれてよい。例えば、論理判定テーブルT2に含まれる各レコードは、命題A(真)→命題B、命題B(偽)→命題C・・・などの関連性を示す情報を含む。
また、論理式が命題群(1または複数の命題を含む)の論理和となる(前述の通り、論理式は加法標準形に変換可能される)場合に、論理判定テーブルT2により、少なくとも、論理和演算子で接続された複数の命題群のそれぞれと少なくとも1つの命題が共通する命題群に含まれる命題同士の関連性が示される。すなわち、生成部112は、受付部111が受け付けた論理式内で、論理和演算子で互いに接続された1つの命題または命題群のそれぞれから少なくとも命題を1つ選択し、選択された命題群に含まれる命題同士の関連性(判定結果と次に判定する命題との関係)を示す情報を生成する。ちなみに、この場合に、論理式内で論理和演算子により接続される命題群は、1又は複数の命題同士が論理積演算子で接続されたものである。上記のように論理和演算子により接続される各命題群から命題を選択する場合に、生成部112は、互いに論理積演算子で接続された1又は複数の命題のうちのいずれかを選択する。生成部112により選択された命題群は、例えば、論理式(Aand(BorC)andD)orEor(FandG)については、命題D、命題Eおよび命題Fを含む。1つの命題、もしくは1又は複数の命題同士の論理積である命題群による論理和である論理式である論理式(Aand(BorC)andD)orEor(FandG)に対して、命題D、命題Eおよび命題Fを含む命題群は、論理式(Aand(BorC)andD)orEor(FandG)に含まれる1つの命題および命題群のそれぞれと、1つの命題か、命題群に含まれる1又は複数の命題のいずれかを共通に含んでいる。その場合、作成される論理判定テーブルT2は、例えば、命題D(偽)→命題E、命題E(偽)→命題F、命題F(偽)→「偽」といった関連性を示す。
読出部113は、生成部112が論理判定テーブルT2を生成すると、通信部14を介して記憶装置2に記憶されたデータを読み出す。判定部114は、読出部113が読み出したデータに対して、論理判定テーブルT2に基づいて論理式の判定処理を行なう。判定部114は、判定処理の結果、論理式を満たすデータが存在した場合に、そのデータを管理テーブルT1に書き込む。判定部114は、判定処理の結果、1つも論理式を満たすデータが存在しなかった場合には、データが存在しなかった旨を管理テーブルT1に書き込む。通知部115は、判定部114が判定処理を終えた場合に、管理テーブルT1に書き込まれた情報に基づいて応答情報を生成し、生成した応答情報をコンピュータ4宛に送信させる制御を通信部13に対して行なう。
図4は、コンピュータ1に含まれる判定部114の機能構成例を示す。判定部114は、例えば、論理判定部1141、命題判定部1142および記憶部1143を含む。論理判定部1141は、生成部112が生成した論理判定テーブルT2と、命題判定部1142の判定結果に応じて、読出部113が読み出したデータに対して、論理式全体の判定を行なう。命題判定部1142は、論理式に含まれる各命題についての判定処理を、読出部113が読み出したデータに対して行なう。記憶部1143は、命題判定部1142が各命題について判定した結果を記憶する。記憶部1143が記憶する判定情報は、命題判定部1142によって更新される。また、記憶部1143は、論理判定部1141による判定状況を示す状態情報を記憶する。記憶部1143が記憶する状態情報は、論理判定部1141によって更新される。状態情報は、例えば、図12に示す2種類の情報を含む。論理判定部1141および命題判定部1142の処理は、例えば、それぞれで並列に行なわれる。さらに、例えば、論理判定部1141および命題判定部1142は、それぞれの処理を1または複数に並列処理で実行する。
論理判定部1141の処理について、さらに説明する。論理判定部1141は、例えば、論理判定テーブルT2を参照して、処理対象の命題を決定する。次いで、論理判定部1141は、例えば、処理対象の命題について命題判定部1142が判定した結果を読み出し、論理判定テーブルT2において、処理対象の命題とその命題についての判定結果との組と関連付けられた命題をさらに読み出し、次の処理対象の命題とする。命題判定部1142による判定結果が得られない場合には、論理判定部1141は、例えば、処理対象の命題を識別する情報を保持したまま、判定結果が得られるまで待機する。論理判定テーブルT2から繰り返し情報を読み出し、論理判定テーブルT2から論理式全体の判定結果を示す情報が読み出された場合に、論理判定部1141は、読出部113が読み出したデータに対する処理を終了する。論理式全体の判定結果が真である場合には、管理テーブルT1に判定対象のデータを示す情報を格納する。
論理判定部1141は、さらに、上記の処理とともに、論理判定テーブルT2を参照して、生成部112により選択された命題群について命題群について関連性を辿る処理を行なう。例えば、論理式(Aand(BorC)andD)orEor(FandG)においては、命題D(偽)→命題E(偽)→命題F(偽)→「偽」などの順序で判定結果を辿る。命題Eが真であるなど、判定結果を辿れなくなった場合には、論理判定部1141はこの処理を終了する。
論理判定部1141は、例えば、図11Bの論理判定テーブルT2bに示される関連性を辿ることにより図1に示すBDDと同じ手順で命題の判定結果を参照してもよい。しかしながら、その場合は、論理判定部1141は、他方で、図11Cの論理判定テーブルT2cを用いて、論理和演算子で接続された複数の命題群のそれぞれと少なくとも1つの命題が共通する命題群について関連性を辿る処理を行なう。他にも、論理判定部1141は、例えば、図11Aの論理判定テーブルT2aを用いて、一方で命題の判定結果が真である場合の命題同士の関連性を辿るとともに、他方で命題の判定結果が偽である場合の命題同士の関連性を辿ることとしてもよい。論理判定テーブルT2a〜T2cについては後述する。
図3及び4に示す機能構成のコンピュータにより処理が行なわれると、BDDを用いた場合には、論理式に含まれるほとんどの命題の判定を経由してしまうケースにおいても、論理式全体の判定結果を遅れにくくすることができる。例えば、論理判定部1141は、少なくとも、論理和演算子で接続された複数の命題群のそれぞれと少なくとも1つの命題が共通する命題群の命題同士の関連性を辿ることとなる。その場合、複数の命題群のそれぞれと少なくとも1つの命題が共通する命題群のいずれも偽であれば、論理式全体が偽であることが明らかであり、BDDを用いた判定処理が遅れたとしても、論理式全体の判定処理を終了することができる。
図5は、本実施形態における他のシステム構成例を示す。図2に示したシステムは、図5に示すように構成されてもよい。図5のシステムにおいては、図2に示すコンピュータ1の機能を複数のコンピュータにより実現する。例えば、図2のコンピュータ1に代えて、コンピュータ1A1,1A2、コンピュータ1B1〜1B4、ロードバランサ6及びネットワーク7がシステムに含まれる。コンピュータ1A1,1A2は、検索要求の受け付けと検索結果の応答を行ない、コンピュータ1B1〜1B4を用いて検索処理を実行させる制御を行なう。コンピュータ1B1〜1B4は、コンピュータ1A1,1A2の制御に応じて検索要求に含まれる論理式の判定処理を行なう。コンピュータ1A1〜1A2は2台設けられ、コンピュータ1B1〜1B4は4台設けられているが、台数はこれに限定されるものではない。例えば、検索要求の数が増大する場合には、それに応じてコンピュータ1A1,1A2の台数を増やしてもよい。その場合には、論理式の判定処理の数も増大するので、コンピュータ1B1〜1B4の台数を増やしてもよい。さらに、検索処理の性能要件に応じてコンピュータ1B1〜1B4の台数を増やしてもよい。1つの検索要求に対して、複数のコンピュータで検索対象のデータの範囲を分担して処理を行なうことで、より短い時間で検索処理を行なうことができるためである。ロードバランサ6は、例えば、コンピュータ4から送られてきた検索要求をコンピュータ1A1,1A2のいずれかに振り分ける処理を行なう。ネットワーク7は、例えば、LAN(Local Area Network)などのネットワークであり、コンピュータ1A1〜1A2及びコンピュータ1B1〜1B4を接続する。
図6は、図5に示すシステム構成におけるコンピュータ1A1の機能構成例を示す。コンピュータ1A1は、処理部11A、記憶部12A、通信部13及び通信部15を含む。処理部11Aは、受付部111及び通知部115を含む。受付部111は、例えば、コンピュータ4からロードバランサ6及び通信部13を介して検索要求を受け付けた場合に、コンピュータ1B1〜1B4のそれぞれに、判定処理対象のデータ範囲の指定と、受け付けた検索要求に基づく判定処理の要求と、を通信部15に送信させる。通信部15は、ネットワーク7を介した通信処理を行なう。通知部115は、コンピュータ1B1〜1B4から通信部15を介して判定処理の結果を受け取った場合に、受け取った結果に基づく応答をコンピュータ4に対して行なう。記憶部12Aは、処理部11Aの処理に用いるデータを記憶するワークエリアであり、例えば、各コンピュータ1B1〜1B4に割り当てるデータ範囲などを記憶する。
図7は、図5に示す他のシステム構成におけるコンピュータ1B1の機能構成例を示す。コンピュータ1B1は、処理部11B、記憶部12B、通信部14及び通信部16を含む。処理部11Bは、生成部112、読出部113及び判定部114を含む。通信部16は、ネットワーク7を介した通信処理を行なう。生成部112は、通信部16を介してコンピュータ1A1またはコンピュータ1A2から受信した判定処理の要求に基づいて、論理判定テーブルT2を生成する。読出部113は、通信部16を介してコンピュータ1A1またはコンピュータ1A2から受信したデータ範囲の指定に応じて読出し処理を行なう。判定部114は、読出部113が読み出したデータに対して、論理判定テーブルT2に基づいて判定処理を行ない、判定処理の結果を、判定処理の要求元のコンピュータに送信する。判定処理の結果は、例えば、論理式を満たすデータ(またはデータを識別する情報、データの所在を示す情報など)もしくは論理式を満たすデータが存在しない旨を示すデータである。
図8は、コンピュータ1のハードウェア構成例を示す。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記録媒体305、通信インターフェース(I/F)306、入力インターフェース(I/F)307、出力インターフェース(I/F)308、SANインターフェース(I/F)309、などを含む。それぞれのハードウェアはバス310を介して接続している。通信I/F306はネットワーク3を介した通信の制御を行なう。SAN I/F309は、ネットワーク5を介した通信の制御を行なう。入力インターフェース307は、入力装置311と接続されており、入力装置311から受信した入力信号をプロセッサ301に伝達する。出力インターフェース308は、出力装置312と接続されており、出力装置312に、プロセッサ301の指示に応じた出力を実行させる。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAM以外にもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記録媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記録媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記録媒体305は、例えば、ハードディスク、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記録媒体である。また、例えば、コンピュータ1は、複数種類の記録媒体それぞれについて、ドライブ装置304及び記録媒体305を設ける。
入力装置311は、操作に応じて入力信号を送信する装置である。入力装置311は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力装置312は、コンピュータ1の制御に応じて情報を出力する装置である。出力装置312は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力装置311及び出力装置312として用いられる。
プロセッサ301は、ROM303や記録媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って処理部11の処理を行なう。その際に、RAM302はプロセッサのワークエリアとして用いられ、記憶部12の機能が実現される。プロセッサ301が読み出すプログラムについては、図9を用いて説明する。
図9は、コンピュータ1のソフトウェア構成例を示す。コンピュータ1において、図8に示すハードウェア群24の制御を行なうOS23(オペレーティングシステム)が動作する。OS23に従った手順でプロセッサ301が動作して、ハードウェア24の制御・管理が行なわれることにより、アプリケーションプログラムやミドルウェアによる処理がハードウェア24により実行される。さらに、コンピュータ1において、例えば、検索プログラム21やSAN制御プログラム22などのミドルウェアが、RAM302に読み出されてプロセッサ301により実行される。プロセッサ301がSAN制御プログラム22に基づく処理を行なうことにより、通信部14の処理を行なうように、HBA(Host Bus Adaptor)などのSAN I/F309が制御される。また、プロセッサ301が検索プログラム21に基づく処理を行なうことにより、(それらの処理をOS23に基づいてハードウェア24を制御して)処理部11(11Aおよび11Bも含む)、記憶部12(12Aおよび12Bも含む)、通信部13、通信部14、通信部15、通信部16の機能が実現される。図9に示すソフトウェア構成例において、検索プログラム21およびSAN制御プログラム22はミドルウェアと説明しているが、OS23に一機能として含まれても良いし、OS23上で動作するアプリケーションプログラムであってもよい。
受付部111の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302などにデータを書き込むことなどにより実現される。生成部112の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302に記憶されたデータを用いて演算を行ない、演算結果をRAM302に書き込むなどにより実現される。読出部113の機能は、例えば、プロセッサ301が検索プログラム21に基づき、SAN I/F309を制御し、取得したデータをRAM302に書き込むなどにより実現される。判定部114の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302に格納されたデータを用いて演算を行ない、演算結果をRAM302もしくはプロセッサ301が備えるレジスタに格納するなどにより実現される。さらに詳述すると、論理判定部1141の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302に格納されたデータを読み出して演算を行ない、レジスタやRAM302などに演算結果を保持させるなどにより実現される。論理判定部1142の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302に格納されたデータを読み出して演算を行ない、レジスタなどに演算結果を保持させるなどにより実現される。記憶部1143の機能は、例えば、プロセッサ301が備えるレジスタなどにより実現される。通知部115の機能は、例えば、プロセッサ301が検索プログラム21に基づき、RAM302に格納されたデータを送信させるように通信I/F306を制御するなどにより実現される。
図10は、管理テーブルT1を示す。管理テーブルT1は、検索要求ごとにレコード設け、例えば、受信日時、検索要求元、検索条件式、照合テーブルおよび検索結果の項目を有する。受付部111の処理により、受信日時の項目に、例えば、検索要求を受付部111が受信した日時を示す情報が格納される。受信日時の項目に格納される情報は、検索要求を識別する情報として用いられてもよい。受付部111の処理により、検索要求元の項目に、例えば、検索要求を送信したコンピュータを識別する情報が格納される。検索要求を送信したコンピュータを識別する情報は、例えば、検索要求を送信したコンピュータのIPアドレスである。例えば、通知部115は、管理テーブルT1の検索要求元の項目に格納された情報を、検索処理の結果(応答)の送信先に用いる。受付部111の処理により、照合テーブルの項目に、例えば、検索要求に基づいて生成された照合テーブルへのポインタが格納される。生成部112が照合テーブルを生成した際にポインタを格納し、判定部114は管理テーブルのポインタに基づいて照合テーブルから情報を読み出す。受付部111の処理により、検索結果の項目に、例えば、検索要求に応じて行なわれた処理の結果を示す情報が格納される。処理の結果を示す情報は、例えば、検索条件の論理式を満たすデータ、論理式を満たすデータを識別する情報または所在を示す情報、もしくは論理式を満たすデータが存在しない旨を示す情報などである。管理テーブルT1が、図6に示すコンピュータ1A1の記憶部12Aに記憶される場合には、例えば、各コンピュータ1B1〜1B4に判定処理を要求したデータの範囲を示す情報を、さらに管理テーブルT1に含めてもよい。さらに、例えば、処理の結果を示す情報を、コンピュータ1B1〜1B4のそれぞれについて格納するように項目を設けてもよい。
図11は論理判定テーブルの例を示す。図11Aは、論理判定テーブルT2aを示す。論理判定テーブルT2aは、論理判定における要素ごとにレコードを有する。論理判定における要素とは、例えば、命題や、論理判定の初期状態を示す情報である。論理判定テーブルT2aは、例えば、論理判定の初期状態を2つ([真]始点および[偽]始点)含む。各レコードは、要素、[真]子要素および[偽]子要素の項目を有する。各レコードにおいて、要素の項目には、要素を識別する情報が格納される。[真]子要素の項目には、次に「真」であるか判定される要素を識別する情報が格納される。また、[偽]子要素の項目には、次に「偽」であるか判定される要素を識別する情報が格納される。[真]子要素および[偽]子要素の項目のそれぞれには、1または複数の要素を示す情報が格納される。また、[真]子要素および[偽]子要素の項目には、次に判定される要素以外にも、判定処理の終了を示す情報([真]終点または[偽]終点)が含まれる。
論理判定部1141が論理判定テーブルT2aに基づいて命題間の関連性を辿る例について説明する。論理判定部1141は、[真]始点から辿る際には[真]子要素のみを参照し、[偽]始点から辿る際には[偽]子要素のみを参照する。[真]始点から辿る際には、論理判定部1141は、A,E及びFのいずれかを選択し、選択した命題についての判定結果を読み出す。論理判定部1141は、複数の子要素がある場合にいずれかを選択することとしなくとも、複数の子要素それぞれについて関連性を辿る処理を並列で行なうようにしてもよい。Aを選択した場合に、Aの判定結果が真であると、論理判定部1141は、さらに、BまたはCを選択する。論理判定部1141がBを選択した場合にBの判定結果が偽であると、論理判定部1141は、[真]始点から辿る処理を中止する。もしくは[真]始点から辿る処理において、選択されなかった命題(E,F及びC)から処理を再開することとしても良い。[偽]始点から辿る際には、論理判定部1141は、A,B及びDのいずれかを選択し、選択した命題についての判定結果を読み出す。Dを選択した場合に、Dの判定結果が偽であると、論理判定部1141は、さらにEを選択する。論理判定部1141がEを選択した場合にEの判定結果が真であると、論理判定部1141は、[偽]始点から辿る処理を中止する。もしくは[偽]始点から辿る処理において、選択されなかった命題(E,F及びC)から処理を再開することとしても良い。
図11Bは論理判定テーブルT2bを示し、図11Cは論理判定テーブルT2cを示す。論理判定テーブルT2b及び論理判定テーブルT2cは、論理判定における要素ごとにレコードを有する。論理判定における要素とは、例えば、命題や、論理判定の初期状態(始点)を示す情報である。各レコードは、要素、判定結果および子要素の項目を有する。各レコードにおいて、要素の項目には、要素を識別する情報が格納される。判定結果の項目には、その要素についての判定結果が格納される。また、子要素の項目には、次に判定結果を参照される要素を識別する情報が格納される。子要素の項目には、1つの要素を示す情報、または論理式全体の判定結果を示す情報が格納される。
図11B及びCを用いて、図4に示す論理判定部1141が行なう処理の例を説明する。論理判定部1141は、図11Bの論理判定テーブルT2bの始点と図11Cの論理判定テーブルT2cの始点から関連性を辿る。論理判定部1141は、それぞれの始点から、要素と要素の判定結果(真または偽)に応じて次に参照する子要素を決定する。例えば、論理判定部1141は、論理判定テーブルT2bの始点の情報を参照してAを選択する。Aを選択すると、論理判定部1141は、命題判定部1142のAについての判定結果を参照する。論理判定部1141は、Aの判定結果が真である場合には、Bを選択する。論理判定部1141がBを選択し、Bの判定結果が偽であると、論理判定部1141はCを選択する。C以降も論理判定部1141は、命題判定部1142の判定結果に基づいて論理判定テーブルT2bを辿り、論理式全体の判定を行なう。その一方で、論理判定部1141は、論理判定テーブルT2cを始点から辿る。始点の子要素のDを選択すると、論理判定部1141は、命題判定部1142がDについて偽と判定していれば、Dの子要素のEを選択する。さらに、命題判定部1142がEについて偽と判定していれば、論理判定部1141は、例えば、Eの子要素のFを選択する。論理判定部1141は、Fを選択し、命題判定部1142がFについて偽と判定していれば、論理式全体が偽であると判定する。例えば、Dが真であるなどと判定された場合には関連性を辿る処理を停止する。
図12は、状態情報の例を示す。図12A及びBは、論理判定部1141が命題判定部1142の判定結果を参照中である命題(要素)を示している。図12A及びBに示されるテーブルT3a及びT3bは、記憶部1143に保持される。図11Aを用いて関連性を辿る場合も、図11B及びCを用いて関連性を辿る場合も、論理判定部1141は、図12に示す2以上の情報を記憶部1143に保持して処理を行なう。図11Aを用いて関連性を辿る場合には、例えば、図12Aに示すテーブルT3aに[真]始点から辿って得られた要素が保持され、図12Bに示すテーブルT3bに[偽]始点から辿って得られた要素が保持される。また、図11B及びCを用いて関連性を辿る場合には、例えば、図12Aに示すテーブルT3aに図11Bを用いて辿って得られた結果が保持され、図12Bに示すテーブルT3bに図11Cを用いて辿って得られた結果が保持される。また、論理判定部1141は、論理判定テーブルT2を参照して子要素を選択した場合に、テーブルT3に保持される情報を、選択した子要素を識別する情報に更新する。
図13は、判定情報の例を示す。記憶部1143は、判定情報を含むテーブルT4を保持する。テーブルT4は、論理式に含まれる各命題と、各命題についての判定結果を格納する領域を備える。命題判定部1142は、判定対象のデータが命題を満たすか否かを判定し、判定結果をテーブルT4に格納する。
以下に、論理式判定処理の全体の流れを説明する。図14は、コンピュータ1による検索要求への応答処理の流れを示すフローチャートである。コンピュータ1が検索プログラム21に基づく処理を開始し(S100)、受付部111が検索要求をコンピュータ4から受け付ける(S101)と、生成部112は、論理判定テーブルT2を生成する(S102)。読出部113が、受付部111が受け付けた検索要求に含まれる論理式の判定対象のデータを、記憶装置から読み出す。読出部113は、判定対象のデータがあるか否かを判定する(S103)。判定対象のデータがある場合には、読出部113は、判定対象のデータを取り出す(S104)。判定部114に含まれる命題判定部1142は、論理式に含まれる各命題を、S104で取りだした判定対象のデータが満たすか否かを判定する(S105)。S106では、論理判定部1141が、S105の結果と、S102で生成した論理判定テーブルとを参照して、判定対象のデータが論理式全体を満たすか否かを判定する(S106)。S106の処理を終え、論理式が真である場合(S107:Yes)には、判定部114が、判定対象のデータを管理テーブルT1に書き込み(S108)、次にS103の処理が行なわれる。論理式が偽である場合(S107:No)には、次にS103の処理が行なわれる。一方で、読出部113が、S103で、判定対象のデータがないと判断した場合(S103:No)には、論理式が真であるデータがあったか否かを判定し(S109)、真のデータがあった場合(S109:Yes)には、次にS101の処理が行なわれる。論理式が真であるデータが無かった場合には、管理テーブルT1に、論理式を満たすデータがなかった旨の情報が書込まれ(S110)、次にS101の処理が行なわれる。
以下に、生成部112が論理判定テーブルを生成する処理について、さらに説明する。
まず、図11Aに示す論理判定テーブルT2aを生成する処理について説明する。論理判定テーブルT2aは、図15及び図16に示す有向非循環グラフに対応するテーブルである。
図15及び図16に、論理判定テーブルT2aに対応する有向非循環グラフを示す。図15に示すグラフは、図11Aにおける[真]始点から関連性を辿る経路に対応する。図11Aにおいて、[真]始点の次には[真]子要素としてA,E及びFが対応付けられており、図15においても[真]始点の配下にA,E及びFが配置されている。さらに、図11Aでは、Aには[真]子要素としてB及びCが対応付けられており、図15でもAの配下にB及びCが配置されている。一方、図16に示すグラフは、図11Aにおける[偽]始点から関連性を辿る経路に対応する。図11Aにおいて、[偽]始点の次には[偽]子要素としてA,B及びDが対応付けられており、図16においても[偽]始点の配下にA,B及びDが配置されている。さらに、図11Aでは、Dには[偽]子要素としてEが対応付けられており、図16でもDの配下にEが配置されている。論理判定部1141による判定では、図15及び図16に図示される有向非循環グラフは、各ノードの条件を充足した(Satisfied)場合にのみ次ノードに移行させる構造になっている。そのため、この有向非循環グラフの図について『SAT graph(Satisfiability graph)』などの呼称が用いられると分かりやすい。
図17に、論理判定テーブルT2aを生成する処理のフローチャートを示す。生成部112は、受付部111が検索要求を受け付けて管理テーブルT1に情報を格納する(S200)と、論理判定テーブルT2a生成の前処理を行なう(S201)。
図18は、論理判定処理の前処理のフローチャートである。前処理が開始される(S300)と、生成部112は、論理式の構文解析処理を行なう(S301)。例えば、論理式(A and (B or C) and D) or E or (F and G)が構文解析されて、図19の有向非循環グラフのデータが得られる。生成部112は、図19に示す有向非循環グラフデータが得られると、記憶部12に有向非循環グラフデータを格納する。図19の有向非循環グラフにおいて、葉部分のデータは命題であり、節部分のデータは論理演算子であり、有向非循環グラフ全体で命題間の接続関係を示す。
図19の有向非循環グラフデータは、例えば、論理式の始めから順に論理式に含まれる要素で有向非循環グラフデータを生成していくことで生成される。生成部112は、例えば、論理式(A and (B or C) and D) or E or (F and G)においては、Aおよび(B or C)がand演算子で接続されている部分について、有向非循環グラフデータを生成する。生成部112は、Aについてのデータ構造体、B or Cについてのデータ構造体、andについてのデータ構造体を生成する。Aについてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ1)および命題Aを示す情報を含む。B or Cについてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ2)および部分的な論理式B or Cを示す情報を含む。and演算子についてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ3)、演算子andを示す情報、Aについてのデータ構造体のポインタ情報(ポインタ1)およびBorCについてのデータ構造体のポインタ情報(ポインタ2)を含む。
データ構造体が生成されたB or Cは、論理式であるため、さらに構文解析される。生成部112は、論理式B or Cに基づき、Bについてのデータ構造体、Cについてのデータ構造体、orについてのデータ構造体を生成する。Bについてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ4)および命題Bを示す情報を含む。Cについてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ5)および命題Cを示す情報を含む。or演算子についてのデータ構造体は、その構造体自身を示すポインタ情報(図19ではポインタ2)、演算子orを示す情報、Bについてのデータ構造体のポインタ情報(ポインタ4)およびCについてのデータ構造体のポインタ情報(ポインタ5)を含む。
生成部112は、同様の手順により、さらに論理式中の未解析部分を解析して有向非循環グラフデータを生成する。例えば、解析済のA and (B or C)に対し、命題Dがandで接続されている部分について、生成部112は、有向非循環グラフデータをさらに生成する。例えば、andについてのデータ構造体が、命題Dについてのデータ構造体のポインタ情報と、先に生成されたand演算子についてのデータ構造体のポインタ情報(図19ではポインタ3)とを含む。上記の例では、論理式の始めから有向非循環グラフデータを生成する手順を示したが、この手順のみに限られるものではなく、論理式の後ろから記憶像データを生成してもよい。
上記の手順で論理式の構文解析が行なわれることで、有向非循環グラフデータが生成されると、生成部112は、記憶部12に記憶領域を確保し、確保した記憶領域内に[真]始点の要素を持つレコードと、[偽]始点の要素を持つレコードを追加する(S302)。さらに、生成部112は、S301で生成した有向非循環グラフデータの最上位ノード(root要素)のレコードを追加する(S303)。この際、生成部112は、論理判定テーブルT2aの[真]始点を要素とするレコードの[真]子要素にroot要素を示す情報を格納し、root要素を要素とするレコードの[真]子要素に[真]終点という要素を追加する。逆に、生成部112は、論理判定テーブルT2aの[偽]始点を要素とするレコードの[偽]子要素にroot要素を示す情報を追加し、root要素を要素とするレコードの[偽]子要素に[偽]終点という要素を追加する。S303の処理後、生成部112は、キュー(グラフ作成キュー)を用意し、用意したキューにroot要素を示す情報を格納する(S304)。生成部112は、S304の処理を終えると、図17に示すフローチャートの処理に戻る(S305)。
S201の処理後、生成部112は、グラフ作成キューに要素が格納されているか否かを判断する(S202)。グラフ作成キューに要素が格納されていない場合(S202:No)には、図17のフローを終了する(S203)。グラフ作成キューに要素が格納されている場合(S202:Yes)には、生成部112は、グラフ作成キューから1つ要素を取得する(S204)。例えば、初回の処理においては、root要素が取得される。次に、生成部112は、取得した要素が論理演算子であるか否かを判断する(S205)。取得した要素が演算子でない場合(S205:No)は、生成部112は、S202の処理に戻る。一方、取得した要素が演算子の場合(S205:Yes)には、生成部112は、取得した要素を示す情報を、「要素」の項目に含むレコードを、取得した要素の子要素の数だけコピーする(S206)。S206の処理において、生成部112は、図19の有向非循環グラフのデータを参照して子要素の数を判断する。例えばroot要素であれば、子要素のポインタを2つ(ポインタ7及びポインタ8)有しているので、子要素の数は2である。S206の処理後、生成部112は、コピーして得られたレコードの「要素」の項目を、子要素を示す情報に更新する(S207)。例えば、取得した要素がroot要素である場合には、生成部112は、コピーして得られたそれぞれのレコードの「要素」の項目を、ポインタ7のand要素、ポインタ8のor要素に更新する。
S207の処理後、生成部112は、取得した要素がand演算子であるかor演算子であるかの判定を行なう。(S208)。取得した要素がor演算子である場合(S208:or)には、生成部112は、「[真]子要素」の項目に取得した要素を示す情報を含むレコードを抽出し、そのレコードの「[真]子要素」の項目に含まれる取得した要素を示す情報を、取得した要素の子要素を示す情報に更新する(S209)。例えば、取得した要素がroot要素である場合には、ポインタ9のor要素を除いて、ポインタ7のand要素とポインタ8のor要素が追加される。
一方、取得した要素がand演算子である場合(S208:and)には、生成部112は、取得した要素の子要素のうち、一方の子要素(A)のレコードの「[真]子要素」の項目を、他方の子要素(B)を示す情報に更新する(S210)。さらに、S210の処理後、生成部112は、「[真]子要素」の項目に取得した要素を示す情報を含むレコードを抽出し、そのレコードの「[真]子要素」の項目に含まれる、取得した要素を示す情報を、S210の処理における一方の子要素(A)を示す情報に更新する(S211)。例えば、取得した要素がポインタ7のand要素である場合には、ポインタ7のand要素を除いて、ポインタ3のand要素が追加される。その場合は、ポインタ3のand要素のレコードの「[真]子要素」の項目には、ポインタ6の命題Dを示す情報が格納される。
S211またはS209の処理後、生成部112は、取得した要素のレコードを削除し(S212)、取得した要素の子要素をグラフ作成キューに格納し(S213)、S202の処理に戻る。S213の処理で、例えば、取得した要素がroot要素である場合は、グラフ作成キューに、ポインタ7のand要素及びポインタ8のor要素が追加される。ちなみに、S210とS211の処理は順序を入れ替えても構わないし、S212とS213の処理も順序を入れ替えて構わない。
生成部112が図17に示すS202〜S213の処理を繰り返すことにより、論理判定テーブルT2aが生成される。その経過を、図15に示すような論理判定テーブルT2aに対応する有向非循環グラフを用いて説明する。例えば、S201処理後の論理判定テーブルT2aに基づいてグラフ([真]始点から関連性を辿る場合のグラフ)を生成すると、図20Aに示すグラフになる。この時点でグラフ作成キューには、root要素を示す情報(例えばポインタ9)が格納されている。生成部112がS202〜S213の処理を行なうことにより、root要素であるポインタ9のor要素に関する情報が、ポインタ9のor要素の子要素であるポインタ7のand要素およびポインタ8のor要素に置き換えられる。その時点の論理判定テーブルT2aに対応するグラフを図20Bに示す。図20Bにおいては、[真]始点に、ポインタ7のand要素及びポインタ8のor要素が関連付けられている。さらに、生成部112がS202〜S213の処理を行なうことにより、ポインタ7のand要素に関する情報が、ポインタ3のand要素およびポインタ6の命題Dに置き換えられる。この時点での論理判定テーブルT2aに対応するグラフを図20Cに示す。さらに、生成部112がS202〜S213の処理を行なうことにより、ポインタ3のand要素に関する情報が、ポインタ1の命題Aおよびポインタ2のor要素に置き換えられる。この時点での論理判定テーブルT2aに対応するグラフを図20Dに示す。ポインタ6の命題Dの要素がグラフ作成キューから取得された場合には、S205の判定により、論理判定テーブルT2aの更新は行なわれない。さらに、生成部112がS202〜S213の処理を行なうことにより、ポインタ2のor要素に関する情報が、ポインタ4の命題Bおよびポインタ5の命題Cに置き換えられる。この時点での論理判定テーブルT2aに対応するグラフを図20Eに示す。root要素(ポインタ9のor要素)がグラフ作成キューから取得された場合のS213の処理により、グラフ作成キューにポインタ8のor要素が格納されている。グラフ作成キューからポインタ8のor要素が取得された場合に生成部112がS202〜S213の処理を行なうことにより、ポインタ8のor要素に関する情報が、ポインタ10の命題Eおよびポインタ11のand要素に置き換えられる。この時点での論理判定テーブルT2aに対応するグラフを図20Fに示す。さらに、グラフ作成キューからポインタ11のand要素が取得された場合に生成部112がS202〜S213の処理を行なうことにより、ポインタ11のand要素に関する情報が、ポインタ12の命題Fおよびポインタ13の命題Gに置き換えられる。この時点で論理判定テーブルT2aに対応するグラフは、図15に示すグラフとなる。
図21は、「[偽]始点」から関連性を辿る処理に用いられる論理判定テーブルT2aの生成処理のフローチャートを示す。生成部112は、図17に示すフローチャートの処理を終了すると、図21に示すフローチャートの処理を開始する(S400)。まず、生成部112は、図18に示すS302〜S304の処理を行なう(S401)。図21のS401に含まれるS302の処理においては、生成部112は、[偽]の値を要素カラムに持つ行を追加する。次いで生成部112は、図17に示すS202の処理を行なう(S402)。生成部112は、S202の判断でYesと判断する場合(S402:Yes)はS204〜S207の処理を行ない(S404)、S202の判断でNoと判断する場合(S402:No)には図21のフローチャートの処理を終了する(S403)。S404の処理が終了すると、生成部112は、S208の判断を行なう(S405)。S405の判断の結果、判断対象の演算子がor演算子であると判断した場合には、生成部112は、取得した要素の子要素のうち、一方の子要素(A)のレコードの「[偽]子要素」の項目を、他方の子要素(B)を示す情報に更新する(S406)。さらに、S406の処理後、生成部112は、「[偽]子要素」の項目に取得した要素を示す情報を含むレコードを抽出し、そのレコードの「[偽]子要素」の項目に含まれる、取得した要素を示す情報を、S406の処理における一方の子要素(A)を示す情報に更新する(S407)。S405の判断の結果、判断対象の演算子がand演算子であると判断した場合(S405:and)では生成部112はS408の処理を行なう。すなわち、生成部112は、「[偽]子要素」の項目に取得した要素を示す情報を含むレコードを抽出し、そのレコードの「[偽]子要素」の項目に含まれる取得した要素を示す情報を、取得した要素の子要素を示す情報に更新する(S408)。[真]始点から関連性を辿る処理に用いられる論理判定テーブルT2aの生成とは、or演算子の場合に行なう処理とand演算子の場合に行なう処理とが逆になっている。S407またはS408の処理を終えると、生成部112は、S212およびS213の処理を行ない(S409)、S402の処理に戻る。上記の手順(図17、図18および図21に記載のフローチャート)により生成された論理判定テーブルがマージされることで、図11Aに示す論理判定テーブルT2aが生成される。また、図17、図18および図21に記載のフローチャートに基づく処理が同時に行なわれ、図11Aに示す論理判定テーブルT2aが生成されてもよい。
次に、図11Cの論理判定テーブルT2cを生成する場合の処理について図22のフローチャートに基づいて説明する。図11Bの論理判定テーブルT2bについては、図1に示すBDDに対応するテーブル構造であり、BDDを生成する様々な手法で生成可能である。まず、生成部112は、受付部111が検索要求を受け付けて管理テーブルT1に情報を格納する(S500)と、S201の処理を行なう(S501)。このS501の処理においても、S401と同様に、S501に含まれるS302の処理においては、生成部112は、[偽]の値を要素カラムに持つ行を追加する。次に、生成部112は、S202の判断を行ない(S502)、判断の結果がNoである場合(S502:No)には処理を終了し(S503)、判断の結果がYesである場合(S502:Yes)には、S204〜S207の処理を行なう(S504)。S504の処理後、生成部112は、S208の判断を行なう(S505)。S505の判断において演算子がor演算子である場合には、生成部112は、S406およびS407の処理を行ない(S506)、さらにS213の処理を行なう(S507)。一方、S505の判断において、演算子がand演算子である場合には、生成部112は、「[偽]子要素」の項目に取得した要素を示す情報を含むレコードを抽出し、そのレコードの「[偽]子要素」の項目に含まれる取得した要素を示す情報を、取得した要素の子要素のうちの1つ(子要素(C))を示す情報に更新する(S508)。S508の処理後、生成部112は、グラフ作成キューに子要素(C)を示す情報を格納する(S509)。S507またはS509の処理後、生成部112は、S212の処理を行ない(S510)、S502の処理に戻る。
論理判定テーブルT2cは、論理判定テーブルT2aのうちの[偽]始点から始まる1経路を含むテーブルである。論理判定テーブルT2cを用いた偽判定処理を従来のBDDに基づく判定処理に組み合わせると、BDDに基づく判定処理よりも論理判定テーブルT2cを用いた偽判定処理の方が早く結論を得られる場合がある。その場合には、従来のBDDに基づく判定処理よりも早く論理式の判定結果が得られたことになる。
ちなみに、受付部111が受け付けた検索条件の論理式に論理否定演算子(NOT)が命題に作用している場合には、生成部112は、論理否定演算子と命題をまとめて1つの命題と見なして論理判定テーブルT2を生成する。例えば、not(A)は1つの命題と見なされる。さらに、論理式に否定演算子が作用している場合には、生成部112は、構文解析を行なう前に、ド・モルガンの法則を用いて、単一の命題に論理否定演算子が作用している形式に論理式を変形する。さらに命題判定部1142は、命題に論理否定演算子が作用している命題については、元の命題の真偽を判定し、その判定結果を反転して結果を出力する。例えば、命題判定部1142は、not(A)に対しては命題Aの真偽判定結果が真であれば判定結果を偽とし、命題Aの真偽判定結果が偽であれば判定結果を真とする。
以下に判定部114が行なう判定処理について、さらに説明する。
まず、命題判定部1142は、図14に示すS105の処理を行なう。まず、S105の処理において、命題判定部1142は、記憶部1143または記憶部12にテーブルT4の記憶領域を確保する。次に、命題判定部1142は、論理式に含まれる各命題についてテーブルT4にレコードを生成する。さらに、論理式に含まれる各命題について、命題が判定対象のデータに含まれているか否かを判定し、判定結果をテーブルT4に格納する。命題判定部1142は、論理式に含まれる全ての命題の判定が終了するか、論理式の判定が終了した場合に、処理を終了とする。
次に、論理判定部1141は、図14に示すS106の処理を行なう。図23はS106の論理判定テーブルT2aを用いた論理判定処理のフローチャートを示す。論理判定部1141は、読出部113が判定対象のデータを読み出す(S601)と、記憶部1143または記憶部12にテーブルT3aおよびテーブルT3bの記憶領域を確保する。さらに、論理判定部1141は、記憶部12に記憶された論理判定テーブルT2aを参照して、「[真]始点」のレコードの「[真]子要素」に格納された要素をテーブルT3aに格納し、「[偽]始点」のレコードの「[偽]子要素」に格納された要素をテーブルT3bに格納する(S602)。S602の処理が行なわれると、論理判定部1141は、S603〜S610の処理と、S611〜S618の処理とを並列で行なう。さらに、例えば、S603〜S610の処理と、S611〜S618の処理とのそれぞれについても、並列で多重に処理されてもよい。すなわち、複数のプロセッサコアがそれぞれでS603〜S610の処理を行ない、さらに別の複数のプロセッサコアがそれぞれでS611〜S618の処理を行なっても良い。
論理判定部1141は、記憶部1143に確保された所定の領域に停止を示す情報が格納されていないかどうか(停止フラグが立っているか)を判断する(S603)。停止を示す情報が格納されている場合(S603:No)には、論理判定部1141は、S604〜S610の処理をスキップする。停止を示す情報が格納されていない場合(S603:Yes)には、論理判定部1141は、テーブルT3aに格納された要素を1つ読み出す(S604)。S603〜S610の処理が並列で処理される場合には、S604で読み出された要素は他のプロセッサコアに読み出されない制御を行なうこととしてもよい。S604が行なわれると、論理判定部1141は、S604で読み出した要素について判定結果をテーブルT4から読み出す(S605)。S605で読み出した判定結果が真である場合(S605:Yes)は、論理判定部1141は、S607の処理を行なう。S605で読み出した判定結果が偽であるか、判定結果が読み出せない(命題判定部1142がまだ判定結果を格納していない)場合(S605:No)は、論理判定部1141は、S603の処理に戻る。S607では、論理判定部1141は、論理判定テーブルT2aから、S604で読み出した要素のレコードの「[真]子要素」に格納された要素を読み出す(S607)。S607の処理後、論理判定部1141は、テーブルT3aに格納されており、S604で読み出された要素の情報を、S607で読みだした要素の情報に更新する。(S608)。さらに、論理判定部1141は、S607で読みだした要素が「[真]終点」であるか否かを判断する(S609)。S607で読みだした要素が「[真]終点」でない場合(S609:No)は、論理判定部1141は、S603に戻って処理を行なう。S607で読みだした要素が「[真]終点」である場合(S609:Yes)は、判定対象のデータに対して論理式が「真」である旨を判断し、記憶部1143の所定の領域に停止を示す情報を格納する(S610)。S610の処理後、論理判定処理を終了する(S619)。
論理判定部1141は、S603〜S610の処理を行なう一方で、S611〜S618の処理を行なう。論理判定部1141は、記憶部1143に確保された所定の領域に停止を示す情報が格納されていないかどうか(停止フラグが立っているか)を判断する(S611)。停止を示す情報が格納されている場合(S611:No)には、論理判定部1141は、S612〜S618の処理をスキップする。停止を示す情報が格納されていない場合(S611:Yes)には、論理判定部1141は、テーブルT3bに格納された要素を1つ読み出す(S612)。S611〜S618の処理が並列で処理される場合には、S612で読み出された要素は他のプロセッサコアに読み出されない制御を行なうこととしてもよい。S612が行なわれると、論理判定部1141は、S612で読み出した要素について判定結果をテーブルT4から読み出す(S613)。S613で読み出した判定結果が偽である場合(S614:Yes)は、論理判定部1141は、S615の処理を行なう。S613で読み出した判定結果が真である場合(S614:No)は、S605で判定結果が読み出せない(命題判定部1142がまだ判定結果を格納していない)場合と同様に、論理判定部1141は、S611の処理に戻る。S615では、論理判定部1141は、論理判定テーブルT2aから、S612で読み出した要素のレコードの「[偽]子要素」に格納された要素を読み出す(S615)。S615の処理後、論理判定部1141は、テーブルT3bに格納されており、S612で読み出された要素の情報を、S615で読みだした要素の情報に更新する(S616)。さらに、論理判定部1141は、S615で読みだした要素が「[偽]終点」であるか否かを判断する(S617)。S615で読みだした要素が「[偽]終点」でない場合(S617:No)は、論理判定部1141は、S611に戻って処理を行なう。S615で読みだした要素が「[偽]終点」である場合(S617:Yes)は、判定対象のデータに対して論理式が「偽」である旨を判断し、記憶部1143の所定の領域に停止を示す情報を格納する(S618)。S618の処理後、論理判定処理を終了する(S619)。
論理判定テーブルT2b及びT2cを用いた論理判定処理は、ほぼ図23のフローチャートと同様に行なわれる。その場合、論理判定部1141は、例えば、S607において論理判定テーブルT2bを参照して要素を読み出す。その際、論理判定部1141は、例えば、S606の判定処理を省略して、S605で読みだした判定結果に応じて、S607で論理判定テーブルT2bから要素を読み出す。また、論理判定部1141は、例えば、S615においてテーブルT2cを参照してデータを読み出す。
上記の処理により、論理式の判定処理の効率化が達成される。上述の実施例に限らず、発明を実施できる範囲内において、その構成は、適宜変更可能である。
ちなみに、例えば異常データを検出する場合などには、判定対象データのほとんどが正常なデータであり、そのため、ほとんどの判定対象のデータは、論理式に対して真であると考えられる。論理判定テーブルT2bおよびT2cを用いた判定よりも、論理判定テーブルT2aを用いることで、BDDを用いた場合よりも、判定するまでに判定結果が必要な命題の数が抑制される(BDDでは定められた判定順序に従って判定する)ので、平均判定速度が速くなることが期待できる。
また、そのような場合、例えば、論理判定部1141は、S611〜S618を行なわないようにしてもよい。S604とS605により論理式に含まれる全要素について判定結果が参照され、[真]終点に到達しない場合は、論理式は[偽]であると判定できる。上述のように、論理式が[真]であることがほとんどであり、論理式が[真]であることの判定を高速化したい場合には、S611〜S618を行なわないようにしてもよい。逆に、論理式が[偽]であることがほとんどであり、論理式が[偽]であることの判定を高速化したい場合には、S603〜S610を行なわないようにしてもよい。
また、論理式の判定(例えばBDD)を、論理式全体を[真]と判定するのに必要な命題群のそれぞれを満たすか否かの判定と組み合わせてもよい。例えば、論理式(A and (B or C) and D) or E or (F and G)の判定と並行して、例えば、命題E(もしくは、A and B and Dなど)の判定を行ない、いずれかの判定結果が得られた場合に、論理式判定の処理が終了されることとすればよい。この場合に用いられる論理判定テーブルは、例えば、生成部112が、図17のフローを、S204で取得した要素がor要素である場合に、S206,S207及びS213を片方の子要素のみを対象として行なうことなどにより生成される。