(57)【特許請求の範囲】
【請求項１】
第１の計算処理部が、和積形で表される論理式に含まれる第１の変数に第１の真偽値を割り当て、割り当てた前記第１の真偽値を、前記論理式を分割して演算する複数の第２の計算処理部のうち、前記第１の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第１の真偽値が通知された前記第２の計算処理部は、前記第１の真偽値を第１のレベルのキューに格納し、前記第１の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出し、
前記第１の計算処理部は、前記他の変数の真偽値を算出が未完了の第２の計算処理部があっても、前記論理式に含まれる第２の変数に第２の真偽値を割り当て、割り当てた前記第２の真偽値を、前記複数の第２の計算処理部のうち、前記第２の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第２の真偽値が通知された前記第２の計算処理部は、前記第２の真偽値を第２のレベルのキューに格納し、前記第２の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出する、充足可能性問題の計算方法。
【請求項２】
前記第１の計算処理部は、前記論理式に含まれる変数に真偽値を割り当てるたびに、新たなレベルのキューに前記真偽値を格納し、当該レベルと、前記複数の第２の計算処理部のうちで最も計算が遅れている第２の計算処理部が計算を実行中のキューのレベルとの差分が、許容値以下の場合に前記真偽値の通知を行う、請求項１に記載の充足可能性問題の計算方法。
【請求項３】
前記第１の計算処理部は、一定時間におけるコンフリクト数が所定数より多いとき、前記新たなレベルと、コンフリクトが発生したレベルとの差分を、前記許容値として設定する、請求項２に記載の充足可能性問題の計算方法。
【請求項４】
前記第１の計算処理部は、一定時間におけるコンフリクト数が所定数以下のとき、前記論理式に含まれる変数の数を、前記許容値として設定する、請求項２または３に記載の充足可能性問題の計算方法。
【請求項５】
前記第１の計算処理部は、コンフリクト数が発生しない時間が所定の時間よりも長いとき、前記論理式に含まれる変数の数を、前記許容値として設定する、請求項２乃至４の何れか一項に記載の充足可能性問題の計算方法。
【請求項６】
前記第１の計算処理部は、前記複数の第２の計算処理部のうち、待機中の第２の計算処理部の割合が所定の割合よりも大きいとき、前記第２の真偽値の割り当てを許容する、請求項１乃至５の何れか一項に記載の充足可能性問題の計算方法。
【請求項７】
第１の計算処理部と、複数の第２の計算処理部とを有し、
前記第１の計算処理部が、和積形で表される論理式に含まれる第１の変数に第１の真偽値を割り当て、割り当てた前記第１の真偽値を、前記論理式を分割して演算する前記複数の第２の計算処理部のうち、前記第１の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第１の真偽値が通知された前記第２の計算処理部は、前記第１の真偽値を第１のレベルのキューに格納し、前記第１の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出し、
前記第１の計算処理部は、前記他の変数の真偽値を算出が未完了の第２の計算処理部があっても、前記論理式に含まれる第２の変数に第２の真偽値を割り当て、割り当てた前記第２の真偽値を、前記複数の第２の計算処理部のうち、前記第２の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第２の真偽値が通知された前記第２の計算処理部は、前記第２の真偽値を第２のレベルのキューに格納し、前記第２の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出する、充足可能性問題の計算システム。
【請求項８】
第１の計算処理部が、和積形で表される論理式に含まれる第１の変数に第１の真偽値を割り当て、割り当てた前記第１の真偽値を、前記論理式を分割して演算する複数の第２の計算処理部のうち、前記第１の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第１の真偽値が通知された前記第２の計算処理部は、前記第１の真偽値を第１のレベルのキューに格納し、前記第１の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出し、
前記第１の計算処理部は、前記他の変数の真偽値を算出が未完了の第２の計算処理部があっても、前記論理式に含まれる第２の変数に第２の真偽値を割り当て、割り当てた前記第２の真偽値を、前記複数の第２の計算処理部のうち、前記第２の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、
前記第２の真偽値が通知された前記第２の計算処理部は、前記第２の真偽値を第２のレベルのキューに格納し、前記第２の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出する、
処理をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、充足可能性問題の計算方法、充足可能性問題の計算システム及びプログラムに関する。
【背景技術】
【０００２】
たとえば、半導体集積回路の論理検証（フォーマル検証など）において、充足可能性問題（Satisfiability problem）（以下ＳＡＴという）が用いられるようになってきた。
たとえば、ゲートレベルの論理回路の検証時に、コンピュータがその論理回路を積和形（Conjunctive Normal Form : CNF）の論理式で表現し、その論理式全体を真（“１”）とするような変数の真偽値の組み合わせが存在するか否かを判定する。
【０００３】
回路規模の増大に伴い論理式が長大化しているため、たとえば、あるコンピュータ（マスタ）が論理式を複数に分割して複数の他のコンピュータ（クライアント）に割り当て、分割した論理式を並列に処理させる手法が考えられている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１１−３５３３５７号公報
【特許文献２】特開２００２−１６３２３８号公報
【特許文献３】米国特許第７，２０３，９１７Ｂ２号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＳＡＴをマスタと複数のクライアントで処理する場合、マスタは論理式に含まれる変数に真偽値を割り当て、クライアントに通知し、クライアントはその真偽値をもとに論理式の他の変数の真偽値を算出する。この処理はインプリケーションと呼ばれる。マスタは各クライアントのインプリケーションの結果を受けてから次の変数に真偽値を割り当てる。
【０００６】
しかし、インプリケーションに時間がかかるクライアントがあると、他のクライアントは待機中にもかかわらず、マスタは次の変数の真偽値の通知ができず、結果としてＳＡＴの計算時間が長くなってしまう問題があった。
【課題を解決するための手段】
【０００７】
発明の一観点によれば、第１の計算処理部が、和積形で表される論理式に含まれる第１の変数に第１の真偽値を割り当て、割り当てた前記第１の真偽値を、前記論理式を分割して演算する複数の第２の計算処理部のうち、前記第１の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、前記第１の真偽値が通知された前記第２の計算処理部は、前記第１の真偽値を第１のレベルのキューに格納し、前記第１の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出し、前記第１の計算処理部は、前記他の変数の真偽値を算出が未完了の第２の計算処理部があっても、前記論理式に含まれる第２の変数に第２の真偽値を割り当て、割り当てた前記第２の真偽値を、前記複数の第２の計算処理部のうち、前記第２の変数を含む分割された論理式を演算する第２の計算処理部に対して通知し、前記第２の真偽値が通知された前記第２の計算処理部は、前記第２の真偽値を第２のレベルのキューに格納し、前記第２の真偽値に基づき、前記分割された論理式に含まれる他の変数の真偽値を算出する、充足可能性問題の計算方法が提供される。
【発明の効果】
【０００８】
開示の充足可能性問題の計算方法、充足可能性問題の計算システム及びプログラムによれば、計算時間を短縮できる。
【図面の簡単な説明】
【０００９】
【図１】第１の実施の形態のＳＡＴの計算方法の一例を説明する図である。
【図２】クライアントＣ１の変数ｘ１の真偽値に基づくインプリケーションが終了したときの様子を示す図である。
【図３】クライアントＣ２の変数ｘ１と変数ｘ５の真偽値に基づくインプリケーションが終了したときの様子を示す図である。
【図４】ＳＡＴの計算を行う第２の実施の形態の計算システムの一例を示す図である。
【図５】コンピュータのハードウェアの一例を示す図である。
【図６】マスタの動作の一例を示すフローチャートである。
【図７】各クライアントが実行中のキューのレベルの一例を示す図である。
【図８】マスタ側のキューとインプリケーションテーブル及びアサインテーブルの一例を示す図である。
【図９】クライアントの動作の一例を示すフローチャートである。
【図１０】許容値の設定方法の一例を示す図である。
【図１１】許容値の設定方法の一例を示すフローチャートである。
【発明を実施するための形態】
【００１０】
以下、発明を実施するための形態を、図面を参照しつつ説明する。
（第１の実施の形態）
図１は、第１の実施の形態のＳＡＴの計算方法の一例を説明する図である。
【００１１】
本実施の形態のＳＡＴの計算方法は、図１に示されているように、複数の計算処理部Ｍ，Ｃ１，Ｃ２，…，Ｃｎを有する計算システムで行われる。計算処理部Ｍ，Ｃ１，Ｃ２，…，Ｃｎは、たとえば、検証対象の論理回路をＣＮＦの論理式で表現し、その論理式全体を真（“１”）とするような変数の真偽値の組み合わせが存在するか否かを判定する。
【００１２】
以下の説明では、計算処理部ＭをマスタＭ、計算処理部Ｃ１〜ＣｎをクライアントＣ１〜Ｃｎと呼ぶことにする。ＣＮＦで表される論理式は、たとえば、マスタＭによって分割され、クライアントＣ１〜Ｃｎに割り当てられている。
【００１３】
マスタＭは、まず、ＣＮＦで表される論理式に含まれる、ある変数に真偽値を割り当てる。図１の上側に示されている例では、マスタＭは、変数ｘ１に真偽値を割り当てている。マスタＭは、変数ｘ１に“０”（偽）または“１”（真）の何れかを割り当て、レベル１のキューｍｑ１（たとえば、マスタＭ内のメモリまたはマスタＭに接続されるメモリ（図示せず）に構築される）に格納する。
【００１４】
そして、マスタＭは、割り当てた変数ｘ１の真偽値を、クライアントＣ１〜Ｃｎのうち、変数ｘ１を含む分割された論理式を演算するもの（図１の例ではクライアントＣ１，Ｃ２，Ｃｎ）に通知する。
【００１５】
クライアントＣ１，Ｃ２，Ｃｎは、その真偽値を、たとえば、クライアントＣ１，Ｃ２，Ｃｎ内のメモリまたはクライアントＣ１，Ｃ２，Ｃｎに接続されるメモリ（図示せず）に構築されるレベル１のキューｃｑ１１，ｃｑ２１，ｃｑｎ１に格納する。
【００１６】
そして、クライアントＣ１，Ｃ２，Ｃｎは、格納された変数ｘ１の真偽値に基づき、インプリケーションを実施する。これにより、他の変数の真偽値が算出される。
図１の下側に示されている例では、クライアントＣｎが、インプリケーションにより、変数ｘ９の真偽値を算出し、レベル１のキューｃｑｎ１に格納するとともに、マスタＭに通知している。マスタＭは、コンフリクトの検出などのため、通知された変数ｘ９の真偽値をレベル１のキューｍｑ１に格納する。これに対して、クライアントＣ１，Ｃ２は、インプリケーションに時間がかかっており、インプリケーション結果は出力されていない。
【００１７】
一方、マスタＭは、インプリケーションが未完了のクライアントがあっても、論理式に含まれる次の変数に真偽値を割り当てる。図１の下側の例では、マスタＭは、変数ｘ３に真偽値を割り当てている。マスタＭは、変数ｘ３に“０”または“１”の何れかを割り当て、レベル２のキューｍｑ２に格納する。
【００１８】
そして、マスタＭは、決定した変数ｘ３の真偽値を、クライアントＣ１〜Ｃｎのうち、変数ｘ３を含む分割された論理式を演算するもの（図１の例ではクライアントＣ１，Ｃ２，Ｃｎ）に通知する。
【００１９】
変数ｘ３の真偽値が通知されたクライアントＣ１，Ｃ２，Ｃｎは、その真偽値を、レベル２のキューｃｑ１２，ｃｑ２２，ｃｑｎ２に格納する。
そして、クライアントＣ１，Ｃ２，Ｃｎは、変数ｘ１の真偽値に基づくインプリケーションが終わると、レベル２のキューｃｑ１２，ｃｑ２２，ｃｑｎ２に格納された変数ｘ３の真偽値に基づきインプリケーションを実施する。
【００２０】
図２は、クライアントＣ１の変数ｘ１の真偽値に基づくインプリケーションが終了したときの様子を示す図である。
図２の例では、クライアントＣ１は、インプリケーションにより、変数ｘ５の真偽値を算出し、その結果を、レベル１のキューｃｑ１１に格納するとともに、マスタＭと、変数ｘ５を含む分割された論理式を演算するクライアントＣ２に通知している。クライアントＣ２とマスタＭは通知された変数ｘ５の真偽値をレベル１のキューｃｑ２１，ｍｑ１に格納する。
【００２１】
図３は、クライアントＣ２の変数ｘ１と変数ｘ５の真偽値に基づくインプリケーションが終了したときの様子を示す図である。
図３の例では、クライアントＣ２は、変数ｘ１と変数ｘ５の真偽値に基づくインプリケーションにより、変数ｘ８の真偽値を算出し、真偽値をレベル１のキューｃｑ２１に格納するとともに、マスタＭに通知している。マスタＭは通知された変数ｘ８の真偽値をレベル１のキューｍｑ１に格納する。また、図３の例では、クライアントＣｎでの、変数ｘ３の真偽値に基づくインプリケーションが終了して、変数ｘ１０の真偽値が得られている。このとき、クライアントＣｎは、変数ｘ１０の真偽値を、レベル２のキューｃｑｎ２に格納するとともに、マスタＭに通知している。マスタＭは通知された変数ｘ１０の真偽値をレベル２のキューｍｑ２に格納する。
【００２２】
このように、インプリケーションが遅いクライアントが存在しても、他のクライアントは、新たに通知された変数の真偽値に基づくインプリケーションを行うことができる。そのため、待機中のクライアントが発生することが抑制され、ＳＡＴの計算時間を短縮することができる。
【００２３】
（第２の実施の形態）
図４は、ＳＡＴの計算を行う第２の実施の形態の計算システムの一例を示す図である。
ユーザコンピュータ１０は、半導体集積回路の設計ツールを実行し、フォーマル検証時などにおいて、検証対象の論理回路をＣＮＦの論理式で表現し、マスタ１１に通知する。マスタ１１は、クライアント１２−１，１２−２，…，１２−ｎとともに、通知された論理式についてのＳＡＴの計算を行う。ユーザコンピュータ１０とマスタ１１、マスタ１１とクライアント１２−１〜１２−ｎ、及びクライアント１２−１〜１２−ｎ同士は、たとえば、有線または無線通信により、情報の送受信を行う。
【００２４】
ユーザコンピュータ１０、マスタ１１及びクライアント１２−１〜１２−ｎは、たとえば、以下のようなハードウェアを有するコンピュータで実現可能である。
図５は、コンピュータのハードウェアの一例を示す図である。
【００２５】
コンピュータ５０は、ＣＰＵ（Central Processing Unit）５１、ＲＡＭ（Random Access Memory）５２、ＨＤＤ（Hard Disk Drive）５３、画像信号処理部５４、入力信号処理部５５、ディスクドライブ５６及び通信部５７を有する。上記ユニットは、コンピュータ５０内でバス５８に接続されている。
【００２６】
ＣＰＵ５１は、コンピュータ５０における情報処理を制御する演算装置である。ＣＰＵ５１は、ＨＤＤ５３に記憶されたプログラムやデータの少なくとも一部を読み出してＲＡＭ５２に展開し、プログラムを実行する。なお、コンピュータ５０は、複数の演算装置を備えて、情報処理を分散して実行してもよい。
【００２７】
ＲＡＭ５２は、ＣＰＵ５１が扱うプログラムやデータを一時的に記憶しておく揮発性メモリである。なお、コンピュータ５０は、ＲＡＭ以外の種類のメモリを備えていてもよく、複数個のメモリを備えてもよい。
【００２８】
ＨＤＤ５３は、ＯＳ（Operating System）プログラムやアプリケーションプログラムなどのプログラム、及び、情報処理に用いられるデータを記憶する不揮発性の記憶装置である。ＨＤＤ５３は、ＣＰＵ５１の命令に従って、内蔵の磁気ディスクに対する読み書きを行う。なお、コンピュータ５０は、ＨＤＤ以外の不揮発性の記憶装置（たとえば、ＳＳＤ（Solid State Drive））を備えていてもよく、複数の記憶装置を備えてもよい。
【００２９】
画像信号処理部５４は、ＣＰＵ５１の命令に従って、コンピュータ５０に接続されたディスプレイ５４ａに画像を出力する。ディスプレイ５４ａとして、たとえば、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００３０】
入力信号処理部５５は、コンピュータ５０に接続された入力デバイス５５ａから入力信号を取得し、ＣＰＵ５１に出力する。入力デバイス５５ａとして、たとえば、マウスやタッチパネルなどのポインティングデバイスや、キーボードなどを用いることができる。
【００３１】
ディスクドライブ５６は、記録媒体５６ａに記録されたプログラムやデータを読み取る駆動装置である。記録媒体５６ａとして、たとえば、フレキシブルディスク（ＦＤ： Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。ディスクドライブ５６は、たとえば、ＣＰＵ５１の命令に従って、記録媒体５６ａから読み取ったプログラムやデータをＲＡＭ５２またはＨＤＤ５３に格納する。
【００３２】
通信部５７は、ネットワーク５７ａに接続して通信を行う通信インタフェースである。ネットワーク５７ａへの接続方法は、有線でも無線でもよい。すなわち、通信部５７は、有線通信インタフェースでも無線通信インタフェースでもよい。
【００３３】
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。
（マスタ１１の動作例）
図６は、マスタの動作の一例を示すフローチャートである。
【００３４】
マスタ１１は、ＣＮＦの論理式中に真偽値が未割り当ての変数があるか否かを判定する（ステップＳ１０）。論理式は、たとえば、以下のように表現されるものである。
φ＝（ｘ１ｂ＋ｘ２）（ｘ１ｂ＋ｘ３＋ｘ９）（ｘ２ｂ＋ｘ３ｂ＋ｘ４）（ｘ４ｂ＋ｘ５＋ｘ１０）（ｘ４ｂ＋ｘ６＋ｘ１１）（ｘ５ｂ＋ｘ６ｂ）（ｘ１＋ｘ７＋ｘ１２ｂ）（ｘ１＋ｘ８）（ｘ７ｂ＋ｘ８ｂ＋ｘ１３ｂ）                （１）
なお、式（１）で、“ｘ１ｂ”、“ｘ２ｂ”などは、変数ｘ１、ｘ２の否定を示している。すなわち、変数ｘ１が“１”のときは、変数ｘ１ｂは“０”である。
【００３５】
上式のような論理式中の全ての変数に真偽値が割り当てられていれば、マスタ１１は、ステップＳ２２の処理に進み、真偽値が未割り当ての変数がある場合には、論理式中のある変数に、真偽値の割り当てを行う（ステップＳ１１）。この処理は、Ｄｅｃｉｓｉｏｎとも呼ばれる。最初のＤｅｃｉｓｉｏｎは、レベル１のＤｅｃｉｓｉｏｎ、次のＤｅｃｉｓｉｏｎは、レベル２のＤｅｃｉｓｉｏｎ、その次のＤｅｃｉｓｉｏｎは、レベル３のＤｅｃｉｓｉｏｎなどと呼ばれる。
【００３６】
第１の実施の形態のマスタＭと同様、マスタ１１も、変数に真偽値の割り当てを行うたびに、新たなレベルのキューを生成する。なお、マスタ１１は、変数の数のレベルだけ、予めキューを生成しておくようにしてもよい。
【００３７】
次に、マスタ１１は、生成したキューレベル（Ｄｅｃｉｓｉｏｎのレベルと同じ）−最も遅いクライアントが実行中のキューレベル≦許容値であるか否かを判断する（ステップＳ１２）。
【００３８】
図７は、各クライアントが実行中のキューのレベルの一例を示す図である。
図７の例では、クライアント１２−２〜１２−ｎは、レベル４のキューを実行中であり、レベル４のキューの生成時に真偽値が割り当てられた変数に基づくインプリケーションを行っている。クライアント１２−１は最も遅く、レベル２のキューの生成時に真偽値が割り当てられた変数に基づくインプリケーションを行っている。
【００３９】
このような場合、ステップＳ１１の処理で、新たなレベル５のキューが生成されると、生成したキューレベル−最も遅いクライアントが実行中のキューレベル＝３である。たとえば、許容値が４である場合には、３≦４であるので、ステップＳ１３の処理に進み、マスタ１１は、変数に割り当てた真偽値を、その変数を含む論理式を演算するクライアントに通知する。この場合、図７の例では、クライアント１２−２〜１２−ｎは、次のレベルのキューを実行可能である。ステップＳ１３の処理の後は、ステップＳ１４の処理が行われる。
【００４０】
一方、ステップＳ１２の処理において、たとえば、クライアント１２−１がレベル２のキューの実行中のままで、ステップＳ１１の処理で、レベル７のキューが生成されたとする。この場合、７−２＞４となるので、ステップＳ１３の処理はスキップされ、変数に割り当てられた真偽値は、クライアント１２−２〜１２−ｎに通知されず、ステップＳ１４の処理が行われる。
【００４１】
なお、許容値としては、たとえば、ユーザコンピュータ１０から所定の値が与えられる。また、マスタ１１が自動的に設定するようにしてもよい（詳細は後述する）。
ステップＳ１４の処理では、マスタ１１は、クライアント１２−１〜１２−ｎからインプリケーション結果を受信し、その結果を各クライアント１２−１〜１２−ｎが実行しているキューのレベルに対応したマスタ１１側のキューに格納する。
【００４２】
このときマスタ１１は、キューに対応して、たとえば、以下のようなインプリケーションテーブルと、アサインテーブルを作成する。
図８は、マスタ側のキューとインプリケーションテーブル及びアサインテーブルの一例を示す図である。
【００４３】
レベル１のキューには、変数ｘ１に真偽値が割り当てられたことに応じて、クライアント１２−１〜１２−ｎの何れかから送られてきた変数ｘ５，ｘ８のインプリケーションの結果が格納されている。また、レベル２のキューには、変数ｘ３に真偽値が割り当てられたことに応じて、クライアント１２−１〜１２−ｎの何れかから送られてきた変数ｘ９のインプリケーションの結果が格納されている。
【００４４】
マスタ１１は、このようなインプリケーションの結果を、たとえば、図８のようなインプリケーションテーブルとアサインテーブルで管理する。インプリケーションテーブルには、真偽値が割り当てられた変数（ｌｉｔｅｒａｌ）と、そのもととなる変数（ｏｒｉｇｉｎ）と、キューのレベルが管理されている。
【００４５】
アサインテーブルには、変数と、その変数に割り当てられた真偽値と、キューのレベルが管理されている。図８の例では、インプリケーションにより、変数ｘ９の真偽値がＵｎｄｅｆ（未定義）の状態から、“１”に更新され、レベルもＵｎｄｅｆの状態から“２”に更新されている。
【００４６】
このようなインプリケーションテーブルやアサインテーブルは、クライアント側でも生成されるようにしてもよい。
ステップＳ１４の処理の後、マスタ１１は、待機中のクライアントの割合が所定の割合（Ｘ％）よりも大きいか否かを判定する（ステップＳ１５）。
【００４７】
待機中のクライアントの割合（％）＞Ｘ％であれば、マスタ１１は、ステップＳ１６の処理を行い、待機中のクライアントの割合≦Ｘ％であれば、マスタ１１は、ステップＳ１４の処理に戻り、インプリケーション結果を受信する状態となる。所定の割合は、ユーザコンピュータ１０からマスタ１１に、たとえば、９０％、８０％などと通知される。
【００４８】
ステップＳ１６の処理では、マスタ１１は、コンフリクトがあるか否か判定する。変数に対する真偽値の割り当ての結果、和項が“０”となってしまう場合、コンフリクトが発生したと判定される。コンフリクトは、クライアント１２−１〜１２−ｎの何れかから通知される場合もある。
【００４９】
マスタ１１は、コンフリクトがあると判定した場合には、ステップＳ１７の処理に進み、コンフリクトがない場合には、ステップＳ１０の処理からの処理を繰り返す。
ステップＳ１７の処理では、マスタ１１は、複数のレベルのキューを１つに変更する。そして、マスタ１１は、アナライザを用いてコンフリクトの分析を行う（ステップＳ１８）。キューを１つにするには、大きいレベルのキューの先頭を、前のレベルの末尾につなげるようにすればよい。アナライザが複数のレベルのキューを処理できるものであれば、キューを１つにしなくてもよい。
【００５０】
マスタ１１は、分析の結果、コンフリクトの原因が判明した（分析が成功した）か否かを判定し（ステップＳ１９）、コンフリクトの原因が判明した場合、ステップＳ２０の処理を行う。
【００５１】
ステップＳ２０の処理では、マスタ１１は、Ｄｅｃｉｓｉｏｎをやり直すＤｅｃｉｓｉｏｎのレベル（バックトラックレベル）を各クライアント１２−１〜１２−ｎに通知する。たとえば、クライアント１２−１においてレベル２のキューでコンフリクトが発生した場合、クライアント１２−２〜１２−ｎにバックトラックレベルとしてレベル１を通知する。このとき、マスタ１１は、図８に示したようなアサインテーブルにおいて、クライアント１２−２〜１２−ｎがレベル２以降のＤｅｃｉｓｉｏｎに基づきインプリケーションした変数をＵｎｄｅｆ状態に戻す。
【００５２】
その後、マスタ１１は、ステップＳ１３に戻り、新たに変数に割り当てた真偽値を、その変数を含む論理式を演算するクライアントに通知し、ステップＳ１４からの処理を繰り返す。
【００５３】
一方、コンフリクトの原因が判明しなかった（分析が成功しなかった）場合、マスタ１１は、充足可能性問題は充足不可と判定し（ステップＳ２１）、処理を終える。
マスタ１１は、ステップＳ１０の処理で、ＣＮＦの論理式中に真偽値が未割り当ての変数がないと判定した場合は、インプリケーションなどを実施中であり、ビジーなクライアントがあるかないかを判定する（ステップＳ２２）。ビジーなクライアントがある場合には、マスタ１１は、ステップＳ１４からの処理を行い、ビジーなクライアントがなければ、充足可能性問題は、充足可と判定し（ステップＳ２３）、処理を終える。
【００５４】
次に、クライアント１２−１〜１２−ｎの動作例を説明する。
（クライアント１２−１〜１２−ｎの動作例）
以下では、クライアント１２−１の動作を説明するが、他のクライアント１２−２〜１２−ｎについても同様の動作が行われる。
【００５５】
図９は、クライアントの動作の一例を示すフローチャートである。
クライアント１２−１は、マスタ１１からのメッセージを受信すると（ステップＳ３０）、そのメッセージの内容を判定する（ステップＳ３１）。メッセージがインプリケーションを指示するもので、クライアント１２−１が演算する論理式に含まれる変数の真偽値が通知された場合、クライアント１２−１は、ステップＳ３２の処理を行う。ステップＳ３２の処理では、クライアント１２−１は、真偽値が割り当てられた変数を、マスタ１１から指定されるＤｅｃｉｓｉｏｎまたはキューのレベルをもとに、指定されたレベルのキューに格納する。
【００５６】
その後、クライアント１２−１は、インプリケーションが未実行の一番小さいレベルのキューに格納された、真偽値を割り当て済みの変数に基づくインプリケーションを実行する（ステップＳ３３）。インプリケーションとしては、たとえば、ＢＣＰ（Boolean Constraint Propagation）が適用可能である。ＢＣＰは、ある変数に真偽値を割り当てたときに、論理式に含まれる和項を真にするように他の変数に真偽値を連鎖的に割り当てていく手法である。
【００５７】
インプリケーションが終了すると、クライアント１２−１は、インプリケーション結果として、変数への真偽値の割り当て結果を、マスタ１１及び、その変数を含む論理式を演算するクライアントに通知し（ステップＳ３４）、処理を終える。
【００５８】
一方、ステップＳ３１の処理で、クライアント１２−１は、マスタ１１からのメッセージの内容が、バックトラックレベルを指示するものであると判定した場合には、指示されたバックトラックレベルまで、バックトラックを実行し（ステップＳ３５）、処理を終了する。
【００５９】
以上のように、本実施の形態のＳＡＴの計算方法によれば、コンフリクトが発生していない状態では、インプリケーションが終了していないクライアントがあっても、マスタは変数に真偽値を割り当て、各クライアントに通知する。各クライアントは、その真偽値を新たなレベルのキューに格納し、前のレベルのキューでのインプリケーション後に、その真偽値を用いたインプリケーションを行う。これにより、インプリケーションが遅いクライアントが存在しても、他のクライアントは、新たに通知された変数の真偽値に基づくインプリケーションを行うことができる。そのため、待機中のクライアントが発生することが抑制され、ＳＡＴの計算時間を短縮することができる。
【００６０】
また、本実施の形態のＳＡＴの計算方法によれば、以下のケースが現れるたびに、クライアント１２−１〜１２−ｎ間のワークロードバランスが改善される。たとえば、クライアント１２−１が他のクライアント１２−２〜１２−ｎに比べてレベルｋのキューでのインプリケーションに時間がかかっているケースの場合を考える。この場合、レベルｋ＋１〜レベルｋ＋ｍ（ｍは２以上）のキューでのインプリケーションの処理時間の平均が、クライアント１２−１のものよりクライアント１２−２〜１２−ｎのものの方が長いとき、ワークロードバランスが改善され、計算時間はより短縮される。
【００６１】
また、図６のステップＳ１２の処理のように、マスタ１１は、生成したキューレベルと最も遅いクライアントが実行中のキューレベルとの差分が許容値より大きい場合には、クライアントへの真偽値の通知を行わない。これにより、クライアント間で、演算を行うキューのレベルが開きすぎないようにすることができる。クライアント間で、演算を行うキューのレベルが開きすぎると、最も遅いクライアントが実行しているキューのレベルでコンフリクトが発生したときに、処理が進んでいるクライアントがインプリケーションをやり直す量が増えてしまう可能性がある。また、マスタ１１が次の変数への真偽値の割り当てをやり直す回数も増えてしまう。上記の処理により、クライアント間で、演算を行うキューのレベルが開きすぎないようにすることで、このような問題の発生を抑制できる。
【００６２】
また、図６のステップＳ１５の処理のように、マスタ１１は、待機中のクライアントの割合が、所定の割合よりも大きい場合に、次の変数に真偽値の割り当てを行う処理に進めるようにしている。これにより、待機中のクライアントの割合が少ないにも関わらず、次の変数への真偽値の割り当てが行われることが抑制される。待機中のクライアントの割合が少ないということは、コンフリクトが発生する可能性があり、次の変数への真偽値の割り当てや、割り当てた真偽値に基づくインプリケーションが無駄になる可能性がある。上記の処理により、待機中のクライアントの割合が少ないにも関わらず、次の変数への真偽値の割り当てが行われることが抑制されることで、このような問題の発生を抑制できる。
【００６３】
（第３の実施の形態）
上記の第２の実施の形態のＳＡＴの計算方法では、図６のステップＳ１２の処理で使用する許容値を、ユーザ側から指定される値としたが、マスタ１１が設定するようにしてもよい。
【００６４】
図１０は、許容値の設定方法の一例を示す図である。
マスタ１１は、演算部６０、選択部６１、タイム／コンフリクトカウンタ６２の機能を実現する。
【００６５】
演算部６０は、選択部６１から出力される許容値に応じて、ステップＳ１２の判定処理を満たす場合に、変数に割り当てた真偽値を、その変数を含む論理式を演算するクライアントに通知する。また、演算部６０は、たとえば、レベルｎまでキューが生成されている場合で、レベルｋ＋１のキューでコンフリクトが発生した場合、レベルｋ＋１〜ｎまでのキューに格納された変数の真偽値をＵｎｄｅｆ状態にして、許容値としてｎ−（ｋ＋１）を出力する。
【００６６】
選択部６１は、タイム／コンフリクトカウンタ６２からの選択信号に応じて、演算部６０から出力される許容値か、論理式の変数の数Ｎまたはユーザの入力値を選択して、許容値として演算部６０に出力する。
【００６７】
タイム／コンフリクトカウンタ６２は、時間及び、コンフリクト数をカウントする。また、タイム／コンフリクトカウンタ６２は、コンフリクトがない状態で、所定の時間（Ｔｍａｘ）を超えるか、一定時間内のコンフリクト数が所定の数（Ｃｍｉｎ）以下の場合、選択部６１に、論理式の変数の数Ｎまたはユーザの入力値を選択させる。
【００６８】
図１１は、許容値の設定方法の一例を示すフローチャートである。
マスタ１１は、コンフリクト発生の有無を判定する（ステップＳ４０）。コンフリクトがある場合には、演算部６０は、変数に割り当てられた真偽値をＵｎｄｅｆにするキューのレベルの数（ｎ−（ｋ＋１））を取得して出力する（ステップＳ４１）。また、タイム／コンフリクトカウンタ６２は、コンフリクト数をインクリメントする（ステップＳ４２）。
【００６９】
また、タイム／コンフリクトカウンタ６２は、一定時間内におけるコンフリクト数≦Ｃｍｉｎであるか否かを判定する（ステップＳ４３）。そして、タイム／コンフリクトカウンタ６２は、コンフリクト数がＣｍｉｎより大きい場合には、選択部６１に、演算部６０から出力されるｎ−（ｋ＋１）を許容値として選択させ、演算部６０に設定させる（ステップＳ４４）。その後、ステップＳ４８の処理が行われる。
【００７０】
一方、コンフリクトが発生していない場合、タイム／コンフリクトカウンタ６２は、コンフリクトが発生していない時間が、Ｔｍａｘより長いか否かを判定する（ステップＳ４５）。コンフリクトが発生していない時間が、Ｔｍａｘより長い場合、またはステップＳ４３の処理で、コンフリクト数がＣｍｉｎ以下の場合、タイム／コンフリクトカウンタ６２は、リセットされる（ステップＳ４６）。
【００７１】
また、タイム／コンフリクトカウンタ６２は、選択部６１に、論理式の変数の数Ｎまたはユーザの入力値を許容値として選択させ、演算部６０に設定させる（ステップＳ４７）。その後、ステップＳ４８の処理が行われる。一方、コンフリクトが発生していない時間が、Ｔｍａｘ以下の場合にも、ステップＳ４８の処理が行われる。
【００７２】
ステップＳ４８の処理では、マスタ１１は、充足可能性問題の計算が終了したか否かを判定し、計算が終了した場合には許容値の設定処理を終え、計算が終了していない場合には、ステップＳ４０からの処理を繰り返す。
【００７３】
以上のような許容値の設定方法によれば、たとえば、ＳＡＴが簡単なもので、コンフリクト数が少ない、またはコンフリクトがない期間が所定の期間を超えると、許容値を論理式中の変数の数Ｎまたはユーザの入力値に設定することができる。許容値が変数の数Ｎに設定された場合には、あるクライアントがレベル１のキューを実行中でも、他のクライアントはＮレベルのキューまでインプリケーションを進められる。
【００７４】
一方、たとえば、ＳＡＴが難しく、コンフリクト数が多い、またはコンフリクトが頻繁に起きる場合、許容値は、実際にコンフリクトが発生したキューのレベル（ｋ＋１）と、最も演算が進んでいるクライアントが実行中のキューのレベルｎに応じて設定される。
【００７５】
コンフリクト数が多い、またはコンフリクトが頻繁に起きる場合にも、許容値を大きくすると、変数をＵｎｄｅｆにするレベル数が増えてしまうので、処理時間が増える。そのため、上記のように許容値を切り替えるようにすることで、そのような無駄な処理時間が発生することを抑制できる。その結果として、ＳＡＴの計算速度を速めることができる。
【００７６】
なお、前述したように、上記の充足可能性問題の計算方法は、コンピュータによって実現することができる。その場合、充足可能性問題の計算システムが有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムを１または複数のコンピュータで実行することにより、上記処理内容がコンピュータ上で実現される（たとえば、複数の演算装置を有しているコンピュータの場合には、１つのコンピュータ上でも実現可能である）。
【００７７】
処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【００７８】
プログラムを流通させる場合には、たとえば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【００７９】
プログラムを実行するコンピュータは、たとえば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【００８０】
また、上記の処理機能の少なくとも一部を、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【００８１】
以上、実施の形態に基づき、本発明の充足可能性問題の計算方法、充足可能性問題の計算システム及びプログラムの一観点について説明してきたが、これらは一例にすぎず、上記の記載に限定されるものではない。
【符号の説明】
【００８２】
Ｍ  計算処理部（マスタ）
Ｃ１〜Ｃｎ  計算処理部（クライアント）
ｍｑ１，ｃｑ１１，ｃｑ２１，ｃｑｎ１  レベル１のキュー
ｍｑ２，ｃｑ１２，ｃｑ２２，ｃｑｎ２  レベル２のキュー
【図１】
0005835103.tif 000002
【図２】
0005835103.tif 000003
【図３】
0005835103.tif 000004
【図４】
0005835103.tif 000005
【図５】
0005835103.tif 000006
【図６】
0005835103.tif 000007
【図７】
0005835103.tif 000008
【図８】
0005835103.tif 000009
【図９】
0005835103.tif 000010
【図１０】
0005835103.tif 000011
【図１１】
0005835103.tif 000012