(57)【特許請求の範囲】
【請求項１】
命令型プログラミング言語によって記述されたプログラムを記号実行することにより前記プログラムを論理式の形式に変換したプログラム論理式を得る記号実行部と、
それぞれ前記プログラムに含まれる変数を用いて記述された複数の論理式Aを含む集合Sを記憶する第1の記憶部と、
前記プログラムに含まれる変数を用いて記述された、前記プログラムの事後条件を表す論理式Bを記憶する第2の記憶部と、
前記複数の論理式Aと、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第1の論理式を作成する論理式作成部と、
前記第1の論理式を真にする解を求め、前記解が存在しないとき前記第1の論理式において同時に真にすることが不可能な項の組を特定する問題ソルバと、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第1の事前条件を表すものとして記憶する第3の記憶部と、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を緩和項集合N1として記憶する第4の記憶部と、を備え、
前記論理式作成部は、
（A1）前記緩和項集合N1に属する論理式Aにそれぞれ対応して真または偽の値をとる緩和変数を設定し、
（B1）前記緩和項集合N1に属する論理式Aと、前記論理式Aに対して設定された緩和変数との論理和よりなる論理式の集合である集合NN1を取得し、
（C1）前記緩和項集合N1に属する論理式Aの個数が2以上のときに、前記論理式Aに対しそれぞれ設定された前記緩和変数の否定の論理和を変数選択項v1として取得し、
（D1）前記集合Sから前記緩和項集合N1を除いた集合S-N1に属する論理式と、前記集合NN1に属する論理式と、前記変数選択項v1と、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第2の論理式を生成し、
前記問題ソルバは、前記第2の論理式を真にする解を求め、前記解が存在しないときは前記第2の論理式において同時に真にすることが不可能な項の組を特定し、
前記第3の記憶部は、前記第2の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第2の事前条件を表すものとして記憶する
ことを特徴とする事前条件生成装置。
【請求項２】
前記第2の論理式の解が見つけられ、前記第2の論理式の解に真となった緩和変数が含まれるとき、前記真となった緩和変数に対応する論理式Aを前記緩和項集合N1から削除する緩和項削除部をさらに備え、
前記論理式作成部は、削除後の緩和項集合N1を用いて前記（A1）〜（D1）の処理を行う
ことを特徴とする請求項1に記載の装置。
【請求項３】
前記第4の記憶部は、前記第2の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を緩和項集合N2として記憶し、
前記論理式作成部は、
（A2）前記緩和項集合N1,N2の和集合に属する論理式Aのそれぞれに対応して真または偽の値をとる緩和変数を設定し、
（B2）前記緩和項集合N1,N2の和集合に属する論理式Aと、前記論理式Aに対して設定された緩和変数との論理和よりなる論理式の集合である集合NN2を取得し、
（C2）前記緩和項集合N2に属する論理式Aの個数が2以上のときに、前記論理式Aに対してそれぞれ設定された前記緩和変数の否定の論理和を変数選択項v2として取得し、
（D2）前記集合Sから緩和項集合N1,N2の和集合を除いた集合S-（N1∪N2）に属する論理式Aと、前記集合NN2に属する論理式と、前記変数選択項v1、v2と、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第3の論理式を生成し、
前記問題ソルバは前記第3の論理式を真にする解を求め、前記解が存在しないときは前記第3の論理式において同時に真にすることが不可能な項の組を特定し、
前記第3の記憶部は、前記第3の論理式において同時に真にすることが不可能な項の組に含まれる論理式Aの集合を前記プログラムの第3の事前条件を表すものとして記憶する
ことを特徴とする請求項2に記載の装置。
【請求項４】
前記緩和項削除部は、前記第3の論理式の解が見つけられ、前記第3の論理式の解に真となった緩和変数が含まれるとき、前記真となった緩和変数に対応する論理式Aを前記緩和項集合N2から削除し、
前記論理式作成部は、削除後の緩和項集合N2を用いて前記（A2）〜（D2）の処理を行う
ことを特徴とする請求項3に記載の装置。
【請求項５】
前記プログラムを一部に含む親プログラムを記憶する第5の記憶部と、
前記親プログラムの事前条件および事後条件を記憶する第6の記憶部と、
前記親プログラムの事前条件が成り立つときに前記親プログラムが実行された直後に前記親プログラムの事後条件が成立するという命題が成立するか否かを検査し、前記命題の反例が存在するとき前記命題は成立せず、存在しないとき成立することを決定するプログラム検査部と、を備え、
前記プログラム検査部は、前記親プログラムの検査を、前記プログラムが前記プログラムの前記第1、第2または第3の事前条件、および前記プログラムの事後条件をそれぞれ満たすことを仮定して検査を行う
ことを特徴とする請求項4に記載の装置。
【請求項６】
命令型プログラミング言語によって記述されたプログラムを記号実行することにより前記プログラムを論理式の形式に変換したプログラム論理式を得るステップと、
それぞれ前記プログラムに含まれる変数を用いて記述された複数の論理式Aを含む集合Sを第1の記憶部に記憶するステップと、
前記プログラムに含まれる変数を用いて記述された、前記プログラムの事後条件を表す論理式Bを第2の記憶部に記憶するステップと、
前記複数の論理式Aと、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第1の論理式を作成するステップと、
前記第1の論理式を真にする解を求め、前記解が存在しないとき前記第1の論理式において同時に真にすることが不可能な項の組を特定するステップと、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第1の事前条件を表すものとして第3の記憶部に記憶するステップと、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を緩和項集合N1として第4の記憶部に記憶するステップと、
（A1）前記緩和項集合N1に属する論理式Aにそれぞれ対応して真または偽の値をとる緩和変数を設定し、
（B1）前記緩和項集合N1に属する論理式Aと、前記論理式Aに対して設定された緩和変数との論理和よりなる論理式の集合である集合NN1を取得し、
（C1）前記緩和項集合N1に属する論理式Aの個数が2以上のときに、前記論理式Aに対しそれぞれ設定された前記緩和変数の否定の論理和を変数選択項v1として取得し、
（D1）前記集合Sから前記緩和項集合N1を除いた集合S-N1に属する論理式と、前記集合NN1に属する論理式と、前記変数選択項v1と、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第2の論理式を生成するステップと、
前記第2の論理式を真にする解を求め、前記解が存在しないときは前記第2の論理式において同時に真にすることが不可能な項の組を特定するステップと、
前記第2の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第2の事前条件を表すものとして前記第3の記憶部に記憶するステップと
をコンピュータが実行する事前条件生成方法。
【請求項７】
命令型プログラミング言語によって記述されたプログラムを記号実行することにより前記プログラムを論理式の形式に変換したプログラム論理式を得るステップと、
それぞれ前記プログラムに含まれる変数を用いて記述された複数の論理式Aを含む集合Sを第1の記憶部に記憶するステップと、
前記プログラムに含まれる変数を用いて記述された、前記プログラムの事後条件を表す論理式Bを第2の記憶部に記憶するステップと、
前記複数の論理式Aと、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第1の論理式を作成するステップと、
前記第1の論理式を真にする解を求め、前記解が存在しないとき前記第1の論理式において同時に真にすることが不可能な項の組を特定するステップと、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第1の事前条件を表すものとして第3の記憶部に記憶するステップと、
前記第1の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を緩和項集合N1として第4の記憶部に記憶するステップと、
（A1）前記緩和項集合N1に属する論理式Aにそれぞれ対応して真または偽の値をとる緩和変数を設定し、
（B1）前記緩和項集合N1に属する論理式Aと、前記論理式Aに対して設定された緩和変数との論理和よりなる論理式の集合である集合NN1を取得し、
（C1）前記緩和項集合N1に属する論理式Aの個数が2以上のときに、前記論理式Aに対しそれぞれ設定された前記緩和変数の否定の論理和を変数選択項v1として取得し、
（D1）前記集合Sから前記緩和項集合N1を除いた集合S-N1に属する論理式と、前記集合NN1に属する論理式と、前記変数選択項v1と、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第2の論理式を生成するステップと、
前記第2の論理式を真にする解を求め、前記解が存在しないときは前記第2の論理式において同時に真にすることが不可能な項の組を特定するステップと、
前記第2の論理式において同時に真にすることが不可能な項の組に含まれるすべての論理式Aの集合を前記プログラムの第2の事前条件を表すものとして前記第3の記憶部に記憶するステップと
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば命令型プログラミング言語を用いて記述された計算機プログラムの事前条件を生成するための事前条件生成装置に関する。
【背景技術】
【０００２】
命令型プログラミング言語におけるプログラムの仕様や性質を表す基本的な方法として、プログラムの事前条件・事後条件の組を用いる方法が知られている。また、その背景となる理論として、プログラムの事前条件・事後条件を、公理と推論規則によって導出することでプログラムの正当性を示す方法論である公理的意味論が知られている。公理的意味論の具体例としてホーア論理が知られている。【０００３】
特開2005-182806号公報（特許文献1）は、ある与えられた仕様を満たすプログラムを生成する方法について述べており、仕様の記述方法の一つとして公理的意味論を用いたものが想定されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開2005-182806号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明は、プログラムの事後条件があらかじめ与えられている場合に、プログラムの事前条件を効率よく生成するための事前条件生成装置を提供する。
【課題を解決するための手段】
【０００６】
本発明の一態様としての事前条件生成装置は、
命令型プログラミング言語によって記述されたプログラムを記号実行することにより前記プログラムを論理式の形式に変換したプログラム論理式を得る記号実行部と、
それぞれ前記プログラムに含まれる変数を用いて記述された複数の論理式Aを含む集合Sを記憶する第1の記憶部と、
前記プログラムに含まれる変数を用いて記述された、前記プログラムの事後条件を表す論理式Bを記憶する第2の記憶部と、
前記複数の論理式Aと、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第1の論理式を作成する論理式作成部と、
前記第1の論理式を真にする解を求め、前記解が存在しないとき前記第1の論理式において同時に真にすることが不可能な項の組を特定する問題ソルバと、
前記項の組に含まれるすべての論理式Aの集合を前記プログラムの第1の事前条件を表すものとして記憶する第3の記憶部と、
前記論理式Aの前記集合を緩和項集合N1として記憶する第4の記憶部と、を備え、
前記論理式作成部は、
（A1）前記緩和項集合N1に属する論理式Aにそれぞれ対応して真または偽の値をとる緩和変数を設定し、
（B1）前記緩和項集合N1に属する論理式Aと、前記論理式Aに対して設定された緩和変数との論理和よりなる論理式の集合である集合NN1を取得し、
（C1）前記緩和項集合N1に属する論理式Aの個数が2以上のときに、前記論理式Aに対しそれぞれ設定された前記緩和変数の否定の論理和を変数選択項v1として取得し、
（D1）前記集合Sから前記緩和項集合N1を除いた集合S-N1に属する論理式と、前記集合NN1に属する論理式と、前記変数選択項v1と、前記プログラム論理式と、前記論理式Bの否定と、の論理積である第2の論理式を生成し、
前記問題ソルバは、前記第2の論理式を真にする解を求め、前記解が存在しないときは前記第2の論理式において同時に真にすることが不可能な項の組を特定し、
前記第3の記憶部は、前記第2の論理式に対して特定された前記項の組に含まれるすべての論理式Aの集合を前記プログラムの第2の事前条件を表すものとして記憶する
ことを特徴とする。
【発明の効果】
【０００７】
本発明により、プログラムの事後条件があらかじめ与えられている場合に、当該プログラムの事前条件を効率よく生成することが可能となる。
【図面の簡単な説明】
【０００８】
【図１】本発明の一実施の形態に従った事前条件生成装置の基本構成を示すブロック図である。
【図２】図1の装置の全体の処理の流れを示すフローチャートである。
【図３】充足不能コア計算処理の流れを示すフローチャートである。
【図４】結果利用部の詳細ブロック図である。
【図５】プログラムの例、事前条件の例、事後条件の例をそれぞれ示す図である。
【図６】事前条件生成装置の別の構成例を示すブロック図である。
【図７】充足不能コア計算処理を説明するための第1の補足説明図である。
【図８】充足不能コア計算処理を説明するための第2の補足説明図である。
【図９】結果利用部の処理を説明するための図である。
【発明を実施するための形態】
【０００９】
まず本発明者が本発明をなすに至った経緯およびその技術的背景について説明する。
【００１０】
公理的意味論において、事前条件Qおよび事後条件Rと、プログラムSとの間には、ホーア論理の記述に従えば{Q} S {R}が成立する。これは、事前条件Qが成り立つ状況でプログラムSを実行し、実行が完了すれば、Rが必ず成り立つ、という意味である（プログラムSの停止まで保証する流儀もあるが、ここでの意味ではSの停止性までは言明しないものとする）。
【００１１】
これは、プログラムSの実行を意味する論理式をPS とすると、以下の命題が恒真であることと同義である。  
Q∧PS ⇒ R    … (1)
【００１２】
ところで、事前条件Qは条件として緩ければ緩いほど（弱ければ弱いほど）よいとされる。事前条件Qが緩いほど、プログラムSを実行するための前提条件が緩くなるため、事後条件Rを保証しながらより多くの状況下でプログラムSを実行できることになるからである。
【００１３】
事前条件Qは適当な論理式の連言（論理積、∧）として表現できるが、その連言を構成する論理式の集合は、小さければ小さいほど、Q全体が緩くなるので事前条件としては適切である。
【００１４】
従って、事前条件Qを構成する論理式の集合を考えたとき、その論理式の集合のなるべく小さい部分集合が取得できれば、より適切な事前条件を構成することができる。
【００１５】
本発明者は、Qを構成する論理式の集合から、より適切な事前条件を構成するための適切な部分集合を見つけるのに、充足不能コア（unsatisfiable core）の導出機能を有するSAT(satisfiablility)ソルバを用いることに着目した。
【００１６】
SATソルバは、SAT問題（命題論理の充足可能性問題）のソルバであり、近年、飛躍的発展を遂げ，多くの分野で利用されている。特に最近は、SAT問題として与えられた命題論理式の解（命題論理式を真にする解）を単に導出するのみならず、解が導出不能（充足不能、unsatisfiable）であったときに、その論理式の項のうち、やはりその連言の解が導出不能であるような項の部分集合である充足不能コアを求める機能を有するSATソルバも存在する。
【００１７】
また、特にこの部分集合が最小であるものを最小充足不能コア（mimimal unsatisfiable core）と呼ぶ。すなわち、最小充足不能コアは、この部分集合からどの項を除いても、除去後の部分集合の連言によって構成される命題論理式が充足可能になってしまうようなものである。この最小充足不能コアを計算するアルゴリズムも近年提唱されている。このアルゴリズムの一例が、非特許文献1（E. Torlak et al. Finding Minimal Unsatisfiable cores of Declarative Specifications, FM 2008, LNCS 5014, pp. 326-341, 2008）に開示されている。
【００１８】
上記のような充足不能コア（unsatisfiable core）を求める機能を有するSATソルバを用いることで、前述のQを構成する論理式の集合から、事前条件を構成する適切な部分集合を見つけることが可能である。これは次のような考えに基づいている。
【００１９】
(1)の式全体の否定を取ると、次の式になる。  
Q∧PS ∧¬R    … (2)
{Q} S {R}が成立することは、つまり(2)が恒偽であることと同義である。
【００２０】
これはつまり、(2)を命題論理式としてSAT問題を解くと、充足不能（(2)式を真にする解は存在しない）となることを意味する。
【００２１】
ここで、充足不能コアを導出する機能を持ったSATソルバを用いれば、(2)の式から充足不能コアを求めることができる。この充足不能コアは、Qを構成する論理式の部分集合から構成されるQ’を含んでいるはずである。そしてこのQ'も、やはり事前条件としての性質を保つ。つまり、{Q’} S {R} が成り立つ。上記の説明に従えば、Q’の方がQよりも適切な事前条件ということになる。
【００２２】
よって、充足不能コアの導出機能付きのSATソルバを用いる事で、事前条件を構成する適切な部分集合（論理式の組合せ）を導出できる。ただし、1つの事後条件に対応する適切な論理式の組合せは1つとは限らないため、その組合せを漏れなく列挙してやることが望ましい。
【００２３】
しかしこれまで、SATソルバの充足不能コアの導出機能を利用して、事前条件を構成する適切な部分集合を見つける技術は存在しなかった。すなわち、何かしら別の目的で充足不能コアを列挙するアルゴリズムは存在したが、前述のような、事後条件に合致する事前条件を探索するという目的にSATソルバを用いて、充足不能コアを列挙する技術はこれまで存在しなかった。
【００２４】
ここで、SATソルバを用いて事前条件を構成する適切な部分集合を求めようとする際、非特許文献2（Mark H. Liffiton, Karem A. Sakallah: Algorithms for Computing Minimal Unsatisfiable Subsets of Constraints. J. Autom. Reasoning 40(1): 1-33(2008)）に開示されたアルゴリズムを用いることが考えられる。このアルゴリズムは、与えられた論理式に対する全ての最小充足不能コア(mimimal unsatisfiable core）を列挙する。しかし、この方法では、すべてのコアの数は論理式の大きさに対して指数的に増大してしまい、事前条件を構成する論理式の組合せを列挙する目的には不必要なものまで列挙してしまう（例えば同じ組合せを複数列挙してしまう）問題があった。また、性能も効率的なものとは言えなかった。
【００２５】
以上の経緯に鑑み、本明細書では、充足不能コア出力機能付きのSATソルバ（または後述のSMTソルバ）を用いて、充足不能コアを効率的に列挙することにより、当該プログラムの事前条件を構成する論理式の組合せを効率よく列挙する方法を開示する。
【００２６】
以下、図面を適宜参照しながら、本発明の実施の形態について詳細に説明する。
【００２７】
まず、用語と記法の定義について説明する。  
（1）本明細書では、論理式の有限集合Sに対して、集合Sの要素全ての論理積を∧S と記述する。S={A,B,C} であれば、∧S は A∧B∧C のことである。S=φ （空集合）のときには∧S は恒真な論理式 true のことである。また、∧{X1, X2, X3, …, Xn}のことを単に∧Xiと書く。  
同様に、論理式の有限集合Sに対して、集合Sの要素全ての論理和を∨Sと記述する。S={A,B,C}であれば∨SはA∨B∨Cのことである。S=φ（空集合）のときには∨Sは恒偽な論理式falseのことである。また、∨{X1,X2,X3,…,Xn}のことを単に∨Xiと書く。
【００２８】
（2）（1）と同様に、集合の族Sに対して、その族Sの要素となる集合全ての直和を∪Sと書く。  
（3）事前条件, 事後条件
論理式Q が成り立っている状態でプログラムCを実行し、実行が終了した場合には終了状態で常に論理式Rが成り立っているとする(プログラムCが終了することは要求されていない)。このとき、論理式QをプログラムCの事前条件、論理式RをプログラムCの事後条件と呼ぶ。また、この関係（命題）がなりたっていることを {Q} C {R} と記述する。  
（4）充足不能コア（unsatisfiable core） 
0個以上の項の連言で与えられた論理式が充足不能（論理式を真にする解が存在しない）であったときに、当該論理式を構成する項の集合において、やはりその連言の解が存在しない項の部分集合を充足不能コアと呼ぶ。
【００２９】
図1は、本発明の一実施の形態に従った事前条件生成装置の基本構成を示す。  
図1の事前条件生成装置は、プログラム記憶部101、事後条件記憶部102、候補論理式集合記憶部103、記号実行部104、充足不能コア計算部100、結果記憶部114、結果利用部115を備える。
【００３０】
充足不能コア計算部100は、論理式作成部105、命題論理式変換部106、SATソルバ107、論理式復元部108、緩和項削除部109、緩和項記憶部110、項選択部111、変数対応記憶部112、処理済み緩和項記憶部113を備える。
【００３１】
命題論理式変換部106、SATソルバ107および論理式復元部108の組は例えば本発明の問題ソルバに相当する。候補論理式集合記憶部103は第1の記憶部、事後条件記憶部102は第2の記憶部、結果記憶部114は第3の記憶部に相当する。また緩和項記憶部110および処理済み緩和項記憶部113は第4の記憶部に相当する。各記憶部103、102、114、113は物理的に同一の装置内に存在しても異なる装置に存在してもよい。
【００３２】
図2は本装置の全体の処理の流れを示すフローチャートである。以下、図2を参照して、図1の装置の各要素の動作の詳細を説明する。
【００３３】
プログラム記憶部101は、プログラムC（ソースコード）を記憶する。プログラムCの一例を図5（A）に示す。このプログラムCは、変数xの絶対値を計算して変数yへと格納するプログラムである。
【００３４】
事後条件記憶部102は、プログラムCの事後条件pを表す論理式（本発明の論理式Bに対応）を記憶する。事後条件記憶部102に記憶される論理式の一例を図5(B)に示す。ここでは論理式としてy ≦ 6（yは6以下） が記憶されており、この論理式が事後条件pに相当する。事後条件pを表す論理式は複数でもよく、この場合、これら複数の論理式の論理積が事後条件に相当する。
【００３５】
候補論理式集合記憶部103は、プログラムCに対する事前条件の部品候補として複数の論理式（候補論理式あるいは部品候補）を記憶する。これらの論理式は本発明の論理式Aに対応する。図5（C）に候補論式集合記憶部103に記憶される論理式の一例を示す。すなわち、ここでは以下の4つの論理式a,b,c,dが記憶されている。本実施形態では、これらの論理式の中から、事前条件を構成するための適切な論理式の組合せを見つける。  
a: x ≦ 4（xは4以下）
b: x ≦ 5（xは5以下）
c: x ≧ -5（xは-5以上）
d: x ≦ 7（xは7以下）
【００３６】
まず図2のステップS11では、記号実行部104が、プログラム記憶部101からプログラムCを読み出し、読み出したプログラムCを、記号実行の手法を用いて論理式の形式に変換してプログラム論理式を得る。
【００３７】
ここでいう論理式とは具体的には、プログラム内で使用されている変数と、等号・不等号、および算術演算子・論理演算子などから構成されるブーリアン型（2値の値をもつ型）の式のことである。これは、一階論理の論理式として解釈できる。
【００３８】
尚、記号実行によってプログラムをブーリアン型の式に変換する方法は古くから知られている。記号実行では、ソースコードを１行ずつ解釈しながら、予め決められた変換規則に従って与えられた前提条件に変換を加え、更に場合によっては別の条件を連言で追加して、解釈した１行が実行後に成り立つ条件を求める。ある１行を解釈して得られた条件が次の１行を解釈する際の前提条件となる。
【００３９】
例えば非特許文献3（R. Dannenberg and G. Ernst, Formal Program Verification Using Symbolic Execution, IEEE Trans. on Software Eng., vol. SE-8, no. 1, January 1982）では、プログラムと対応する事前条件・事後条件の組み合わせが与えられたとき、事前条件を元に記号実行を行ってプログラムをブーリアン型の式に変換し、得られた式が事後条件と比較して正しいかどうかを確認することで、プログラムの正しさを検証する方法について述べている。
【００４０】
同文献では記号実行にあたり事前条件を上記前提条件（初期条件）として用いているが、初期条件としての前提条件は省略されても何ら問題なく記号実行は可能である（ソースコードさえあれば、記号実行が可能である）。変換対象となる条件が何もないだけで、必要に応じて条件式が追加されるだけである。
【００４１】
また、同文献では複数の式が存在する場合は記号実行によりそれぞれ別個の論理式を作成する（つまり記号実行の出力結果が単一の論理式ではなく、複数の論理式の集合とする）ように記載されているが、本実施形態の記号実行部104は、記号実行で、プログラムCを単一の論理式に変換する。
【００４２】
具体的に、図５（A）のプログラムCの場合、記号実行部104は、記号実行により、(x < 0 ∧ y = -x) ∨ (x ≧ 0 ∧ y = x)の論理式を生成する。
【００４３】
ステップS12では、こうして求められたプログラム論理式と、候補論理式集合記憶部103内の候補論理式の集合と、上記事後条件を表す論理式とを、充足不能コア計算部（充足不能コア計算部）100に読み込み、充足不能コアを求めることにより、事前条件を構成する論理式の集合（部分候補集合）を取得する。
【００４４】
部分候補集合が得られたときは（S13のYES）、この部分候補集合を結果記憶部114に格納する（S14）。部分候補集合に含まれる論理式の論理積が事前条件に相当する。そして充足不能コア計算部100は、図示しない表示手段を介してユーザーに対して、さらに答えが必要か否か、すなわち別の部分候補集合を取得するか否かの判断を促すメッセージを通知する。ユーザーは図示しない入力インターフェースを介して指示データを入力し、充足不能コア計算部100は、指示データが、さらに答えが必要でないことを示す場合（すなわち十分な結果が得られたことを示す場合）、結果利用部115へ処理を移行する（S16）。指示データが、別の部分候補集合の取得を示す場合、充足不能コア計算部100の処理（ステップS12）に戻り、2回目の処理を行う。
【００４５】
一方、ステップS13で部分候補集合が得られなかったと判断されたときは結果利用部115の処理に移行する（S16）。
【００４６】
なおステップS15においてユーザー判断を経ずにステップS12に戻って処理を繰り返してもよい。この場合、ステップS13で計算結果（部分候補集合）が得られなくなったと判断された時点で（NO）、結果利用部115の処理に移行する（S16）。
【００４７】
なお、ステップS12で求められる充足不能コアが最小充足不能コア(mimimal unsatisfiable core）になることが保証されているようなSATソルバを用いる場合、得られた結果には冗長な条件が含まれないことが保証できる。もしそのようなSATソルバを用いない場合は、別の方法を導入して、得られた論理式の集合から更に絞込みを行って冗長な条件（論理式）を排除してもよい。
【００４８】
図3は、ステップS12で行う充足不能コア計算部100の処理の流れを示したものである。ここで重要となるのは、既に1つ以上の部分候補集合（事前条件を構成する適切な論理式の集合）を求めていた場合、それらとは別個の部分候補集合を求める必要があることである。そのため、本実施形態では、後述の緩和項集合、および処理済み緩和項集合を用いた処理を新たに導入している。なお、緩和項記憶部110、変数対応記憶部112、処理済み緩和項記憶部113は図2のフローが開始された時点ではまだ何も記憶されていない状態とする。
【００４９】
まず、ステップS21において、充足不能コア計算部100内の論理式作成部105が、候補論理式集合記憶部103から候補論理式集合Sを、記号実行部104からプログラムを変換して得たプログラム論理式Pc、を、事後条件記憶部102から事後条件を表す論理式postを入力として受け取る。
【００５０】
ステップS22〜S24は、現時点では緩和項記憶部110および処理済み緩和項記憶部113内に何も記憶されていないため、スキップされ、ステップS25に進む。
【００５１】
ステップS25では、論理式作成部105が、ステップS21で取得したプログラム論理式Pc、候補論理式集合S、事後条件postを元に、以下の式に従って、論理式（第1の論理式）を生成する。この論理式は、集合Sに属する複数の論理式と、プログラム論理式と、事後条件を表す論理式の否定との論理積である。  
F＝∧S∧Pc∧¬post
【００５２】
図5（A）〜図5（C）に示した本例の場合は、以下の論理式（第1の論理式）が生成される。括弧で囲まれたものが、論理式の項に相当する。  
F1= a∧b∧c∧d∧Pc∧¬p = (x ≦ 4)∧(x ≦ 5)∧(x ≧ -5)∧(x ≦ 7)
∧((x < 0 ∧ y = -x) ∨ (x ≧ 0 ∧ y = x))
∧(y ＞ 6)
【００５３】
次に、ステップS26では、命題論理式変換部106が、論理式FをSATソルバ107で処理可能な命題論理式の形式に変換する。
【００５４】
ここで、命題論理とは数理論理学の体系の1つである。命題論理において、論理式はリテラル、あるいは0個以上のリテラル同士を、論理和（選言、∨）、論理積（連言、∧）、含意（→）のいずれかの演算子によって組み合わせて表現できるものである。ここでリテラルとは、変項（2値の値を持つ変数）または、変項に否定演算子（¬）を適用して得られるものを指す。論理式から命題論理式への変換アルゴリズムは様々な方式が知られており、変換アルゴリズム自体は本発明の本質ではないため、以下では簡単に説明するに留める。
【００５５】
本例では、整数は符号付きの5ビットで解釈し、負の数は2の補数で表現されるものとする。尚、変数xを構成する5ビットを、最下位ビットから順にx0〜x4のブーリアン型の5変数で表し、同様に、変数yを構成する5ビットを最下位ビットから順にy0〜y4のブーリアン型の5変数で表すとする。 同時に、整数式の等号・不等号（＝、≦、≧、＜、＞）と否定演算（¬）に関する変換方法が設定されており、その方式に従って変換されるものとする（この方式は、例えば後述のMathSATが利用できるのであれば、その変換方式に従って変換すればよい）。また、本例では多くのSATソルバが入力の標準形として採用している、和積標準形（Conjunctive Normal Form, CNF）に変換を行うものとする。これは、リテラルを選言で組み合わせたもの（項）を、連言で組み合わせた形式で記述した論理式のことである。
【００５６】
本例では、上記のF1の論理式を変換した結果として次のような式が得られる。ここでは簡単の為、F1の式を構成するa, b, c, d, Pc, ¬p ごとに変換した結果を示している。実際の変換結果の最終形は、これらの項が全て連言で結ばれたようなものになる。  
a: (x4∨¬x3)∧(x4∨¬x2∨¬x1)∧(x4∨¬x2∨¬x0)
b: (x4∨¬x3)∧(x4∨¬x2∨¬x1) 
c: (¬x4∨x3)∧(¬x4∨x2∨x1)∧(¬x4∨x2∨x0)
d: (x4∨¬x3)
Pc: (x4∨¬x3∨¬y3)∧(x4∨x3∨y3)∧(x4∨¬x2∨¬y2)∧(x4∨x2∨y2)
∧(x4∨¬x1∨¬y1)∧(x4∨x1∨y1)∧(x3∨¬x0∨¬y0)∧(x3∨x0∨y0)
∧(¬x4∨¬x3∨y3)∧(¬x4∨x3∨¬y3)∧(¬x4∨¬x2∨y2)∧(¬x4∨x2∨¬y2)
∧(¬x4∨¬x1∨y1)∧(¬x4∨¬x1∨y1)∧(¬x4∨¬x0∨y0)∧(¬x4∨¬x0∨y0) 
¬p: ¬y4∧(y3∨y2)∧(y3∨y1)∧(y3∨y0)
【００５７】
次に、ステップS27では、SATソルバ107は、この命題論理式を入力として受け取り、この命題論理式を真にする解を求める充足可能性問題を解き、当該命題論理式を真にすることが可能なときはそのような解を取得し、不能なとき（すなわち命題論理式が充足不能なとき）は、充足不能コアを計算する。計算される充足不能コアは、同時に真にすることが不可能な項の組を命題論理式の形式で含む。例えば、もしa、c, Pcを同時に真にすることが不可能である場合は、計算される充足不能コアは、これらを命題論理式の形式で含む。
【００５８】
充足不能コアが計算された場合、すなわち上記命題論理式が充足しなかった場合（S28のNO）、論理式復元部108は、得られた充足不能コアを元の論理式の形式に復元する（S29）。そして、復元された論理式の集合に含まれる候補論理式をすべて特定し、特定した候補論理式の集合（部分候補集合）を、事前条件を表すものとして結果記憶部114に格納する（S30）。特定された候補論理式の論理積が事前条件に相当する。
【００５９】
さらに緩和項記憶部110に記憶されている緩和項集合を、処理済み緩和項記憶部113に処理済み緩和項集合として追加するとともに、上記特定した候補論理式の集合を緩和項集合として緩和項記憶部110に上書きする（直前に緩和項記憶部110に記憶されていた緩和項集合は消去される）（S30）。
【００６０】
なおステップS27で充足不能コアが計算されなかった場合、すなわち上記命題論理が充足した場合は（S28のYES）、ステップS31のNOを経て本フローを終了し（1回目のフローでは緩和変数（後述）はまだ存在しないためステップS31の判定はNOとなる）、さらに図2のステップS13のNOを経て、ステップS16へ進む。ただし1回目のフローでこのような結果になった場合は、結果記憶部114には何も記憶されていないため、結果利用部115の処理へ進むことなく、図2のフローを終了するようにすることも可能である。
【００６１】
本例では、充足不能コア計算部100で充足不能コアが得られ（S28のNO）、これを論理式復元部108で逆変換し、逆変換した結果から候補論理式をすべて特定して{a, c} が得られたとする。そしてこの{a, c}が結果記憶部114に事前条件（第1の事前条件）を表す論理式集合として図7（A）に示すように記憶される（S30）。またこの{a, c}は、緩和項集合（本発明の緩和項集合N1に相当）として、同様に緩和項記憶部110に記憶される（S30）。緩和項集合における各要素（論理式）は、緩和項と称される。
【００６２】
なお、緩和項記憶部110には{a, c}が記憶される前には何も記憶されていないため、処理済み緩和項記憶部113に移すべき内容は緩和項記憶部110には存在せず、処理済み緩和項記憶部113にはこの時点で何も記憶されない。
【００６３】
ここで便宜上、既に求まっている充足不能コアの個数をk個とする。（kという数値は特に本装置が特別に記憶・計算する必要はないが、以下では便宜上この値を使って説明する。ここでは充足不能コアが1つ求まったためk=1とする）。
【００６４】
次に、図2のステップS15のNOを経てステップS12に戻り、本フロー（2回目のフロー）の処理がステップS21から再度開始される。
【００６５】
ステップS21では、1回目のフローと同様に、論理式作成部105が、プログラム論理式、事後条件、候補論理式集合を取得する。なお1回目のフローで取得したこれらのデータを内部に記憶しておき、記憶しておいたこれらのデータを用いるようにしてもよい。
【００６６】
ステップS22では、項選択部111が、緩和項記憶部110から緩和項集合を、処理済み緩和項記憶部113から処理済み緩和項集合を受け取る。処理済み緩和項記憶部113にはk≧2のときのみ処理済み緩和項集合が(k-1)個存在し、緩和項記憶部にはk≧1のときのみ緩和項集合が1つ存在する。
【００６７】
項選択部111は、k≧2の場合は処理済み緩和項記憶部113から、 (k-1)個の処理済み緩和項集合Nj (1≦j＜k-1)を受け取る。また、緩和項記憶部110に記憶されている1つの緩和項集合Nkを受け取る。項選択部111は、受け取った(k-1)個の処理済み緩和項集合Nj (1≦j＜k-1)と、1つの緩和項集合Nkとをまとめて、k個の集合{Ni} (1≦i≦k)として扱う。
【００６８】
項選択部111は、k=1の場合は緩和項記憶部110に記憶されている1つの緩和項集合NkをNi(i=1)として受け取る。
【００６９】
本例ではk=1であり、緩和項記憶部110に緩和項集合{a, c}が記憶され、処理済み緩和項記憶部113には何も記憶されていないため、項選択部111は、1つの緩和項集合{a, c}を取得する。
【００７０】
次に、ステップS23では、項選択部111が、受け取った{Ni}を元に、各Niの要素である各論理式にそれぞれ対応する真または偽の2値をとる変数（緩和変数）を設定する。同一の論理式に対応する緩和変数は1つとする。そして、各iごとに、Niの要素である各論理式に対して設定された変数（緩和変数）の集合 Ri（1≦i≦k ）を生成する。なお、各NiはSの部分集合である。項選択部111は、緩和変数と論理式との対応を変数対応記憶部112に格納する。さらに、項選択部111は、各{Ni} と、各{Ni}にそれぞれ対応する緩和変数集合{Ri}を論理式作成部105に出力する。
【００７１】
本例では、S = {a,b,c,d } 、k=1、N1 = {a,c}であることから、論理式aに対応する緩和変数ra、論理式cに対応する緩和変数rcを設定し、緩和変数ra,rcの集合であるR1={ra,rc}を作成する。緩和変数ra,rcは真か偽かの2値を取る。項選択部111は、論理式aと緩和変数raとの対応、論理式cと緩和変数rcとの対応を、図7（B）に示すように、変数対応記憶部112に格納する。また項選択部111は、論理式作成部105にN1 = {a,c}と、R1={ra,rc}とを出力する。
【００７２】
理解を深めるため、別例として、S = {a,b,c,d,e,f,g,h} (a,b,c,d,e,f,g,hは論理式) 、k=3、N1 = {b,c}, N2 = {d}, N3 = {a,c,g} の場合を考える。この場合は、緩和変数 ra, rb, rc, rd, rg を設定し、R1 = {rb,rc}, R2 = {rd}, R3 = {ra,rc,rg}が生成される。そして論理式aと緩和変数raとの対応、論理式bと緩和変数rbとの対応、論理式cと緩和変数rcとの対応、論理式dと緩和変数rdとの対応、論理式gと緩和変数rgとの対応が変数対応記憶部112に格納される。また、R1 = {rb,rc}, R2 = {rd}, R3 = {ra,rc,rg}が、N1 = {b,c}, N2 = {d}, N3 = {a,c,g}とともに論理式作成部105に渡される。
【００７３】
次にステップS23では、論理式作成部105が、項選択部111から受けた{Ni} と、対応する緩和変数集合Riとを用いて、{Ni}に属する論理式と、当該論理式に対応する緩和変数との各選言を含む集合NNを作成する。
【００７４】
本例では、N1 = {a,c}とR1={ra,rc}とを用い、緩和変数raと、対応する論理式aとの選言(a∨ra)と、緩和変数rcと、対応する論理式cとの選言(c∨rc)とを含む集合NNを作成する。すなわちNN=｛(a∨ra)、(c∨rc)｝である。これは例えば本発明の集合NN1に相当する。
【００７５】
また上記の別例の場合は、N1 = {b,c}, N2 = {d}, N3 = {a,c,g}と、R1 = {rb,rc}, R2 = {rd}, R3 = {ra,rc,rg}とを用い、NN＝{(a∨ra), (b∨rb), (c∨rc), (d∨rd), (g∨rg)}を作成する。
【００７６】
次に、ステップS24では、論理式作成部105が、緩和変数集合Riを元に、変数選択項Vを作成する。Vの作成方式の１つを示す。すなわち、まず各Riごとに、Riの要素数が2以上（すなわちRiに対応するNiに属する論理式の個数が2以上）ならば全ての変数の否定の選言をvとして取得し、Riの要素総数が1（すなわち、Riに対応するNiに属する論理式の個数が1）ならばvとしては何も設定しない（v＝真と設定するのと同義である）。そして各Riごとに取得したvの連言を取ってVとする。
【００７７】
これにより、各Riで要素となる変数が複数ある場合に、そのいずれか少なくとも１つが偽になることを、後段のステップでSATソルバ107に保証させる。
【００７８】
本例では、R1={ra,rc}のみ存在するため、変数選択項v= V = (¬ra∨¬rc)が作成される。これは例えば本発明の変数選択項v1に相当する。“ (¬ra∨¬rc)”はra、rcのうちどちらか一方が偽（0）になることを要求している。
【００７９】
また上記の別例の場合は、
（1）R1 = {rb,rc}に対して、v=(¬rb∨¬rc)が作成される。これはrb、rcのうちどちらか一方が偽（0）になることを要求している。  
（2）R2 = {rd}に対しては、vには何も設定されない。  
（3）R3 = {ra,rc,rg}に対して、v=(¬ra∨¬rc∨¬rg)が作成される。これは、ra,rb,rcのうちの少なくとも1つが偽になることを要求している。  
よって、これら全てのvの連言をとって、
V＝ (¬rb∨¬rc)∧(¬ra∨¬rc∨¬rg)
を作成する。
【００８０】
このような変数選択項を導入することにより、既に求めている充足不能コアと、次に求めるべき充足不能コアとに含まれる項（ここでは候補論理式）の一部がオーバーラップしている可能性を許容しつつ、なるべく多くの充足不能コアを列挙することができる。
【００８１】
次に、ステップS25では、論理式作成部105が、以上で得た集合Ni, 集合NN、変数選択項Vを元に、以下の論理式Fを作成する。この論理式Fは、集合Sから集合Niの和集合を除いた集合(S−(∪Ni))に属する論理式と、集合NNに属する論理式と、変数選択項Vと、プログラム論理式Pと、事後条件を表す論理式の否定と、の論理積を表す。 S−(∪Ni)は、緩和項集合および処理済み緩和項集合のいずれにも含まれない論理式の集合を意味する。なおこの式Fは、集合Ni, 集合NN、変数選択項V に関する項目を除去すると、先に示したF＝∧S∧Pc∧¬postに一致する。  
F＝∧(S−(∪Ni))∧(∧NN)∧V∧P∧¬post
本例では、
S = {a,b,c,d } 、
N1 = {a,c} 、
NN=｛(a∨ra)、(c∨rc)｝、
V=(¬ra∨¬rc)であるから
F2 = (a∨ra)∧b∧(c∨rc)∧d∧(¬ra∨¬rc)∧Pc∧¬post
となる。このF2は例えば本発明の第2の論理式に対応する。
【００８２】
上述したように“(¬ra∨¬rc)”はra、rcのうちどちらか一方が偽（0）になることを要求している。したがって、論理式F2は、論理式a,cの一方が真になることを要求される一方、他方が成り立たなくても良いことを示している。このように緩和変数ra、rcを用いることで、最初に用いた論理式F1における論理式a,cの項に対し条件の緩和を図っている。
【００８３】
また上記別例の場合は、
S = {a,b,c,d,e,f,g,h} 、
N1 = {b,c}, N2 = {d}, N3 = {a,c,g} 、
NN＝{(a∨ra), (b∨rb), (c∨rc), (d∨rd), (g∨rg)} 、
V＝ (¬rb∨¬rc)∧(¬ra∨¬rc∨¬rg) 、
であるから、
F3＝(a∨ra)∧(b∨rb)∧(c∨rc)∧(d∨rd)∧(e)∧(f)∧(g∨rg)
∧(¬rb∨¬rc)∧(¬ra∨¬rc∨¬rg)∧P∧¬post
となる。
【００８４】
次にステップS26では、命題論理式変換部106が、論理式Fを命題論理式の形式に変換し、ステップS27では、得られた命題論理式をSATソルバ107が解く。論理式Fを真にする解が得られない場合は（S28のNO）、ステップS29に進み、得られた場合は（YES）、ステップS31に進む。
【００８５】
本例において、論理式F2から命題論理式への変換の際、緩和変数は、対応する緩和項が変換された後の各項に展開する。また、変数選択項は以下に特に記述しないが、変換後の命題論理式内の各項にそのまま追加される。論理式F2を変換して得られる命題論理式（変換結果）のうち、F1より変更のあった a∨ra、c∨rc のみを以下に記す。F2 に含まれる残りの項（変数選択項以外）は、F1の項に等しい。  
a∨ra: (x4∨¬x3∨ra)∧(x4∨¬x2∨¬x1∨ra)∧(x4∨¬x2∨¬x0∨ra)
c∨rc: (¬x4∨x3∨rc)∧(¬x4∨x2∨x1∨rc)∧(¬x4∨x2∨x0∨rc) 
この論理式F2から変換された命題論理式は充足可能であり、SATソルバにより、当該命題論理式を真にする解が得られる。ここでは仮に rc = 真, x = -8 （x4＝x3＝真、x2＝x1＝x0＝偽）, y = 8 （y4＝偽、y3＝真、y2＝y1＝y0＝偽）という解が得られたとする。解が得られたためステップS31に進む。
【００８６】
ステップS31では、ステップS27で得られた解の中に、真となっている緩和変数が存在するかどうかを確認する。真となっている緩和変数が存在しない場合は（S31のNO）、これ以上の計算結果（部分候補集合）は得られないと判断して、図3のフローを終了する。一方、真となっている緩和変数が存在する場合は（S31のYES）、ステップS32に進む。本例では解の中に、真の緩和変数rcが存在するためステップS32に進む。
【００８７】
ステップS32では、真の緩和変数に対応している論理式（緩和項）を、変数対応記憶部112から読み取る。そして、読み取った論理式（緩和項）を、緩和項記憶部110に記憶されている緩和項集合Nkから削除する。
【００８８】
本例では、変数対応記憶部112に、論理式aと緩和変数raとの対応、論理式cと緩和変数rcとの対応が記憶されているため、真の緩和変数rcに対応する論理式cが読み取られる。そして緩和項記憶部110における緩和項集合N1 = {a,c}から論理式（緩和項）cを削除する。この結果、緩和項記憶部110内の緩和項集合は、図7（C）に示すように、N1 = {a}となる。
【００８９】
また上記別例の場合は、仮に解としてrgを真にするものが得られたとするならば、緩和項集合N3から論理式（緩和項）gが削除されて、N3 = {a,c}となる。
【００９０】
次にステップS33では、充足不能コア計算部100が、ステップS32で緩和項が削除された結果として、緩和項集合Nkが空集合になったかどうか、すなわち緩和項集合Nkの要素数が0になったかどうかを判断する。空集合になった場合は（S33のYES）、新たな計算結果は求められないと判断し、図3のフローを終了する。一方、空集合になってない場合は（S33のNO）、再びステップS22の項選択部111の処理に戻り、更新された緩和項集合Nkを元に再度計算を行う。
【００９１】
本例では、緩和項cを削除した結果、緩和項集合はN1 = {a}であり、N1は空集合でないためステップS22に戻る。
【００９２】
次にステップS22〜S25において、N1={a}を緩和項集合として、上述したのと同様の処理を繰り返す。この結果、緩和変数raが設定され、以下の論理式F4が作成される。変数対応記憶部112には、図7（D）に示すように、論理式aと緩和変数raとの対応が記憶される。論理式F4は例えば本発明の第2の論理式に相当する。  
F4 = (a∨ra)∧b∧c∧d∧ra∧Pc∧¬p
【００９３】
この論理式F4を命題論理式変換部106で命題論理式に変換し(S26)、SATソルバ107で同様の処理を行うと(S27)、この論理式F4は充足されず(S28のNO)、SATソルバ107より充足不能コアが求められる。これを論理式復元部108で復元し、復元結果から候補論理式を特定して、集合 {b, c} が得られたとする（S30）。
【００９４】
結果記憶部114はこの結果{b, c}を、事前条件（第2の事前条件）を表すものとして、図7（E）に示すように追加記憶する（S30）。
【００９５】
また、緩和項記憶部110は、内部に現在記憶されている緩和項集合N1={a}を処理済み緩和項記憶部113に、処理済み緩和項集合N1として追加し、緩和項記憶部110の内容を、求まった結果N2={b, c}で上書きする（S30）（現時点で計2つの充足不能コアが得られたためk=2である）。
【００９６】
したがってこの時点で、結果記憶部114には{a, c}と{b,c}が記憶されており、緩和項記憶部110には緩和項集合N2={b,c}が記憶されており、処理済み緩和項記憶部113には処理済み緩和項集合N1={a}が記憶されている。
【００９７】
充足不能コア計算部100は、ユーザーに対して、さらに答えが必要か否かを促す（図2のステップS15）。ユーザーが更に答えが必要との指示が入力された場合（NO）、ステップS12において、再度、図3のフロー（3回目のフロー）の処理を行う。
【００９８】
ここでは処理済み緩和項集合としてN1={{a}}、緩和項集合としてN2={b,c} が与えられているため、変数対応記憶部112には、図8（A）に示すように、論理式aと緩和変数raとの対応、論理式bと緩和変数rbとの対応、論理式cと緩和変数rcとの対応が記憶される（S22）。また、論理式作成部105で、以下の論理式 F5 が作成される(S23〜S25)。論理式F5は例えば本発明の第3の論理式に相当する。  
F5 = (a∨ra)∧(b∨rb)∧(c∨rc)∧d∧(¬rb∨¬rc)∧Pc∧¬p
【００９９】
この論理式F5を命題論理式に変換し、SATソルバ107でSAT計算を行うことで、ra = 真, rb = 真, x = 7, y = 7の解が得られたとする（S28のYES）。
【０１００】
緩和項削除部109は、真となった緩和変数ra,rbが存在するため（S31のYES）、緩和項集合N2={b,c}から、図8（B）に示すように、緩和変数rbに対応する論理式（緩和項）bを削除してN2={c}とする。なお緩和変数raに対応する論理式（緩和項）aは緩和項集合N2に存在しないため緩和変数raに対する処理は行われない。削除の結果、N2={c}であり、緩和項の数は1であるため（S33のNO）、再度、ステップS22に戻る。
【０１０１】
戻ったステップS22では、更新されたNk（ここではN2={c}）を元に、再び項選択部111で処理を行う。緩和項記憶部110内にN2={c}、処理済み緩和項記憶部113内にN1={a}が記憶されているため、変数対応記憶部112には論理式aと緩和変数raとの対応、論理式cと緩和変数rcとの対応が記憶される。ステップS23〜S25では、論理式作成部105により以下の論理式F6が作成される。論理式F6は例えば本発明の第3の論理式に相当する。  
F6 = (a∨ra)∧b∧(c∨rc)∧d∧Pc∧¬p
【０１０２】
命題論理式変換部106でこの式F6を命題論理式に変換し（S26）、SATソルバ107がSAT計算を行うと（S27）、ra = 真, rc = 真, x = -8, y = 8の解が得られる（S28のYES）。
【０１０３】
緩和項削除部109は、真となった緩和変数ra,rcが存在するため（S31のYES）、緩和項記憶部110内の緩和項集合N2から緩和変数rcに対応する論理式（緩和項）cを図8（D）のように削除する（S32）。
【０１０４】
削除の結果、緩和項集合N2は空集合となるため（S33のNO）、本フローの処理を終了し、図2のステップS13に戻る。新たな計算結果は得られなかったため（S13のNO）、充足不能コア計算部100は、これ以上の結果は得られないと判断し、処理を結果利用部115に移行する。
【０１０５】
なお本例では3回目のフローでは充足不能コアは計算されなかったが、もし仮に計算された場合は、第2回目のフローと同様にして、計算された充足不能コアから候補論理式の集合を特定して、これを結果記憶部114に事前条件（本発明の第3の事前条件）を表すものとして記憶する（S30）。そして、さらに緩和項記憶部109および処理済み緩和項記憶部113を更新し（S30）、必要に応じて（S12のNOの場合）、第4回目のフローを行う。
【０１０６】
本例においては、最終的に、結果記憶部114には、図8（D）に示すように{a,c}, {b,c}の2つの論理式集合（部分候補集合）が記憶される。この2つは、すなわち -5≦x≦4（a∧c）と-5≦x≦5（b∧c） の2つが事前条件として成立することを表している。
【０１０７】
次に、図2のステップS16で行う結果利用部115の検証処理について説明する。
【０１０８】
結果利用部115では、結果記憶部114に格納された部分候補集合により形成される事前条件、および事後条件記憶部102内の事後条件を用いて、様々なプログラム検証を行う。一例としては、事前条件を求める際に用いたプログラムCをサブルーチンとして利用する（呼び出す）別のプログラムDの検証に上記事前条件および事後条件を利用することが可能である。
【０１０９】
プログラム検証技術の中にはプログラムCが、与えられた仕様(事前条件・事後条件)を満たすことを仮定することで、プログラムCの実装には全く立ち入らずにプログラムDの検証を行うことが出来るものが知られている。
【０１１０】
そこで、そのような検査技術を用いてプログラムDの検査を行う際に、本装置で求めた事前条件、および上記事後条件を、プログラムCの仕様として用いることで、プログラムDの検証をプログラムCの実装に立ち入らず行うことが出来る。
【０１１１】
図4は結果利用部115の詳細なブロック構成を示す。  
親プログラム記憶部122にプログラムD（親プログラム）が記憶されており、親プログラム仕様記憶部123にプログラムDの仕様(事前条件・事後条件)が記憶されている。プログラムDは、図9に示すように、内部においてプログラムCをサブルーチンとして呼び出す。プログラム検査部121は親プログラム記憶部122に記憶されたプログラムDが親プログラム仕様記憶部123に記憶された仕様を満たすかどうかの検査を行う。
【０１１２】
具体的に、プログラム検査部121は、プログラムDの事前条件が成り立つときにプログラムDが実行された直後にプログラムDの事後条件が成立するという命題が成立するか否かを検査する。この検査は、当該命題の反例を探索することによって行う。つまり、事前条件をQ、事後条件をR、プログラムをDとしたときに{Q}D{R}の反例を探索することによって検査を行う。反例が存在すれば当該命題は成り立たないと判断する。{Q}D{R}の反例の探索は、例えばプログラムDの実行前の状態で事前条件Qが成り立ち、実行後の状態で事後条件Rが成り立たないもの（例えば変数の値）を見つけることで行う。そのような実行例が存在すれば {Q}D{R} は成り立たない。
【０１１３】
そのような探索を行うための方法として、米国マサチューセッツ工科大学の Daniel Jacksonらのグループによる方法(Greg Dennis, Felix Sheng-Ho Chang, and Daniel Jackson. Modular verification of code with sat. In ISSTA ’06: Proceedings of the 2006 international symposium on Software testing and analysis, pp. 109.120, New York, NY, USA, 2006. ACM.)を用いることが出来る。また、この方法を具体化したツールとして、同グループによって開発されている Forge (http://sdg.csail.mit.edu/forge/)  を用いることが出来る。また、別の方法としてモデル検査で用いられている手法を用いることが出来るが、これらの方法の詳細は本発明の主眼ではないため、ここではこれ以上述べない。
【０１１４】
ここで、親プログラムDの検証の際にプログラムD内部で用いられているプログラムCの部分については、プログラムCの実装を参照することなく、プログラムCが、その事前条件（結果記憶部114内の論理式集合）、および事後条件を満たすものとして検査を行う。
【０１１５】
すなわち、図9に示すように、プログラム検査部121は、プログラムDに含まれるプログラムC（サブルーチン）はその事前条件および事後条件を満たすことを仮定して検査を行う。
【０１１６】
これにより親プログラムDの検証を短時間で効率的に行うことができる。
【０１１７】
ここで、結果利用部115は、結果記憶部114に複数の論理式集合が存在するとき（すなわち複数の事前条件が存在するとき）、ユーザーに対し、検証に用いるべき論理式集合（事前条件）を入力インターフェースを介して指定させてもよい。または、結果利用部115は、結果記憶部114内の集合を任意に1つ選択し、選択した集合により表される事前条件を用いてもよい。
【０１１８】
結果利用部115で行う検証の別例としては、プログラムCあるいはDの事前条件および事後条件と、プログラムCあるいはDの元々の(自然言語で記述された)仕様との間に乖離がないかどうかを、人間のユーザーが確認・判断することが挙げられる。そして、乖離があると判断された場合には、仕様とプログラムの少なくとも一方には問題があるため、仕様とプログラムの一方ないしは両方を修正することになる。
【０１１９】
一般に、プログラムが手順を記述したものであるのに対して、仕様は成り立つべき性質を記述したものであり、両者の書かれ方は全く異なっているためプログラムと仕様との間に乖離があるかは判断しにくい。しかし、上記方法によると事前条件および事後条件といったより宣言的な条件記述を、仕様と比較することで、乖離が存在するかをより容易に判断できる。
【０１２０】
図6は、図1に示した事前条件生成装置の変形例を示すブロック図である。  
図1の命題論理式変換部、SATソルバ、論理式復元部が、SMT（SAT Modulo Theories）ソルバ131に置き換わっている。SMTソルバ131以外の要素は図1と同様であるため詳細な説明を省略する。
【０１２１】
まずSMTソルバとはどのようなものかについて説明する。  
SMTソルバは、命題論理式よりも、より複雑な条件を簡易に記述できる理論体系での充足可能性問題を解くようなSMT問題（SAT Modulo Theories problem）を解くソルバであり、SATソルバの進展に合わせて発展している。SMTソルバは、一階論理で記述される公理群（セオリー）によって解釈できる論理式をそのまま入力としてその論理式を真にする解を求める。多くのSMTソルバは、入力された論理式を内部で命題論理式に変換し、SATソルバによって命題論理式が充足可能かどうかを確かめる。そして非特許文献4（Alessandro Cimatti, Alberto Griggio, Roberto Sebastiani: A Simple and Flexible Way of Computing Small Unsatisfiable cores in SAT Modulo Theories. SAT 2007:334-339）では、SATソルバでなくSMTソルバで充足不能コアを求める方法が提案されている。
【０１２２】
図6のSMTソルバ131も、一階論理で記述される公理群（セオリー）によって解釈できる論理式を入力とする。具体的には論理式作成部105で作成された論理式Fを入力とする。そして、入力された論理式を真にする充足可能問題を解き、当該論理式を真にする解を求め、そのような解が存在しないときは、充足不能コアを得る。
【０１２３】
尚、記号実行部104が出力するようなブーリアン式（論理式）を解釈するSMTソルバの例としてMathSAT(http://mathsat.itc.it/)がある。このMathSATに、非特許文献4に記載の手法を適用して充足不能コアを出力させるようにする例が非特許文献3の著者らによる資料（http://sat07.ecs.soton.ac.uk/slides/griggio-sat07-talk.pdf）に紹介されている。
【０１２４】
以上、本実施形態によれば、SATソルバまたはSMTソルバの機能を利用しつつ、緩和項集合および処理済み緩和項集合を用いた処理を導入することで、当該プログラムの事前条件を効率よく取得することが可能となる。例えば、同じ計算結果（部分候補集合）が重複して計算されることを避けつつ、部分候補集合を、図2のステップS12の処理を1回実行するごとに1つずつ列挙することが可能となる。また、本実施形態のアルゴリズムは、SATソルバ自身の計算量を除けばO(n2)のオーダであり、本来ならば2n個の組合せがある解のうち、必要な高々n個の組合せだけを求めるだけでよく計算量が少なくてすむ。
【０１２５】
また本実施形態によれば、プログラムCに対して取得した事前条件およびあらかじめ与えられた事後条件を用いて、プログラムCを含む別のプログラムDの検証を効率的に行うことが可能となる。
【０１２６】
なお図1または図6の事前条件生成装置の各要素104〜109、110，111、131、132は、各要素の処理を行う指示を記述したプログラムをCPU等のコンピュータに実行させることにより実現してもよい。このとき、図1または図6の事前条件生成装置は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、ハードディスク、メモリ装置、光ディスク等の記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。また各記憶部101〜103、110、112、113はメモリ装置、ハードディスク、CD-R, CD-RW, DVD-RAM, DVD-Rといった記憶媒体を用いて適宜実現することができる。この記憶媒体は上記コンピュータ装置の内部に組み込まれてもよいし、当該コンピュータ装置に外付けされてもよい。
【符号の説明】
【０１２７】
100：充足不能コア計算部
101：プログラム記憶部
102：事後条件記憶部（第2の記憶部）
103：候補論理式集合記憶部（第1の記憶部）
104：記号実行部
105：論理式作成部
106：命題論理式変換部
107：SATソルバ
108：論理式復元部
109：緩和項削除部
110：緩和項記憶部（第4の記憶部）
111：項選択部
112：変数対応記憶部
113：処理済み緩和項記憶部（第4の記憶部）
114：結果記憶部（第3の記憶部）
115：結果利用部
121：プログラム検査部
122：親プログラム記憶部（第5の記憶部）
123：親プログラム仕様記憶部（第6の記憶部）
131：SMTソルバ
132：充足不能コア計算部
【図１】
0005468615.tif 000002
【図２】
0005468615.tif 000003
【図３】
0005468615.tif 000004
【図４】
0005468615.tif 000005
【図５】
0005468615.tif 000006
【図６】
0005468615.tif 000007
【図７】
0005468615.tif 000008
【図８】
0005468615.tif 000009
【図９】
0005468615.tif 000010