(57)【要約】【課題】本発明の実施形態は、検査対象のプログラムを２つのプログラムに変換し、変換した２つのプログラムに基づき、検査対象のプログラムの事前条件を推定する。【解決手段】本発明の実施形態としてのプログラム仕様推定装置は、第１変換プログラムと、第２変換プログラムとを生成するプログラム変換部と、プログラムの事後条件および第１変換プログラムに基づき、第１変換プログラムの事前条件に関する情報である第１事前条件情報を生成し、事後条件および第２変換プログラムに基づき、第２変換プログラムの事前条件に関する情報である第２事前条件情報を生成する事前条件情報生成部と、第１事前条件情報と第２事前条件情報との差分の有無について第１判定を行う差分判定部と、前記第１判定の結果が差分なしの場合は、前記第１事前条件情報または前記第２事前条件情報に基づき、前記プログラムの事前条件を推定する事前条件推定部を備える。【選択図】図１
2017041085.tif 000002
【特許請求の範囲】
【請求項１】
与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第１変換プログラムと、
前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された場合は、前記実行条件が満たされないとみなす前記第２変換プログラムと
を生成するプログラム変換部と、
前記プログラムの事後条件および前記第１変換プログラムに基づき、前記第１変換プログラムの事前条件に関する情報である第１事前条件情報を生成し、
前記事後条件および前記第２変換プログラムに基づき、前記第２変換プログラムの事前条件に関する情報である第２事前条件情報を生成する
事前条件情報生成部と、
前記第１事前条件情報と前記第２事前条件情報との差分の有無について第１判定を行う
差分判定部と、
前記第１判定の結果が差分なしの場合は、前記第１事前条件情報または前記第２事前条件情報に基づき、前記プログラムの事前条件を推定する
事前条件推定部と、
を備えるプログラム仕様推定装置。
【請求項２】
前記第１判定結果が差分ありの場合において、予め与えられた終了条件を満たさないときは、前記指定数を１つ増加させる変換条件設定部
をさらに備え、
前記プログラム変換部は、増加された前記指定数に応じた新たな第１および第２変換プログラムを生成し、
前記事前条件情報生成部、前記差分判定部および前記事前条件推定部は、再度処理を行う
請求項１に記載のプログラム仕様推定装置。
【請求項３】
前記プログラム仕様推定装置は、前記第１判定結果が差分ありの場合において、前記終了条件を満たすときは、前記第１事前条件情報および前記第２事前条件情報それぞれに基づき、前記プログラムの事前条件を２つ推定する
請求項２に記載のプログラム仕様推定装置。
【請求項４】
前記事前条件情報生成部は、
前記第１変換プログラムまたは前記第２変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
前記述語群と、前記第１変換プログラムの実行と、前記事後条件の否定の論理積から成る第１論理式に基づき、前記第１論理式の極小訂正集合から成る第１訂正集合群と、前記述語群と、前記第２変換プログラムの実行と、前記事後条件の否定の論理積から成る第２論理式に基づき、前記第２論理式の極小訂正集合から成る第２訂正集合群と、を生成し、
前記第１訂正集合群を前記第１事前条件情報と、前記第２訂正集合群を前記第２事前条件情報とする
請求項１ないし３のいずれか一項に記載のプログラム仕様推定装置。
【請求項５】
前記事前条件情報生成部は、
前記第１変換プログラムまたは前記第２変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
前記述語群と、前記第１変換プログラムの実行と、前記事後条件の否定の論理積から成る第１論理式に基づき、前記第１論理式の極小訂正集合から成る第１訂正集合群と、前記述語群と、前記第２変換プログラムの実行と、前記事後条件の否定の論理積から成る第２論理式に基づき、前記第２論理式の極小訂正集合から成る第２訂正集合群と、を生成し、前記第１訂正集合群および前記第２訂正集合群それぞれに基づき、前記第１論理式の極小矛盾核である第１矛盾核群および前記第２論理式の極小矛盾核である第２矛盾核群を生成し、
前記第１矛盾核群を前記第１事前条件情報と、前記第２矛盾核群を前記第２事前条件情報とする
請求項１ないし３のいずれか一項に記載のプログラム仕様推定装置。
【請求項６】
前記プログラム変換部は、
前記新たな第１および第２変換プログラムを生成する代わりに、
前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たすとみなして、前記増加された前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第３変換プログラムと、
前記実行条件を満たすとみなして、前記増加された前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第４変換プログラムとを生成し、
前記事前条件情報生成部は、
前記プログラムの事後条件および前記第３変換プログラムに基づき、前記第３変換プログラムの事前条件に関する情報である第３事前条件情報を生成し、
前記事後条件および前記第４変換プログラムに基づき、前記第４変換プログラムの事前条件に関する情報である第４事前条件情報を生成し、
前記差分判定部は、
前記第１判定を既に一度行った後は、前記第１判定の代わりに、前記第３事前条件情報と前記第４事前条件情報との差分の有無について第２判定を行い、
さらに前記事前条件情報生成部は、前記第２判定の結果が差分なしの場合および前記第２判定の結果が差分ありであって前記終了条件を満たさない場合は、前記第２事前条件情報と前記第３事前条件情報に基づく新たな前記第１事前条件情報、または前記第２事前条件情報と前記第４事前条件情報に基づく新たな前記第２事前条件情報を、生成し、
前記第２判定の結果が差分ありであって前記終了条件を満たす場合は、前記新たな第１事前条件情報および前記新たな第２事前条件情報を生成する
請求項２または３に記載のプログラム仕様推定装置。
【請求項７】
前記事前条件情報生成部は、
前記第１変換プログラムまたは前記第２変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
前記述語群と、前記第１変換プログラムの実行と、前記事後条件の否定の論理積から成る第１論理式に基づき、前記第１論理式の極小訂正集合から成る第１訂正集合群と、前記述語群と、前記第２変換プログラムの実行と、前記事後条件の否定の論理積から成る第２論理式に基づき、前記第２論理式の極小訂正集合から成る第２訂正集合群と、を生成し、前記述語群と、前記第３変換プログラムの実行と、前記事後条件の否定の論理積から成る第３論理式に基づき、前記第３論理式の極小訂正集合から成る第３訂正集合群と、前記述語群と、前記第４変換プログラムの実行と、前記事後条件の否定の論理積から成る第４論理式に基づき、前記第４論理式の極小訂正集合から成る第４訂正集合群と、を生成し、
前記第１訂正集合群を前記第１事前条件情報と、前記第２訂正集合群を前記第２事前条件情報と、前記第３訂正集合群を前記第３事前条件情報と、前記第４訂正集合群を前記第４事前条件情報とする
請求項６に記載のプログラム仕様推定装置。
【請求項８】
与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第１変換プログラムと、
前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第２変換プログラムと
を生成するプログラム変換ステップと、
前記プログラムの事後条件および前記第１変換プログラムに基づき、前記第１変換プログラムの事前条件に関する情報である第１事前条件情報を生成し、
前記事後条件および前記第２変換プログラムに基づき、前記第２変換プログラムの事前条件に関する情報である第２事前条件情報を生成する
事前条件情報生成ステップと、
前記第１事前条件情報と前記第２事前条件情報との差分の有無について第１判定を行う
第１判定ステップと、
前記第１判定の結果が差分なしの場合は、前記第１事前条件情報または前記第２事前条件情報に基づき、前記プログラムの事前条件を推定する
事前条件推定ステップと、
をコンピュータが実行する推定方法。
【請求項９】
与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第１変換プログラムと、
前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第２変換プログラムと
を生成するプログラム変換ステップと、
前記プログラムの事後条件および前記第１変換プログラムに基づき、前記第１変換プログラムの事前条件に関する情報である第１事前条件情報を生成し、
前記事後条件および前記第２変換プログラムに基づき、前記第２変換プログラムの事前条件に関する情報である第２事前条件情報を生成する
事前条件情報生成ステップと、
前記第１事前条件情報と前記第２事前条件情報との差分の有無について第１判定を行う
第１判定ステップと、
前記第１判定の結果が差分なしの場合は、前記第１事前条件情報または前記第２事前条件情報に基づき、前記プログラムの事前条件を推定する
事前条件推定ステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム仕様推定装置、推定方法、および推定プログラムに関する。
【背景技術】
【０００２】
手続き型プログラミング言語で記述されたプログラムの仕様または性質を表す基本的な方法として、事前条件と事後条件を表す方法がある。事前条件とは、プログラムの実行前に成り立つべき条件であり、プログラムが正常動作するための前提条件のことである。事後条件とは、プログラムの実行後に成り立つべき条件であり、プログラムが正常動作した際に保証される条件のことである。事前条件と事後条件を表すことで、プログラムの動作の正しさを認識することができる。特に、事前条件を正確に記述することは、組み合わせテストやレビューなど、プログラムの検査を行う際に有効である。
【０００３】
事前条件を人為的に求めずに、プログラムと事後条件に基づき推定する手法が知られている。推定手法を用いることで、煩雑な作業を避け、人為的間違いを防ぐことができる。推定手法には、例えば、極小矛盾核（ＭＵＣ：Ｍｉｎｉｍａｌ  ｕｎｓａｔｉｓｆｉａｂｌｅ  ｃｏｒｅ）を求める手法などがある。
【０００４】
推定手法には、探索範囲を限定し、限定された探索範囲に事後条件を満たさない反例がないかどうかを調べる手法がある。このような推定手法では、プログラム中にｗｈｉｌｅ文などのループがある場合、当該ループを所定の回数だけｉｆ文に展開する。ループを所定の回数以内に制限することにより、探索範囲が限定される。しかし、可変回実行され得るループは、有限長とは限らない。したがって、ループを含む元のプログラムと、ループ展開後のプログラムとは、厳密には挙動が異なり、推定される事前条件が近似的な解となり、正確ではない可能性がある。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１４−１６０４３５号公報
【特許文献２】特開２０１３−６５２５８号公報
【非特許文献】
【０００６】
【非特許文献１】Ｓａｋａｉ，  Ｍａｒｕｃｈｉ，  ａｎｄ  Ｉｍａｉ，  Ｍｏｄｅｌ−Ｃｈｅｃｋｉｎｇ  Ｃ  Ｐｒｏｇｒａｍｓ  ａｇａｉｎｓｔ  ＪＭＬ−ｌｉｋｅ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｌａｎｇｕａｇｅ．  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  １９ｔｈ  Ａｓｉａ−Ｐａｃｉｆｉｃ  Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ  Ｃｏｎｆｅｒｅｎｃｅ  （ＡＰＳＥＣ  ２０１２），  Ｐａｇｅｓ  １７４−１８３
【非特許文献２】「Ｍｉｎｉｍａｌ  Ｕｎｓａｔｉｓｆｉａｂｌｅ  Ｃｏｒｅ列挙によるプログラムの準最弱な事前条件推定」（東芝）、ソフトウェア工学の基礎ＸＶＩＩＩ、レクチャーノート／ソフトウェア工学、株式会社近代科学社、Ｖｏｌ．３７、２０１１、ｐｐ．１８７−１９６
【非特許文献３】“Ａｌｇｏｒｉｔｈｍｓ  ｆｏｒ  Ｃｏｍｐｕｔｉｎｇ  Ｍｉｎｉｍａｌ  Ｕｎｓａｔｉｓｆｉａｂｌｅ  Ｓｕｂｓｅｔｓ  ｏｆ  Ｃｏｎｓｔｒａｉｎｔｓ”，  Ｊｏｕｒｎａｌ  ｏｆ  Ａｕｔｏｍａｔｅｄ  Ｒｅａｓｏｎｉｎｇ，  Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ  Ｎｅｗ  Ｙｏｒｋ，  Ｉｎｃ．  Ｖｏｌ．４０，  ２００８，  ｐｐ．１−３３
【非特許文献４】『高速なＭＣＳ列挙を利用した準最弱事前条件推定の改良』、  ソフトウェア工学の基礎ＸＸＩ、  レクチャーノート／ソフトウェア工学、  近代科学社、  Ｖｏｌ．４０、  ２０１４
【非特許文献５】Ｋｉｎｇ，  Ｓｙｍｂｏｌｉｃ  ｅｘｅｃｕｔｉｏｎ  ａｎｄ  ｐｒｏｇｒａｍ  ｔｅｓｔｉｎｇ，  Ｃｏｍｍｕｎｉｃａｔｉｏｎｓ  ｏｆ  ｔｈｅ  ＡＣＭ，  Ｖｏｌｕｍｅ１９  Ｉｓｓｕｅ  ７，  Ｊｕｌｙ  １９７６，  Ｐａｇｅｓ  ３８５−３９４）
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の実施形態は、検査対象のプログラムを２つのプログラムに変換し、変換した２つのプログラムに基づき、検査対象のプログラムの事前条件を推定する。
【課題を解決するための手段】
【０００８】
本発明の実施形態としてのプログラム仕様推定装置は、第１変換プログラムと、第２変換プログラムとを生成するプログラム変換部と、プログラムの事後条件および第１変換プログラムに基づき、第１変換プログラムの事前条件に関する情報である第１事前条件情報を生成し、事後条件および第２変換プログラムに基づき、第２変換プログラムの事前条件に関する情報である第２事前条件情報を生成する事前条件情報生成部と、第１事前条件情報と第２事前条件情報との差分の有無について第１判定を行う差分判定部と、前記第１判定の結果が差分なしの場合は、前記第１事前条件情報または前記第２事前条件情報に基づき、前記プログラムの事前条件を推定する事前条件推定部を備える。
【図面の簡単な説明】
【０００９】
【図１】第１の実施形態に係る推定装置の概略構成の一例を示すブロック図。
【図２】事前条件情報生成部の内部構成の一例を示すブロック図。
【図３】事前条件推定部の内部構成の一例を示すブロック図。
【図４】事後条件の一例を示す図。
【図５】ループ処理を含んだプログラムの一例を示す図。
【図６】一重化処理の一例を示す図。
【図７】展開処理を説明するための図。
【図８】悲観的プログラムと楽観的プログラムの一例を示す図。
【図９】生成された述語の一例を示す図。
【図１０】悲観的訂正集合群および後述する楽観的訂正集合群の一例を示す図。
【図１１】矛盾核群と事前条件の一例を示す図。
【図１２】推定装置の概略処理のフローチャート。
【図１３】悲観的プログラム変換部の変換処理のフローチャートを示す図。
【図１４】楽観的プログラム変換部の変換処理のフローチャートを示す図。
【図１５】事前条件情報生成部の生成処理のフローチャートを示す図。
【図１６】事前条件推定部の生成処理のフローチャートを示す図。
【図１７】楽観的差分プログラムの一例を示す図。
【図１８】合成を説明するための図。
【図１９】悲観的差分プログラムの一例を示す図
【図２０】悲観的差分訂正集合群による合成を説明するための図
【図２１】再帰関数を含むプログラムに対するプログラム変換を説明する図。
【図２２】再帰関数を含むプログラムに基づく悲観的プログラムと楽観的プログラムの一例を示す図。
【図２３】本発明の一実施形態に係るハードウェア構成の一例を示すブロック図。
【発明を実施するための形態】
【００１０】
以下に、本明細書で用いる論理学上の記号を示す。
∧：連言（論理積、ＡＮＤ）
∨：選言（論理和、ＯＲ）
¬：否定（ＮＯＴ）
⇒：含意（「ならば」）
⊥：矛盾
∀：全称量化子（「任意の」「すべての」）
【００１１】
更に、本明細書で用いる集合論の記号を以下に示す。
∈：元として含まれる
⊆：部分集合
＼：差集合
【００１２】
また、本明細書で使用する用語の定義を示す。
【００１３】
［矛盾核］（ｕｎｓａｔｉｓｆｉａｂｌｅ  ｃｏｒｅ、あるいはｕｎｓａｔｉｓｆｉａｂｌｅ  ｓｕｂｓｅｔ）
論理式の集合に対し、その要素全ての連言（論理積）が充足不能である（集合が不整合である）とき、その部分集合で、連言がやはり充足不能なものを意味する。言い換えると、論理式の集合Ｐに対し∧Ｐ＝⊥であるとき、Ｐ’⊆Ｐでやはり∧Ｐ’＝⊥となるものを意味する。
【００１４】
［極小矛盾核］（ｍｉｎｉｍａｌ  ｕｎｓａｔｉｓｆｉａｂｌｅ  ｃｏｒｅ、あるいはｍｉｎｉｍａｌ  ｕｎｓａｔｉｓｆｉａｂｌｅ  ｓｕｂｓｅｔ）
矛盾核のうち極小なものを意味する。すなわち、すべての真部分集合が充足可能な矛盾核を意味する。言い換えると、論理式の集合Ｐ対する矛盾核Ｐ’で、∀ｐ∈Ｐ’．∧（Ｐ’＼ｐ）≠⊥であるもの。本明細書においては、特に言及がない限り、「矛盾核」は「極小矛盾核」を指すものとする。
【００１５】
［訂正集合］（ｃｏｒｒｅｃｔｉｏｎ  ｓｕｂｓｅｔ）
論理式の集合に対し、その要素全ての連言が充足不能であるとき、その部分集合で、元の集合から、訂正集合を取り除くと、連言が充足可能になるものを意味する。言い換えると、論理式の集合Ｐに対し∧Ｐ＝⊥であるとき、Ｐ’⊆Ｐで∧（Ｐ＼Ｐ’）≠⊥となるものを意味する。
【００１６】
［極小訂正集合］（ｍｉｎｉｍａｌ  ｃｏｒｒｅｃｔｉｏｎ  ｓｕｂｓｅｔ）
訂正集合のうち極小なものを意味する。すなわち、いかなる真部分集合を元の訂正集合から取り除いても充足可能にならないものを意味する。言い換えると、論理式の不整合な集合Ｐの訂正集合Ｐ’のうち、∀ｐ∈Ｐ’．∧（Ｐ＼（Ｐ’＼ｐ））＝⊥であるものを意味する。本明細書においては、特に言及がない限り、「訂正集合」は「極小訂正集合」を指す。
【００１７】
［事前条件・事後条件］
プログラムの仕様の１形態を表す。事前条件は、プログラムが正常動作するための前提条件である。事後条件は、プログラムが正常動作した際に保証される条件を示す。論理学的には、あるプログラムの事前条件をＰ、事後条件をＱ、そのプログラムが動作したことを表す記号をＳとすると、これらの関係は、Ｐ∧Ｓ⇒Ｑで表される。
【００１８】
以下、図面を参照しながら、本発明の一実施形態について説明する。
【００１９】
（第１の実施形態）
図１は、第１の実施形態に係る推定装置の概略構成の一例を示すブロック図である。第１の実施形態に係る推定装置は、入力部１、変換条件設定部２、プログラム変換部３、事前条件導出部４、差分判定部５、変換条件記憶部６、出力部７を備える。プログラム変換部３は、悲観的プログラム変換部３１と、悲観的プログラム記憶部３２と、楽観的プログラム変換部３３と、楽観的プログラム記憶部３４を有する。事前条件導出部４は、事前条件情報生成部４１と、事前条件推定部４２を備える。
【００２０】
本発明の一実施形態に係る推定装置は、検査対象のプログラムのソースコードおよび事後条件に基づき、当該プログラムの事前条件を推定する。プログラムと事後条件に基づき、事前条件を推定することを、事前条件推定と称する。事前条件推定は、プログラムを直接実行せずに（静的に）、検査対象のプログラムが検査性質を満たすかを検査するソフトウェアモデル検査等で用いられる。
【００２１】
図２は、事前条件情報生成部４１の内部構成の一例を示すブロック図である。事前条件情報生成部４１は、述語生成部４１１と、述語記憶部４１２と、悲観的論理式変換部４１３と、悲観的訂正集合列挙部４１４と、悲観的訂正集合記憶部４１５と、楽観的論理式変換部４１６と、楽観的訂正集合列挙部４１７と、楽観的訂正集合記憶部４１８とを備える。
【００２２】
図３は、事前条件推定部４２の内部構成の一例を示すブロック図である。事前条件推定部４２は、悲観的矛盾核導出部４２１と、悲観的矛盾核記憶部４２２と、楽観的矛盾核導出部４２３と、楽観的矛盾核記憶部４２４と、推定部４２５とを備える。
【００２３】
以下、各部について説明する。
【００２４】
入力部１は、検査対象のプログラムと、当該プログラムの事後条件と、終了条件とを取得する。入力部１は、これらの情報を、ユーザから取得してもよいし、図示しない他のシステムから取得してもよい。
【００２５】
検査対象のプログラムは、悲観的プログラム変換部３１および楽観的プログラム変換部３３に送られ、後述するプログラム変換処理に基づき、変換される。取得するプログラムは、プログラムのソースコードを想定しているが、プログラム自体でもよい。その場合は、逆コンパイル等を行うことにより、プログラムからソースコードを読み取ればよい。取得するプログラムの記述言語は、Ｃ言語、Ｐｙｔｈｏｎ、Ｐｅｒｌなど、任意の言語でよい。ここでは、Ｃ言語の用語を用いて説明するが、特に言語を制限するものではない。
【００２６】
事後条件は、事前条件導出部４に送られ、事前条件の算出に用いられる。図４は、事後条件の一例を示す図である。図４のテキストは、非特許文献１にて示される仕様記述言語ＣＦＳＬで記述されており、Ｃ言語向けソフトウェアモデル検査器ＣＦｏｒｇｅなどにより解釈可能である。図３の例では、１行目が関数名であるｇｃｄと、引数名であるｍとｎを表す。２行目は戻り値（＼ｒｅｓｕｌｔ）がｍの約数であることを、３行目は戻り値がｎの約数であることを表し、両者を合わせれば戻り値がｍとｎの公約数であることを表す。４行目が戻り値が０ではないことを表し、５行目が、戻り値が公約数の中では最大のものであることを表す。
【００２７】
終了条件は、変換条件設定部２に送られ、悲観的プログラム変換部３１および楽観的プログラム変換部３３にて行われるプログラム変換処理の終了を判断する条件の１つとなる。ここでは、終了条件を、プログラム変換部３にて行われる後述のプログラム展開処理におけるループの展開数の上限値とする。プログラム展開処理の詳細は後述する。
【００２８】
なお、入力部１と出力部７は、１つにまとめてもよい。
【００２９】
変換条件設定部２は、変換条件を設定し、終了条件とともに、変換条件記憶部６に格納する。変換条件とは、悲観的プログラム変換部３１および楽観的プログラム変換部３３が、後述するプログラム変換処理を行う際の条件を表す。悲観的プログラム変換部３１および楽観的プログラム変換部３３は、この変換条件に基づき、プログラム変換処理を実行するかを判断することができる。
【００３０】
変換条件は、予め定められていてもよいし、入力部１から取得してもよい。または、変換条件設定部２が、入力されたプログラムの種類や処理内容に基づき、複数の既定の変換条件の中から、変換条件を決定してもよい。また、変換条件の内容は任意でよく、用いられる変換条件は、１つでも複数でもよい。
【００３１】
本実施形態においては、変換条件をループの展開数とする。この場合、変換条件設定部２は、ループの展開数をカウントするカウンタとして機能する。
【００３２】
変換条件記憶部６は、変換条件設定部２から取得した変換条件および終了条件を格納する。なお、変換条件記憶部６は、変換条件設定部２に含まれていてもよい。
【００３３】
プログラム変換部３は、検査対象のプログラムから、検査対象のプログラムよりも厳しい条件で動作する悲観的プログラムを生成する。また、検査対象のプログラムから、検査対象のプログラムよりも緩い条件で動作する楽観的プログラムを生成する。悲観的プログラムおよび楽観的プログラムの詳細は後述する。
【００３４】
ここでは、プログラムを個別に変換することを想定し、悲観的プログラムに変換する悲観的プログラム変換部３１と、楽観的プログラムに変換する楽観的プログラム変換部３３を備えることとする。なお、悲観的プログラム変換部３１と楽観的プログラム変換部３３は１つにまとめてもよい。
【００３５】
悲観的プログラム変換部３１は、入力部１から取得したプログラムを、予め定められた形式に変換する。変換処理の１つは、プログラムに含まれるループ処理を、ループなしの処理にするものである。ここでは、ループ処理をループなしの処理にすることを展開と称する。
【００３６】
ソフトウェアモデル検査において、モデル検査の探索範囲を限定し、限定された探索範囲において、正常でないプログラムの挙動を示す解（反例）があるかを調べるモデル検査法は有界モデル検査と称される。本実施形態も、ループを指定回数だけ展開し、限定された範囲において、事前条件を探索する。
【００３７】
プログラムのループは、ｆｏｒ文、ｇｏｔｏ文、関数の再帰呼び出しなど、様々な方法により記述されるが、記述方法を変換することにより、全てｗｈｉｌｅ文で表すことが可能である。よって、ここでは、入力されるプログラムのループは、ｗｈｉｌｅ文で記述されているものと想定するが、非特許文献２などに記載された公知の手法により、ｆｏｒ文などのループをｗｈｉｌｅ文に変換する処理を予め行うとしてもよい。
【００３８】
ｗｈｉｌｅ文は、ループ条件ｂと、本文Ｓから構成される。図５は、ループ処理を含んだプログラムの一例を示す図である。このプログラムは、引数ｍとｎの最大公約数をユークリッドの互助法に基づき求めるために、Ｃ言語で記述されたプログラムである。当該プログラムの８行目から１２行目がｗｈｉｌｅ文に相当する。８行目の「ｄ！＝０」がループ条件ｂに相当し、９から１１行目が、本文Ｓに相当する。このｗｈｉｌｅ文では、ｄが０となるまで、本文Ｓの処理が繰り返されることを示している。なお、便宜上、行番号を付記しているが、本来は不要である。
【００３９】
悲観的プログラム変換部３１は、与えられたプログラムにおけるｗｈｉｌｅ文の有無を判別する。ｗｈｉｌｅ文が変換対象のプログラムに有る場合は、当該ループが多重ループ（ネスト構造）か否かを判別する。多重ループの場合は、当該ループの一重化処理を行う。
【００４０】
図６は、一重化処理の一例を示す図である。図６（Ａ）は２重ループを含んだプログラムの一例を示す。この例では、条件ｂ１を満たす限り、本文Ｓ１と、条件ｂ２を満たす限り本文Ｓ２を繰り返し実行するループ処理とが、繰り返し実行される２重のループとなっている。図６（Ｂ）は、変数ｖｐｃと１つのｗｈｉｌｅ文を用いて、図６（Ａ）を一重化する一例を示す。変数ｖｐｃは、複数あるループを番号付けし、実行中のループの番号を判別するために用いられる。ここでは、本文Ｓ１を実行するループをｖｐｃ＝１、本文Ｓ２を実行するループをｖｐｃ＝２としている。例えば、ｖｐｃの初期値を１とすると、ｓｗｉｔｃｈ処理にてｃａｓｅ１が実行され、条件ｂ１が真ならば、本文Ｓ１の処理とｖｐｃ＝２の代入が行われる。ｖｐｃが２となったため、次のｓｗｉｔｃｈ処理ではｃａｓｅ２が行われ、条件ｂ２が偽となるまで、本文Ｓ２の処理が実行されることとなる。条件ｂ２が偽となれば、ｖｐｃが１となり、ｃａｓｅ１に戻る。このように、多重ループの処理を１つのｗｈｉｌｅ文にて表すことができる。
【００４１】
また、悲観的プログラム変換部３１は、一重化したループを展開する展開処理を行う。展開処理は、ｗｈｉｌｅ文の本文Ｓを、１つ以上のｉｆ文の中に記載することにより、ｉｆ文による複数回の処理に分けることをいう。
【００４２】
図７は、展開処理を説明するための図である。図７（Ａ）は、図５に示したプログラムであり、悲観的プログラム変換部３１に入力されたプログラムを示す。図７（Ｂ）は、悲観的プログラム変換部３１により、ループが１回展開された場合のプログラムの一例を示す。この例では、ｗｈｉｌｅ文の前にｉｆ文を作成し、ｉｆ文の中に本文とｗｈｉｌｅ文を記載する。
【００４３】
悲観的プログラム変換部３１は、変換条件記憶部６に格納された変換条件に基づき、ループを展開する。本実施形態では、変換条件はループの展開数のため、変換条件に示された展開数になるまで展開処理が行われる。
【００４４】
変換条件に示された展開数までループが展開されたとき、悲観的プログラム変換部３１は、ｗｈｉｌｅ文をａｓｓｅｒｔ文（ａｓｓｅｒｔ関数により記述される文）に置換する。置換の際に、ａｓｓｅｒｔ関数に与える引数は、「ループ処理の条件の否定」とする。ａｓｓｅｒｔ関数は、引数が条件を満たさない場合に、エラーを発生させプログラムを停止させる関数である。ゆえに、置換されたプログラムは、「ループ処理の条件の否定」を満たさない場合、つまり、ループ処理の条件を満たす場合は、エラーとなる。これは、変換前のプログラムにおいてループ処理が指定された展開数以上続く場合、変換後のプログラムは必ずエラーとなることを意味する。したがって、展開前のプログラムよりも展開後のプログラムのほうが、正常稼働する条件が厳しいことを意味する。言い換えれば、展開前のプログラムに対して展開後のプログラムは正常でないプログラムの挙動に関する過大近似（ｏｖｅｒａｐｐｒｏｘｉｍａｔｉｏｎ）となっている。このａｓｓｅｒｔ文は、ソフトウェアモデル検査においてｕｎｗｉｎｄｉｎｇ  ａｓｓｅｒｔｉｏｎと称される。また、このようなプログラムを悲観的プログラムと称する。
【００４５】
図７（Ｃ）は、展開後の悲観的プログラムの一例を示す。図７（Ｃ）では、ｗｈｉｌｅ文を１回展開し、ｉｆ文が１つ生成されている。そして、図７（Ｂ）で示されたｗｈｉｌｅ文の代わりに、ａｓｓｅｒｔ文が挿入されている。したがって、この悲観的プログラムは、ループと同一の条件（ｄ！＝０）を満たす限り、展開数だけループ処理と同一の処理が実行される。そして、最後のａｓｓｅｒｔ文による処理により、ループ処理の条件（ｄ！＝０）を満たす場合は、このプログラムはエラー（異常）となることを意味する。
【００４６】
悲観的プログラム変換部３１は、上記のようにして、取得したプログラムを悲観的プログラムに変換する。つまり、悲観的プログラム変換部３１で生成されるプログラムは、ソフトウェアモデル検査にかければ、ループが所定の回数以上実行される場合はすべて検査性質に違反する反例とみなす、という意味を持つ。このことを、ここでは「悲観的」（ｐｅｓｓｉｍｉｓｔｉｃ）と称する。
【００４７】
なお、図７であげたソースコードは一例であり、想定する処理が行われば、記述内容は異なっていてもよい。例えば、ａｓｓｅｒｔ文の記述位置は、図７（Ｃ）ｉｆ文の本文中に記載されているが、ｉｆ文の本文の後、「ｒｅｔｕｒｎ  ｎ；」の前に記述されていても構わない。
【００４８】
悲観的プログラム記憶部３２は、悲観的プログラム変換部３１が算出した悲観的プログラムを格納する。悲観的プログラムは、事前条件導出部４により、参照される。また、悲観的プログラム変換部３１が取得した検査対象のプログラムも格納してもよい。
【００４９】
楽観的プログラム変換部３３は、入力部１から取得したプログラムを、予め定められた形式に変換する。ただし、楽観的プログラム変換部３３は、悲観的プログラム変換部３１とは異なる発想で、悲観的プログラムとは異なる形式にプログラムを変換する。
【００５０】
楽観的プログラム変換部３３が行う処理は、ループ展開の最後の処理が、悲観的プログラム変換部３１と異なる。悲観的プログラム変換部３１は、ｗｈｉｌｅ文をａｓｓｅｒｔ文に置換したが、楽観的プログラム変換部３３は、ａｓｓｅｒｔ文の代わりに、ａｓｓｕｍｅ文を記述する。ここでは、このａｓｓｕｍｅ文を、ｕｎｗｉｎｄｉｎｇ  ａｓｓｕｍｐｔｉｏｎと称する。
【００５１】
図８は、悲観的プログラムと楽観的プログラムの一例を示す図である。図８（Ａ）は元のプログラム、図８（Ｂ）は悲観的プログラム、図８（Ｃ）は楽観的プログラムである。ループの展開数は、両プログラムとも2回で同数であり、ａｓｓｅｒｔ文とａｓｓｕｍｅ文の記述だけが異なる。
【００５２】
ａｓｓｕｍｅ関数は、与えられた引数を正しいとみなす。図８（Ｃ）では、ａｓｓｕｍｅ関数の引数は、「！（ｄ！＝０）」であるので、ループ条件（ｄ！＝０）の否定が正しいとみなされる、つまり、ａｓｓｕｍｅ文以降、ループ条件が満たされないとみなされる。これは、変換前のプログラムにおいてループ処理が指定された展開数以上続く場合でも、変換後のプログラムは必ず指定された展開数までしかループ処理が続かないことを意味する。したがって、この楽観的プログラムは、ループ展開数を超えても、ループ条件を満たしてしまう場合は動作しなかったものとして処理する。ゆえに、展開前よりも展開後のほうが、正常稼働する条件が緩いことを意味する。言い換えれば、展開前のプログラムに対して展開後のプログラムは正常でないプログラムの挙動に関する過小近似（ｕｎｄｅｒａｐｐｒｏｘｉｍａｔｉｏｎ）となっている。このようなプログラムを楽観的プログラムと称する。
【００５３】
楽観的プログラム変換部３３は、上記のようにして、取得したプログラムを楽観的プログラムに変換する。つまり、楽観的プログラム変換部３３で生成されるプログラムは、ソフトウェアモデル検査において、常にループが所定の回数以下しか実行されない、という意味を持つ。このことを、ここでは「楽観的」（ｏｐｔｉｍｉｓｔｉｃ）と称する。
【００５４】
なお、図８であげたソースコードは一例であり、想定する処理が行われば、記述内容は異なっていてもよい。例えば、ａｓｓｕｍｅ文の記述位置も、ａｓｓｅｒｔ文の記述位置同様に、ｉｆ文の本文の後、「ｒｅｔｕｒｎ  ｎ；」の前に記述されていても構わない。
【００５５】
なお、このａｓｓｕｍｅ関数の挿入は、プログラムを後述する論理式に変換するために行われるものである。そのため、楽観的プログラムは実際に動作しなくともよい。
【００５６】
なお、悲観的プログラム変換部３１または楽観的プログラム変換部３３は、先に生成された悲観的プログラムまたは楽観的プログラムに基づき、ａｓｓｅｒｔ文またはａｓｓｕｍｅ文を、ａｓｓｕｍｅ文またはａｓｓｅｒｔ文に置換することで、もう一方のプログラムを生成するとしてもよい。
【００５７】
楽観的プログラム記憶部３４は、楽観的プログラム変換部３３から取得した楽観的プログラムを格納する。楽観的プログラムは、事前条件導出部４により、参照される。また、楽観的プログラム変換部３４が取得した検査対象のプログラムも格納してもよい。
【００５８】
事前条件導出部４の事前条件情報生成部４１は、悲観的プログラムと、楽観的プログラムと、事後条件に基づき、検査対象のプログラムの事前条件情報を導出する。具体的には、悲観的プログラムの事前条件に関する情報（悲観的事前条件情報）と、楽観的プログラムの事前条件に関する情報（楽観的事前条件情報）を導出し、差分判定部５に送る。悲観的事前条件情報と楽観的事前条件情報に差分がない場合は、差分判定部５から差分がないとの判定結果を受け取る。事前条件導出部４の事前条件推定部４２は、悲観的事前条件情報、楽観的事前条件情報、またはその両方から、求めるべき事前条件を算出し、出力部７に出力する。算出方法などの詳細は後述する。
【００５９】
差分判定部５は、悲観的事前条件情報と楽観的事前条件情報との差分を判定する。差分が存在しないと判定した場合は、差分がないとの判定結果を事前条件導出部４に送る。差分が存在すると判定した場合は、変換条件記憶部６を参照し、変換条件（現在のループ展開数）が終了条件（ループ展開数の上限）以下であるかを判定する。変換条件が、終了条件以下の場合は、変換条件設定部２に対し、ループ展開数を１増やすように変換条件の変更を指示する。これにより、変換条件設定部２が変換条件を変更し、再度、悲観的プログラム変換部３１および楽観的プログラム変換部３３により、ループ展開数が前回よりも１つ多い悲観的プログラムおよび楽観的プログラムが生成される。そして、再度事前条件導出部４により、新たな悲観的事前条件情報および楽観的事前条件情報が生成される。この生成処理は、悲観的事前条件情報と楽観的事前条件情報との差分がなくなるまで、または変換条件が終了条件を超えるまで繰り返される。ゆえに、変換条件が終了条件を超えるまで、悲観的プログラムおよび楽観的プログラムのループ展開数が増加していくことになる。
【００６０】
なお、悲観的プログラム変換部３１および楽観的プログラム変換部３３が再び展開処理を開始する際の指示は、差分判定部５が行ってもよいし、変換条件設定部２が行ってもよい。または、悲観的プログラム変換部３１および楽観的プログラム変換部３３が、所定時間経過後に、変換条件記憶部６のデータにアクセスし、処理を行うかを判断してもよい。
【００６１】
事前条件導出部４の事前条件推定部４２は、差分判定部５の判定結果に従い、事前条件を算出する。差分がないとする判定結果の場合は、悲観的事前条件情報と楽観的事前条件情報のいずれかから事前条件を算出すればよい。差分があるとする判定結果、つまり差分が収束することなく終了条件を満たした場合は、悲観的事前条件情報と楽観的事前条件情報のそれぞれ両方から、事前条件を算出する。２つの事前条件を、出力部７を介して、ユーザに出力することで、ユーザの利便性を向上させる。算出方法などの詳細は、後述する。
【００６２】
出力部７は、事前条件導出部４が導出した結果を出力する。出力方法は、画面に表示してもよいし、ファイルなどに保存してもよい。
【００６３】
以下、事前条件情報生成部４１の内部構成について説明する。
【００６４】
本発明の実施形態では、プログラムの事前条件を算出する方法として、プログラム・事後条件・事前条件の構成要素となる述語を論理式で表現し、ＳＡＴ問題（充足可能性問題、ｓａｔｉｓｆｉａｂｉｌｉｔｙ  ｐｒｏｂｌｅｍ）に準ずる問題として、ＳＡＴソルバあるいはＳＭＴ（ＳＡＴ Ｍｏｄｕｌｏ Ｔｈｅｏｒｉｅｓ）ソルバなどの論理制約ソルバにて解く手法を用いる。ＳＡＴ問題とは、命題論理式の充足可能性を判定するものであり、命題変数を含む論理式を真にするような命題変数への値の割り当てが存在するかを判定する。
【００６５】
述語生成部４１１は、悲観的プログラムまたは楽観的プログラムに基づき、各事前条件情報の基となる述語群を生成し、述語記憶部４１２に格納する。図２では、述語生成部４１１は悲観的プログラムを取得しているが、楽観的プログラムを取得してもよい。
【００６６】
述語は、プログラムの引数やグローバル変数に対する制約を意味し、予め定められたパターンに基づき生成される。本実施例においては、「異なる引数同士の大小比較」と、「引数と０との大小比較」の２つのパターンが定めてあるとする。また、ここでの大小比較とは、「一方がもう一方より大きい」、「一方がもう一方より小さい」、「一方がもう一方と一致しない」の３つの比較を指すこととする。
【００６７】
例えば、図７で示した悲観的プログラムを例とする。当該悲観的プログラムは、ｍとｎの２つの引数を有するため、述語生成部４１１は、上記２つのパターンに従い、述語を生成する。図９は、生成された述語の一例を示す図である。生成された述語は、図９に示す通り、（ｍ≧ｎ）、（ｍ≦ｎ）、（ｍ！＝ｎ）、（ｍ≧０）、（ｍ≦０）、（ｍ！＝０）、（ｎ≧０）、（ｎ≦０）、（ｎ！＝０）の９つとなる。
【００６８】
なお、事前条件導出部４の処理は、前述のように、悲観的事前条件情報と楽観的事前条件情報の差分がなくなるまで、または変換条件が終了条件を超えるまで繰り返される。しかし、述語生成部４１１の処理は、変換条件に左右されないため、再度述語生成処理を行う場合には、述語記憶部４１２に格納した述語群を用いることとし、述語生成処理を省略してもよい。
【００６９】
悲観的論理式変換部４１３は、悲観的プログラムを論理式に変換する。ここでは、得られた論理式を悲観的論理式と称する。プログラムを論理式に変換する方法は、非特許文献５などに記載された公知技術である記号実行（ｓｙｍｂｏｌｉｃ  ｅｘｅｃｕｔｉｏｎ）などがある。
【００７０】
記号実行とは、プログラムの入力として記号値を用い、擬似的に実行する手法であり、プログラムの入力および実行前の状態と、プログラムの出力および実行後の状態の関係を表す論理式を算出する。なお、記号実行に基づき、Ｃ言語プログラムを論理式に変換する方法は、非特許文献１などに記載されている。
【００７１】
なお、記号実行は、無限ループが存在すると、論理式が無限となり、変換することができない。ゆえに、悲観的プログラム変換部３１および楽観的プログラム変換部３３にて、事前にプログラムからループを展開する必要がある。
【００７２】
悲観的訂正集合列挙部４１４は、悲観的論理式変換部４１３から取得した悲観的論理式と、入力部１から取得した事後条件の否定と、述語記憶部４１２に記憶された述語群との連言（論理積）からなる論理式を生成する。そして、当該論理式から、述語群および事後条件の否定に関する訂正集合群（ｍｉｎｉｍａｌ  ｃｏｒｒｅｃｔｉｏｎ  ｓｕｂｓｅｔｓ）を列挙する。ここでは、悲観的訂正集合列挙部４１４に列挙された訂正集合群を悲観的訂正集合群と称する。
【００７３】
本実施例において訂正集合は、全ての述語、プログラムの実行、および事後条件の否定の論理積から成る論理式において、当該論理式から取り除くと、当該論理式が充足可能となるような条件の集合を意味する。図１０は、悲観的訂正集合群および後述する楽観的訂正集合群の一例を示す図である。図１０（Ａ）が悲観的訂正集合群を表す。図１０（Ｂ）が楽観的訂正集合群を表す。１行ごとに［］で囲まれた番号の集合が１つの訂正集合である。番号の１〜９は、図９で示した、述語生成部４１１により生成された述語の番号に対応する。０は事後条件の否定を表す。例えば、図１０（Ａ）の記載された訂正集合［２，５，７］は、条件式２である（ｍ≦ｎ）と、条件式５である（ｍ≦０）、条件式７である（ｎ≧０）を外すと、論理式が充足可能になることを意味する。この場合、事後条件の否定０が取り除かれなくても充足可能である。すなわち、２，５および７を取り除くと事後条件を満たさない、異常となるプログラム実行結果があり得ることとなる。
【００７４】
一方、図１０（Ａ）に記載された訂正集合［２，５，８，０］では、条件式２、５、８および０を除くと、論理式が成り立つことを意味する。０を除くことは、事後条件が成り立つことを意味するため、条件式２、５、８を除いても、事後条件を満たさない異常な実行結果は存在しない。
【００７５】
なお、悲観的プログラムは、検査対象のプログラムよりも厳しい条件で動作するものであるため、悲観的プログラムにおける０を含む訂正集合の数は、検査対象のプログラムにおける０を含む訂正集合の数以下となる。一方、楽観的プログラムは、検査対象のプログラムよりも緩い条件で動作するため、楽観的プログラムにおける０を含む訂正集合の数は、検査対象のプログラムにおける０を含む訂正集合の数以上となる。また、悲観的訂正集合群と楽観的訂正集合群の数は一致する。
【００７６】
論理式から訂正集合群を求めるには、非特許文献２に記載の通り、ＳＡＴソルバやＳＭＴ（ＳＡＴ  Ｍｏｄｕｌｅ  Ｔｈｅｏｒｉｅｓ）ソルバなど、広く公知の論理制約ソルバを用いることができる。例えばＫｏｄＫｏｄ（ｈｔｔｐ：／／ａｌｌｏｙ．ｍｉｔ．ｅｄｕ／ｋｏｄｋｏｄ／）などを利用してもよい。算出された悲観的訂正集合群は、悲観的訂正集合記憶部４１５に格納される。なお、ここでは訂正集合群を、事前条件の中間解として用いる。これにより、事前条件を算出せずとも、差分判定を行うことができ、処理速度を早めることができる。
【００７７】
楽観的論理式変換部４１６は、楽観的プログラムを論理式に変換する。ここでは、得られた論理式を楽観的論理式と称する。楽観的プログラムを論理式に変換する方法は、悲観的論理式変換部４１３と同様である。そのため、楽観的論理式変換部４１６は、悲観的論理式変換部４１３と共通化してもよい。
【００７８】
楽観的訂正集合列挙部４１７は、悲観的訂正集合列挙部４１４同様に、前記楽観的論理式と、事後条件の否定と、述語群との連言からなる論理を生成し、述語群および事後条件の否定に関する訂正集合群を列挙する。ここでは、楽観的訂正集合列挙部４１７に列挙された訂正集合群を楽観的訂正集合群と称する。楽観的訂正集合群は、楽観的訂正集合記憶部４１８に格納される。
【００７９】
悲観的訂正集合群と楽観的訂正集合群は、悲観的事前条件情報と楽観的事前条件情報として、差分判定部５に送られる。図１０の例では、図１０（Ａ）の悲観的訂正集合群のうちの１つが［１、５、８］であり、図１０（Ｂ）の楽観的訂正集合群のうちの１つが［１、５、８、０］と異なっているため、差分判定部５は差分があるとの判定を行う。
【００８０】
以上が、事前条件情報生成部４１の内部構成である。次に、事前条件情報生成部４２の内部構成について説明する。
【００８１】
悲観的矛盾核導出部４２１および楽観的矛盾核導出部４２３は、それぞれ悲観的訂正集合群または楽観的訂正集合群訂正集合群から、矛盾核群（ｕｎｓａｔｉｓｆｉａｂｌｅ  ｃｏｒｅまたはｕｎｓａｔｉｓｆｉａｂｌｅ  ｓｕｂｓｅｔ）を導出する。ここでは、悲観的矛盾核導出部４２１が導出した矛盾核群を悲観的矛盾核群と、楽観的矛盾核導出部４２３が導出した矛盾核群を楽観的矛盾核群と称する。なお、悲観的事前条件と楽観的事前条件に差分がない場合、悲観的矛盾核群と楽観的矛盾核群にも差分はない。ゆえに、差分判定部５から、事前条件情報に差分がないとの結果を取得した場合には、悲観的矛盾核導出部４２１または楽観的矛盾核導出部４２３いずれか一方のみが、導出処理を行えばよい。また、ここでは、個別に矛盾核を導出することを想定し、悲観的矛盾核導出部４２１と、楽観的矛盾核導出部４２３を備えることとしたが、１つにまとめてもよい。
【００８２】
訂正集合群から矛盾核群を求める手法はｈｙｐｅｒｇｒａｐｈ  ｄｕａｌｉｚａｔｉｏｎと呼ばれ、様々な公知手法が存在する。ここでは、たとえば非特許文献３におけるＡｌｌＭＵＳｅｓアルゴリズムなどの公知手法を用いることができる。
【００８３】
算出された悲観的矛盾核群と楽観的矛盾核群はそれぞれ、悲観的矛盾核記憶部４２２と楽観的矛盾核記憶部４２４に格納される。なお、悲観的矛盾核記憶部４２２と楽観的矛盾核記憶部４２４は、１つにまとめてもよいし、矛盾核群を推定部４２５に即座に送る場合などは、なくともよい。
【００８４】
推定部４２５は、悲観的矛盾核群、楽観的矛盾核群、または両方から事前条件を導出する。具体的には、矛盾核群から、事後条件の否定に相当する０を含まないものを削除すればよい。図１１は、矛盾核群と事前条件の一例を示す図である。図１１（Ａ）が矛盾核群、図１１（Ｂ）が事前条件を表す。矛盾核群において、事後条件の否定に相当する０を含まない場合、事前条件が論理的に成り立たない場合である。例えば、図１１（Ａ）の１番目に示した［２、３、４、８］は、（ｍ＜＝ｎ）∧（ｍ！＝ｎ）∧（ｍ＞＝０）∧（ｎ＜＝０）を表すが、この論理式は成立しない。したがって、実用上意味のある事前条件とはならない。
【００８５】
このように、事後条件の否定である０が含まれていないものは、連言の論理式が成立しないものである。一方０を含むものは、非特許文献２に示されるとおり、０を除いたものの連言が事前条件として成立することを意味する。したがって、事後条件の否定を含むものから、事後条件の否定を削除したものが、事前条件となる。結果として、図１１（Ａ）の１３番目から２１番目に示した０を含む各矛盾核から、図１１（Ｂ）のような９つの事前条件が得られる。
【００８６】
以上が、事前条件推定部４２の内部構成である。
【００８７】
なお、上記では、差分判定部５は、悲観的訂正集合群と楽観的訂正集合群を事前条件情報として、判定を行うとしたが、悲観的矛盾核群と楽観的矛盾核群を事前条件情報として、差分判定を行ってもよい。その場合、悲観的矛盾核導出部４２１、悲観的矛盾核記憶部４２２、楽観的矛盾核導出部４２３、および楽観的矛盾核記憶部４２４は、事前条件情報生成部に含まれる。
【００８８】
次に、第１の実施形態により行われる処理の流れについて説明する。図１２は、推定装置の概略処理のフローチャートである。当該処理は、入力部１から、検査対象のプログラム、当該プログラムの事後条件、終了条件、またはそれらの全てが送られてきたタイミングで開始されるものとする。なお、処理に用いられる変数などに格納された前回の処理に関する値は、処理を開始する前に、予め消去（初期化）しておくものとする。
【００８９】
変換条件設定部２は、変換条件を設定する（Ｓ１０１）。ここでは、変換条件は、悲観的プログラム変換部３１および楽観的プログラム変換部３３が変換処理を行った回数とする。ここでは、変換条件の初期値を０とし、変換条件設定部２は、変換条件の値に１を加えることとする。
【００９０】
悲観的プログラム変換部３１および楽観的変換プログラム３２は、それぞれ変換処理を行う（Ｓ１０２、Ｓ１０３）。変換処理にて行われるループ展開は、変換条件の値まで展開されるものとする。ここでは、Ｓ１０２の処理の後、Ｓ１０３の処理を行うとしているが、並列に行われてもよいし、順番の前後を逆にしてもよい。
【００９１】
事前条件情報生成部４１は、Ｓ１０２とＳ１０３で得られた悲観的事前条件と楽観的事前条件とに基づき、悲観的事前条件情報と楽観的事前条件情報の生成処理を行う（Ｓ１０４）。差分判定部５は、事前条件情報生成部４１の生成処理にて生成された楽観的事前条件情報と悲観的事前条件情報に基づき、判定処理を行う（Ｓ１０５）。
【００９２】
差分判定部５が差分なしと判定した場合には（Ｓ１０６のＮＯ）、差分判定部５が事前条件推定部４２に判定結果を渡し、事前条件推定部４２は、事前条件の推定処理を行う（Ｓ１０８Ａ）。この場合、事前条件推定部４２は１つの事前条件を算出する。出力部７は、事前条件推定部４２から渡された１つの事前条件を出力する（Ｓ１０９）。
【００９３】
差分判定部５が差分有りと判定した場合には（Ｓ１０６のＹＥＳ）、変換条件設定部２は、変換条件が終了条件を満たすかを確認する（Ｓ１０７）。ここでは、終了条件は変換処理の回数の上限値とする。終了条件を満たさない場合には（Ｓ１０７のＮＯ）、変換条件を設定する処理に戻る（Ｓ１０１）。変換条件が終了条件を満たす場合には（Ｓ１０７のＹＥＳ）、差分判定部５が事前条件推定部４２に判定結果を渡し、事前条件推定部４２は、事前条件の推定処理を行う（Ｓ１０８Ｂ）。この場合、事前条件推定部４２は２つの事前条件を算出する。出力部７は、事前条件推定部から渡された悲観的事前条件と楽観的事前条件の両方を近似解として出力する（Ｓ１１０）。
【００９４】
以上が、概略処理のフローとなる。次に各部の処理の詳細を説明する。
【００９５】
図１３は、悲観的プログラム変換部３１の変換処理のフローチャートを示す図である。当該フローは、概略処理のフローのＳ１０２に該当する。
【００９６】
悲観的プログラム変換部３１は、検査対象のプログラムにループがあるかを判別する（Ｓ２０１）。ループがない場合（Ｓ２０１のＮＯ）は、変換する必要がないため、Ｓ２０８の処理に移る。ループがある場合（Ｓ２０１のＹＥＳ）は、多重ループであるかを判定する。多重ループである場合（Ｓ２０２のＹＥＳ）は、ループの１重化処理を行う（Ｓ２０３）。多重ループでない場合（Ｓ２０２のＮＯ）は、ループの１重化処理を行わずに、Ｓ２０４の処理に移る。
【００９７】
悲観的プログラム変換部３１は、ループ展開のための変数を有し、変数の値を設定する（Ｓ２０４）。ここでは、変数をｉとし、ｉの初期値は０、変数の値の設定は、変数ｉの値に１を加えることとする。次に、変数ｉが変換条件を超えたかを判別する（Ｓ２０５）。変数ｉの値が変換条件の値以内の場合（Ｓ２０５のＹＥＳ）は、ループを１つ展開する（Ｓ２０６）。そして、再度変数の設定を行う（Ｓ２０４）。変数ｉの値が変換条件を超えるまで、このＳ２０４からＳ２０６の処理が繰り返される。変数ｉの値が変換条件を超えた場合（Ｓ２０６のＮＯ）は、悲観的プログラム変換部３１は、ｗｈｉｌｅ文をａｓｓｅｒｔ文に置換する（Ｓ２０７）。
【００９８】
悲観的プログラム変換部３１は、生成した悲観的プログラムを、悲観的プログラム記憶部３２に格納する（Ｓ２０８）。以上で、悲観的プログラム変換部３１の変換処理のフローが終了する。なお、悲観的プログラム記憶部３２には、検査対象のプログラムも格納してもよい。また、差分判定により、再度、悲観的プログラム変換部３１の変換処理が行われる場合には、悲観的プログラム変換部３１は、悲観的プログラム記憶部３２に格納した検査対象のプログラムを用いて変換処理を行ってもよいし、前回生成した悲観的プログラムも用いて変換処理を行ってもよい。前回生成した悲観的プログラムを用いる場合には、前回生成した悲観的プログラムのａｓｓｅｒｔ文を、図７（Ｂ）で示したｗｈｉｌｅ文に戻してから、ループをさらに１回展開すればよい。
【００９９】
図１４は、楽観的プログラム変換部３３の変換処理のフローチャートを示す図である。当該フローは、概略処理のフローのＳ１０３に該当する。当該フローは、悲観的プログラム変換部３１の変換処理のフローとは、Ｓ３０７にて記述する文がａｓｓｕｍｅ文であることだけが異なり、他は悲観的プログラム変換部３１の変換処理と同一のため、説明は省略する。
【０１００】
図１５は、事前条件情報生成部４１の生成処理のフローチャートを示す図である。当該フローは、概略処理のフローのＳ１０４に該当する。
【０１０１】
１回目の処理の場合（Ｓ４０１のＹＥＳ）、述語生成部４１１は、悲観的プログラムまたは楽観的プログラムに基づき、述語を生成する（Ｓ４０２）。１回目の処理でない場合は（Ｓ４０１のＮＯ）、既に述語が生成されているため、Ｓ４０２の処理は省力される。
【０１０２】
悲観的論理式変換部４１３は、悲観的プログラムを論理式に変換する（Ｓ４０３）。悲観的訂正集合列挙部４１４は、論理式から悲観的訂正集合群を算出する（Ｓ４０４）。同様に、楽観的論理式変換部４１６は、楽観的プログラムを論理式に変換し（Ｓ４０５）、楽観的訂正集合列挙部４１７は、論理式から楽観的訂正集合群を算出する（Ｓ４０６）。悲観的訂正集合群と楽観的訂正集合群は、事前条件情報として判定部に送られる。なお、本フローチャートは悲観的訂正集合の処理を行ってから（Ｓ４０３およびＳ４０４）、楽観的訂正集合の処理（Ｓ４０５およびＳ４０６）を行うようにしているが、並列に行われてもよいし、順番の前後を逆にしてもよい。
【０１０３】
図１６は、事前条件推定部４２の生成処理のフローチャートを示す図である。当該フローは、概略処理のフローのＳ１０８ＡとＳ１０８Ｂに該当する。
【０１０４】
悲観的矛盾核導出部４２１は、差分判定部５の判定結果を取得後、悲観的矛盾核群を導出する（Ｓ５０１）。算出された悲観的矛盾核群は、悲観的矛盾核記録部に格納される（Ｓ５０２）。差分判定部５の判定結果が差分なしの場合（Ｓ５０３のＮＯ）は、推定部４２５が悲観的訂正集合群から、事前条件を１つ推定する（Ｓ５０４）。
【０１０５】
差分判定部５の判定結果が差分ありの場合（Ｓ５０３のＹＥＳ）は、楽観的矛盾核導出部４２３が、楽観的矛盾核群を導出する（Ｓ５０５）。算出された楽観的矛盾核群は、楽観的矛盾核記録部４２４に格納される（Ｓ５０６）。推定部４２５は、悲観的訂正集合群および楽観的訂正集合群それぞれから、事前条件を２つ推定する（Ｓ５０７）。
【０１０６】
なお、本フローチャートは、差分判定部５の判定結果が差分なしの場合、悲観的矛盾核群から事前条件を導出することを想定したものである。差分判定部５の判定結果が差分なしの場合、楽観的矛盾核群から事前条件を導出するとしてもよく、その場合は、悲観的矛盾核導出の処理（Ｓ５０１とＳ５０２）と、楽観的矛盾核導出の処理（Ｓ５０５とＳ５０６）とを入れ替えればよい。
【０１０７】
以上のように、第１の実施形態によれば、悲観的プログラムと楽観的プログラムを用いることで、推定された事前条件の正確性を保証できる。また、差分が収束せずに正確な事前条件が算出できない場合でも、２種類の近似条件をユーザに提示することで、条件の範囲を限定することができ、ユーザの利便性を向上させることができる。
【０１０８】
（第２の実施形態）
次に、第２の実施形態について説明する。
【０１０９】
第１の実施形態では、差分判定部５が悲観的および楽観的事前条件情報の差分を判定し、差分がなくなるまでまたは終了条件を満たすまで、ループ処理の展開数を増加させ、展開数が増加したプログラムに基づき、訂正集合群を算出した。しかし、展開数が増えるに従い、論理式も大きくなり、訂正集合群を算出する処理の負担が増加するという問題がある。
【０１１０】
そこで、第２の実施形態では、差分があった場合に、今までに算出した訂正集合群を活用し、論理式が大きくならないようなプログラム変換を行う。これにより、第２の実施形態では、訂正集合群を第１の実施形態よりも効率よく求めることができる。
【０１１１】
まず、本実施形態で用いる反例的訂正集合について説明する。先の図１０で示した通り、悲観的訂正集合群および楽観的訂正集合群は、いずれにおいても、０（事後条件の否定）を含む訂正集合と、０を含まない訂正集合とを有する。訂正集合とは、「取り除くと解が現れるような制約の組合せ」であるため、０が含まれないということは、「事後条件の否定が満たされる解が存在する」ということである。すなわち、０を含まない訂正集合は、正常ではないプログラムの挙動を示す解（反例）となる。このような反例を示すがため、以降、０を含まない訂正集合を、「反例的訂正集合」と称する。
【０１１２】
展開数がｎ（ｎは１以上の整数）の楽観的プログラムは、検査対象のプログラムのループ処理が指定された回数ｎ以上実行される場合は、正常と扱うものである。ゆえに、展開数がｎの楽観的プログラムの反例的訂正集合群は、「ループ処理の回数が１回からｎ回までのときに、事後条件が否定される場合」を示すものである。また、展開数がｎ＋１の楽観的プログラムの反例的訂正集合群は、「ループ処理の回数が１回からｎ＋１回までのときに、事後条件が否定される場合」を示すものである。そうすると、２つの反例的訂正集合の差は、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」だけである。
【０１１３】
したがって、展開数がｎの楽観的プログラムの反例的訂正集合群が既に算出されているときは、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」の反例的訂正集合を求めるためのプログラムを生成する。そして、このプログラムの反例的訂正集合群と、展開数がｎの楽観的プログラムの反例的訂正集合群とを合成すれば、展開数がｎ＋１の楽観的プログラムの反例的訂正集合群を求めることができる。
【０１１４】
ここでは、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」の反例的訂正集合を求めるためのプログラムを楽観的差分プログラム、楽観的差分プログラムにおける訂正集合を楽観的差分訂正集合と称する。
【０１１５】
図１７は、楽観的差分プログラムの一例を示す図である。図１７に示す楽観的差分プログラムは、展開数が２の楽観的プログラムのｉｆ文の条件式を、ａｓｓｕｍｅ文に置換したものである。楽観的プログラムでは、ｉｆ文の条件式を満たさない場合、処理が途中で終了することがあり得る。しかし、この楽観的差分プログラムでは、ｉｆ文の本文の処理が必ず２回行われ、２回処理された後でも、条件式（ｄ！＝０）を満たす場合は無視される。したがって、ｎ＝１として「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」のみの反例的訂正集合を求めるためのプログラムとなる。
【０１１６】
図１８は、合成を説明するための図である。図１８（Ａ）に展開数がｎの楽観的訂正集合（合成前の楽観的訂正集合）、図１８（Ｂ）に楽観的差分訂正集合、図１８（Ｃ）に展開数がｎ＋１の楽観的訂正集合（合成後の楽観的訂正集合）の一例を示す。合成前の楽観的訂正集合の反例的訂正集合群には含まれていない［１，５，８］が、楽観的差分訂正集合の反例的訂正集合群に含まれている。そのため、合成後の楽観的訂正集合の反例的訂正集合群には［１，５，８］が追加される。
【０１１７】
また、［１，５，８］が、合成後の楽観的訂正集合の反例的訂正集合群にあるとすると、合成前の楽観的訂正集合群に含まれている［１，５，８，０］は、合成後の楽観的訂正集合群には含まれないはずである。ゆえに、［１，５，８，０］を削除すると、合成後の楽観的訂正集合群と同一になる。このように、反例的訂正集合群だけでなく訂正集合群同士を比較し、訂正集合の全要素を包含する訂正集合がある場合には、包含する訂正集合を削除するという方法であれば、訂正集合群同士で合成が可能である。
【０１１８】
また、展開数がｎ＋１の悲観的プログラムは、検査対象のプログラムのループ処理が指定された回数ｎ＋１以上実行される場合は、異常（エラー）と扱うものである。ゆえに、展開数がｎ＋１の悲観的プログラムの反例的訂正集合群は、「ループ処理の回数が１回からｎ＋１回までのときに、事後条件が否定される場合」と「ループがｎ＋２回以上実行されてしまう場合」を示すものとなる。そうすると、展開数がｎ＋１の悲観的プログラムの反例的訂正集合群と、展開数がｎの楽観的プログラムの反例的訂正集合群との差は、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」と「ループがｎ＋２回以上実行されてしまう場合」である。
【０１１９】
したがって、展開数がｎの楽観的プログラムの反例的訂正集合群が既に算出されている場合は、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」と「ループがｎ＋２回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムを生成する。そして、このプログラムの反例的訂正集合群を、展開数がｎの楽観的プログラムの反例的訂正集合群と合成すれば、展開数がｎ＋１の楽観的プログラムの反例的訂正集合群を求めることができる。
【０１２０】
ここでは、「ループ処理の回数がｎ＋１回のときに、事後条件が否定される場合」と「ループがｎ＋２回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムをを悲観的差分プログラム、悲観的差分プログラムにおける訂正集合を悲観的差分訂正集合と称する。
【０１２１】
図１９は、悲観的差分プログラムの一例を示す図である。図１９に示す悲観的差分プログラムは、展開数が２の悲観的プログラムのｉｆ文の条件式を、ａｓｓｕｍｅ文に置換したものである。悲観的プログラムでは、ｉｆ文の条件式を満たさない場合、処理が途中で終了することがあり得る。しかし、この悲観的差分プログラムでは、ｉｆ文の本文の処理が必ず２回行われ、２回処理された後でも、条件式（ｄ！＝０）を満たす場合は、異常とみなされる。したがって、「ループ処理の回数が２回のときに、事後条件が否定される場合」と「ループが３回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムとなる。
【０１２２】
図２０は、悲観的差分訂正集合群による合成を説明するための図である。図２０（Ａ）に展開数がｎの悲観的訂正集合（合成前の悲観的訂正集合）、図２０（Ｂ）に悲観的差分訂正集合、図２０（Ｃ）に展開数がｎ＋１の悲観的訂正集合（合成後の悲観的訂正集合）の一例を示す。合成前の悲観的訂正集合群と悲観的差分訂正集合群を比較し、図１８で説明したとおり、訂正集合の全要素を包含する訂正集合を削除することにより、合成後の悲観的訂正集合群が得られる。図２０の例では、悲観的差分訂正集合群にある［２，６，７，０］と［３，４，７，０］を削除すればよい。ここでは、結果的に、合成前と合成後の悲観的訂正集合群は同一となっている。
【０１２３】
以上のことから、１度、悲観的プログラムおよび楽観的プログラムを算出した後は、展開数を増加させた悲観的プログラムおよび楽観的プログラムを生成するのではなく、悲観的差分訂正集合および楽観的差分訂正集合を求めることができる変換プログラムを生成すればよいことが分かる。そして、悲観的差分訂正集合および楽観的差分訂正集合を算出し、過去の訂正集合群と合成すれば、各訂正集合群を効率的に求められる。
【０１２４】
次に、第２の実施形態における各部の処理について、第１の実施形態と異なる点を説明する。
【０１２５】
第２の実施形態における悲観的プログラム変換部３１と楽観的プログラム変換部３３は、１回目のプログラム変換処理については、第１の実施形態と同様に行い、２回目以降の変換処理については、悲観的差分プログラムおよび楽観的差分プログラムを生成する。
【０１２６】
第２の実施形態における事前条件情報生成部４１は、２回目以降の処理については、プログラム変換部３から送られる悲観的差分プログラムおよび悲観的差分プログラムに基づき、処理を行う。事前条件情報生成部４１の悲観的訂正集合列挙部４１４および楽観的訂正集合列挙部４１７は、悲観的差分訂正集合群および楽観的差分訂正集合群を生成する。生成された悲観的差分訂正集合群と楽観的差分訂正集合群はそれぞれ、悲観的プログラム記憶部３２と楽観的プログラム記憶部３４に格納される。
【０１２７】
差分判定部５は、合成後の悲観的訂正集合群および楽観的訂正集合群との差分を比較してもよいが、ここでは、悲観的差分訂正集合群と楽観的差分訂正集合群との差分を比較することとする。合成前の悲観的訂正集合群および楽観的訂正集合群が異なる場合において、悲観的差分訂正集合群と楽観的差分訂正集合群が異なるときは、必ず合成後の悲観的訂正集合群および楽観的訂正集合群も異なるからである。また、悲観的訂正集合の合成を、変換条件が終了条件を超えるまで、行う必要がなくなるからである。
【０１２８】
差分がなしの場合、事前条件情報生成部４１は楽観的訂正集合群のみを合成し、事前条件推定部４２は、楽観的訂正集合群に基づき、事前条件を１つ推定する。また、差分がありかつ変換条件が終了条件を超えていない場合、事前条件情報生成部４１は、楽観的訂正集合のみを合成する。悲観的訂正集合は、合成処理に用いられないからである。差分がありかつ変換条件が終了条件を超えた場合は、事前条件情報生成部４１は、楽観的訂正集合群および悲観的訂正集合群を合成し、事前条件推定部４２は、楽観的訂正集合群および悲観的訂正集合群それぞれに基づき、事前条件を２つ推定する。
【０１２９】
なお、楽観的プログラム記憶部３４には、楽観的差分訂正集合群と、楽観的訂正集合群の両方が格納されることとなるが、差分判定部５が楽観的差分訂正集合群を参照するために必要なフラグ値などを付与すればよい。または、楽観的訂正集合群を、楽観的訂正集合記憶部４１８とは異なる図示しない記憶部に格納してもよい。
【０１３０】
その他の処理は、第１の実施形態と同様である。
【０１３１】
以上のように、第２の実施形態によれば、差分が一致するまで徐々に増加させるループ展開において、訂正集合群を第１の実施形態よりも効率よく求めることができ、処理の負担を軽減することができる。
【０１３２】
（第３の実施形態）
次に、第３の実施形態について説明する。
【０１３３】
プログラムのループは、上述の実施形態に示したｗｈｉｌｅ文、またはｗｈｉｌｅ文に変換可能な形式で記述される場合もあれば、プログラム内で自己の関数を呼び出す再帰呼び出し形式で記述される場合もあり得る。そこで、第３の実施形態では、再帰呼び出しを含むプログラムを対象とする。
【０１３４】
図２１は、再帰関数を含むプログラムに対するプログラム変換を説明する図である。図２１（Ａ）に記載されたプログラムは、８行目に自己の関数ｇｃｄ（）を呼び出しているため、再帰関数を含むプログラムである。ゆえに、この８行目のｇｃｄ（）を展開する。図２１（Ｂ）は、再帰関数を１回展開した一例である。３行目に、新たなローカル変数ｄ０の宣言文が挿入されている。そして、変換前のプログラムにてｇｃｄ（）を呼び出した箇所（図２１（Ａ）の８行目）に、ローカル変数の宣言文（図２１（Ａ）の２行目）以外の元のプログラムを展開する（図２１（Ｂ）の９から１３行目）。但し、呼び出し関数の引数は、ｎとｄであるたため、変数ｍの代わりに変数ｎに、変数ｎの代わりに変数ｄに置き換えて展開する。変換前のプログラムにて、変数ｄが記載されていた箇所には、変数ｄの代わりに、変数ｄ０に置き換える。そして、展開数が１の場合は、１３行目に記載されたｇｃｄ（）を悲観的プログラムならばａｓｓｅｒｔ文に、楽観的プログラムならばａｓｓｕｍｅ文に置き換えれば、変換後のプログラムが生成される。
【０１３５】
図２１（Ｃ）は、上記のように生成された悲観的プログラムを示す。なお、ここではａｓｓｅｒｔ文の条件式は、便宜的に、（！１）と記載する。Ｃ言語では、ＴＲＵＥは１、Ｆａｌｓｅは０で表示される。
【０１３６】
図２２は、再帰関数を含むプログラムに基づく悲観的プログラムと楽観的プログラムの一例を示す図である。ローカル変数は、ｄ０とｄ１を用いている。このように、展開数に合わせて、使用するローカル変数と、記載される再帰関数の本文が増加する。
【０１３７】
第３の実施形態では、上記のように変換された悲観的プログラムおよび楽観的プログラムを用いて、事前条件を算出する。悲観的プログラムおよび楽観的プログラムの変換は、悲観的プログラム変換部３１および楽観的プログラム変換部３３に、予め再帰関数の処理方法を登録しておけばよい。なお、ここでは、再帰関数だけを含み、ループ処理を含まないプログラムを例示したが両方を含んでいてもよく、悲観的プログラム変換部３１と楽観的プログラム変換部３３が、ループと再帰関数を検知して、それらに応じた展開処理を行うようにすればよい。
【０１３８】
悲観的プログラムおよび楽観的プログラムを算出する方法以外は、今までの実施形態と同様のため、省略する。
【０１３９】
以上のように、第３の実施形態によれば、再帰関数を含んだプログラムにも対応することが可能である。
【０１４０】
上記に説明した実施形態における各処理は、ソフトウェア（プログラム）によって実現することが可能である。よって、上記に説明した実施形態における推定装置は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用い、コンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することが可能である。
【０１４１】
図２３は、本発明の一実施形態に係るハードウェア構成の一例を示すブロック図である。推定装置は、プロセッサ８０１、主記憶装置８０２、補助記憶装置８０３、デバイスインタフェース８０４を備え、これらがバス８０５を介して接続された、コンピュータ装置８として実現できる。
【０１４２】
プロセッサ８０１が、補助記憶装置８０３からプログラムを読み出して、主記憶装置８０２に展開して、実行することで、変換条件設定部２、プログラム変換部３、事前条件導出部４、差分判定部５の機能を実現することができる。
【０１４３】
本実施形態の推定装置は、当該推定装置で実行されるプログラムをコンピュータ装置に予めインストールすることで実現してもよいし、プログラムをＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して配布して、コンピュータ装置に適宜インストールすることで実現してもよい。
【０１４４】
主記憶装置８０２は、プロセッサ８０１が実行する命令、および各種データ等を一時的に記憶するメモリ装置であり、ＤＲＡＭ等の揮発性メモリでも、ＭＲＡＭ等の不揮発性メモリでもよい。補助記憶装置８０３は、プログラムやデータ等を永続的に記憶する記憶装置であり、例えば、ＨＤＤまたはＳＳＤ等がある。変換条件記憶部６などの記憶部などが保持するデータは、主記憶装置８０２、補助記憶装置８０３または外部記憶媒体に保存される。
【０１４５】
デバイスインタフェース８０４は、外部記憶媒体９などの機器に接続するインタフェースである。外部記憶媒体９は、ＨＤＤ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒ、ＳＡＮ（Ｓｔｏｒａｇｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）等の任意の記録媒体でよい。変換条件記憶部６などの記憶部は、外部記憶媒体９としてデバイスインタフェース８０４に接続されてもよい。
【０１４６】
上記に、本発明の一実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１４７】
１  入力部
２  変換条件設定部
３  プログラム変換部
３１  悲観的プログラム変換部
３２  悲観的プログラム記憶部
３３  楽観的プログラム変換部
３４  楽観的プログラム記憶部
４  事前条件導出部
４１  事前条件情報生成部
４１１  述語生成部
４１２  述語記憶部
４１３  悲観的論理式変換部
４１４  悲観的訂正集合列挙部
４１５  悲観的訂正集合記憶部
４１６  楽観的論理式変換部
４１７  楽観的訂正集合列挙部
４１８  楽観的訂正集合記憶部
４２  事前条件推定部
４２１  悲観的矛盾核導出部
４２２  悲観的矛盾核記憶部
４２３  楽観的矛盾核導出部
４２４  楽観的矛盾核記憶部
４２５  推定部
５  差分判定部
６  変換条件記憶部
７  出力部
８  コンピュータ装置
８０１  プロセッサ
８０２  主記憶装置
８０３  補助記憶装置
８０４  デバイスインタフェース
８０５  バス
９  外部記憶媒体
【図１】
2017041085.tif 000003
【図２】
2017041085.tif 000004
【図３】
2017041085.tif 000005
【図４】
2017041085.tif 000006
【図５】
2017041085.tif 000007
【図６】
2017041085.tif 000008
【図７】
2017041085.tif 000009
【図８】
2017041085.tif 000010
【図９】
2017041085.tif 000011
【図１０】
2017041085.tif 000012
【図１１】
2017041085.tif 000013
【図１２】
2017041085.tif 000014
【図１３】
2017041085.tif 000015
【図１４】
2017041085.tif 000016
【図１５】
2017041085.tif 000017
【図１６】
2017041085.tif 000018
【図１７】
2017041085.tif 000019
【図１８】
2017041085.tif 000020
【図１９】
2017041085.tif 000021
【図２０】
2017041085.tif 000022
【図２１】
2017041085.tif 000023
【図２２】
2017041085.tif 000024
【図２３】
2017041085.tif 000025