(57)【要約】【課題】ユーザがコード内に挿入した振る舞いを表すタグに注目して部分検証用モデルを作成し、特定の振る舞いに関連したコードのみについて部分的に検証する。【解決手段】プログラム中の分岐文で分岐する先のブロックに対し振る舞いを表すタグを埋め込む。また、検証時に検証の対象とする振る舞いを指定し、ブロックに埋め込まれたタグと指定された振る舞いから検証すべきブロックを通過するための変数・式の値の範囲を特定する。そして、特定された範囲を検証範囲とすることで、特定の振る舞いに関連したコードのみについて部分的に検証する。【選択図】図５
2010204954.tif 000002
【特許請求の範囲】
【請求項１】
検証対象のプログラムを記憶するプログラム記憶手段と、
前記検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を記憶する表明記憶手段と、
前記表明、及び、ユーザにより指定された振る舞いに基づき、前記検証対象プログラム中に前記振る舞いに関連したコードを埋め込み、前記振る舞いに関連したコードを検証するための検証用モデルを作成する検証用モデル作成手段と、
前記検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、前記検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証する検証手段と
を具備する
プログラム検証装置。
【請求項２】
請求項１に記載のプログラム検証装置であって、
入力装置から前記振る舞いを読み取り、前記検証用モデル作成手段に出力する前記動作モード入力手段
を更に具備し、
前記検証用モデル作成手段は、前記動作モード入力手段から前記振る舞いを受け取ると、前記プログラム記憶手段から前記検証対象プログラムを読み取り、前記表明記憶手段から前記表明を読み取り、前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成し、前記検証手段に出力する
プログラム検証装置。
【請求項３】
請求項１に記載のプログラム検証装置であって、
前記振る舞いを記憶する振る舞い記憶手段
を更に具備し、
前記検証用モデル作成手段は、
前記プログラム記憶手段から前記検証対象プログラムを読み取り、前記表明記憶手段から前記検証対象プログラムの表明を読み取り、前記振る舞い記憶手段から前記振る舞いを読み取り、前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成し、前記検証手段に出力する
プログラム検証装置。
【請求項４】
請求項１乃至３のいずれか一項に記載のプログラム検証装置であって、
前記検査用モデル作成手段は、
前記表明中から前記振る舞いに対応したインタフェース条件の定義を探し出し、前記探し出した定義中の事前条件に合わせた初期値を前記検証用モデルに追加する手段と、
前記検証対象プログラムの最初の文を命令文とする手段と、
前記命令文が分岐文かどうか判断する手段と、
前記命令文が分岐文の場合、分岐先ブロックのいずれかに振る舞いを表すタグがあるかどうか調べる手段と、
前記分岐先ブロックのいずれかに振る舞いを表すタグがある場合、前記振る舞いと同じタグがあるかどうか調べる手段と、
前記振る舞いと同じタグがある場合、前記振る舞いと同じタグがある分岐先ブロックのみを通過する変数・式の値の制約を前記検証用モデルに追加する手段と、
前記振る舞いと同じタグがない場合、前記振る舞いと同じタグがある分岐先ブロックを通過しない変数・式の値の制約を前記検証用モデルに追加する手段と、
前記命令文を前記検証用モデルに追加する手段と、
前記命令文が前記検証対象プログラムの終わりの文であるか確認する手段と、
前記命令文が前記検証対象プログラムの終わりの文でなければ、次の文を新規の命令文とし、前記新規の命令文に対して、前記命令文と同様の処理を繰り返す手段と、
前記命令文が前記検証対象プログラムの終わりの文であれば、前記検証用モデルを前記検証手段に出力する手段と
を具備する
プログラム検証装置。
【請求項５】
請求項１乃至４のいずれか一項に記載のプログラム検証装置であって、
前記検証用モデル作成手段及び前記検証手段を統合した検証実行手段
を更に具備する
プログラム検証装置。
【請求項６】
プログラム記憶手段に、検証対象のプログラムを保持し、
表明記憶手段に、前記検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を保持し、
前記表明、及び、ユーザにより指定された振る舞いに基づき、前記検証対象プログラム中に前記振る舞いに関連したコードを埋め込み、前記振る舞いに関連したコードを検証するための検証用モデルを作成し、
前記検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、前記検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証する
プログラム検証方法。
【請求項７】
請求項６に記載のプログラム検証方法であって、
入力装置から前記振る舞いを読み取り、
前記振る舞いを受け取ると、前記プログラム記憶手段から前記検証対象プログラムを読み取り、
前記表明記憶手段から前記表明を読み取り、
前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成する
プログラム検証方法。
【請求項８】
請求項６に記載のプログラム検証方法であって、
振る舞い記憶手段に、前記振る舞いを保持し、
前記プログラム記憶手段から前記検証対象プログラムを読み取り、
前記表明記憶手段から前記検証対象プログラムの表明を読み取り、
前記振る舞い記憶手段から前記振る舞いを読み取り、
前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成する
プログラム検証方法。
【請求項９】
請求項６乃至８のいずれか一項に記載のプログラム検証方法であって、
前記表明中から前記振る舞いに対応したインタフェース条件の定義を探し出し、前記探し出した定義中の事前条件に合わせた初期値を前記検証用モデルに追加し、
前記検証対象プログラムの最初の文を命令文とし、
前記命令文が分岐文かどうか判断し、
前記命令文が分岐文の場合、分岐先ブロックのいずれかに振る舞いを表すタグがあるかどうか調べ、
前記分岐先ブロックのいずれかに振る舞いを表すタグがある場合、前記振る舞いと同じタグがあるかどうか調べ、
前記振る舞いと同じタグがある場合、前記振る舞いと同じタグがある分岐先ブロックのみを通過する変数・式の値の制約を前記検証用モデルに追加し、
前記振る舞いと同じタグがない場合、前記振る舞いと同じタグがある分岐先ブロックを通過しない変数・式の値の制約を前記検証用モデルに追加し、
前記命令文を前記検証用モデルに追加し、
前記命令文が前記検証対象プログラムの終わりの文であるか確認し、
前記命令文が前記検証対象プログラムの終わりの文でなければ、次の文を新規の命令文とし、前記新規の命令文に対して、前記命令文と同様の処理を繰り返し、
前記命令文が前記検証対象プログラムの終わりの文であれば、前記検証用モデルを用いて検証を行う準備をする
プログラム検証方法。
【請求項１０】
請求項６乃至９のいずれか一項に記載のプログラム検証方法であって、
前記検証用モデルの作成及び検証に係る処理を統合して、一連の処理として実行する
プログラム検証方法。
【請求項１１】
プログラム記憶手段に、検証対象のプログラムを保持するステップと、
表明記憶手段に、前記検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を保持するステップと、
前記表明、及び、ユーザにより指定された振る舞いに基づき、前記検証対象プログラム中に前記振る舞いに関連したコードを埋め込み、前記振る舞いに関連したコードを検証するための検証用モデルを作成するステップと、
前記検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、前記検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証するステップと
をコンピュータに実行させるための
検証機能実行用プログラム。
【請求項１２】
請求項１１に記載の検証機能実行用プログラムであって、
入力装置から前記振る舞いを読み取るステップと、
前記振る舞いを受け取ると、前記プログラム記憶手段から前記検証対象プログラムを読み取るステップと、
前記表明記憶手段から前記表明を読み取るステップと、
前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成するステップと
を更にコンピュータに実行させるための
検証機能実行用プログラム。
【請求項１３】
請求項１１に記載の検証機能実行用プログラムであって、
振る舞い記憶手段に、前記振る舞いを保持するステップと、
前記プログラム記憶手段から前記検証対象プログラムを読み取るステップと、
前記表明記憶手段から前記検証対象プログラムの表明を読み取るステップと、
前記振る舞い記憶手段から前記振る舞いを読み取るステップと、
前記検証対象プログラム、前記表明、及び前記振る舞いに基づいて前記検証用モデルを作成するステップと
を更にコンピュータに実行させるための
検証機能実行用プログラム。
【請求項１４】
請求項１１乃至１３のいずれか一項に記載の検証機能実行用プログラムであって、
前記表明中から前記振る舞いに対応したインタフェース条件の定義を探し出し、前記探し出した定義中の事前条件に合わせた初期値を前記検証用モデルに追加するステップと、
前記検証対象プログラムの最初の文を命令文とするステップと、
前記命令文が分岐文かどうか判断するステップと、
前記命令文が分岐文の場合、分岐先ブロックのいずれかに振る舞いを表すタグがあるかどうか調べるステップと、
前記分岐先ブロックのいずれかに振る舞いを表すタグがある場合、前記振る舞いと同じタグがあるかどうか調べるステップと、
前記振る舞いと同じタグがある場合、前記振る舞いと同じタグがある分岐先ブロックのみを通過する変数・式の値の制約を前記検証用モデルに追加するステップと、
前記振る舞いと同じタグがない場合、前記振る舞いと同じタグがある分岐先ブロックを通過しない変数・式の値の制約を前記検証用モデルに追加するステップと、
前記命令文を前記検証用モデルに追加するステップと、
前記命令文が前記検証対象プログラムの終わりの文であるか確認するステップと、
前記命令文が前記検証対象プログラムの終わりの文でなければ、次の文を新規の命令文とし、前記新規の命令文に対して、前記命令文と同様の処理を繰り返すステップと、
前記命令文が前記検証対象プログラムの終わりの文であれば、前記検証用モデルを前記検証手段に出力するステップと
を更にコンピュータに実行させるための
検証機能実行用プログラム。
【請求項１５】
請求項１１乃至１４のいずれか一項に記載の検証機能実行用プログラムであって、
前記検証用モデルの作成及び検証に係る処理を統合して、一連の処理として実行するステップと
を更にコンピュータに実行させるための
検証機能実行用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム検証装置に関し、特にプログラムと表明を入力としたプログラムの検証を行うプログラム検証装置に関する。
【背景技術】
【０００２】
プログラムの正しさを検証するために、プログラムの実行前に成り立つ性質（事前条件）とプログラムの実行後に成り立つ性質（事後条件）を表明として定義し、事前条件の元でプログラムが実行された場合に、プログラムの途中で実行時エラーを発生するかどうかやプログラム実行後に事後条件が成り立つかどうかを確認する手法がある。
【０００３】
該手法に基づいたツールとして、Ｃ言語プログラムを検証する「Ｃａｄｕｃｅｕｓ」（非特許文献１）や「Ｆｒａｍａ−Ｃ」（非特許文献２）、Ｊａｖａ（登録商標）プログラムを検証する「ＥＳＣ／Ｊａｖａ２」（非特許文献３）等がある。これらのツールは、プログラムとプログラムの構成要素である関数・メソッド単位に対して各ツール固有の方法で定義した表明を入力とし、プログラムの正しさを検証する。
【０００４】
ここで、「ＡＣＳＬ：  ＡＮＳＩ／ＩＳＯ  Ｃ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｌａｎｇｕａｇｅ」（非特許文献４）のように、プログラムの正しさを検証するためにプログラムの実行前に成り立つ性質（事前条件）とプログラムの実行後に成り立つ性質（事後条件）を表明として定義する時、与えられた条件によってプログラムの振る舞いが変わる場合には、その振る舞い毎にインタフェース条件（事前条件と、それに対する事後条件の組）を定義する記法を用いて表明を記述することができる。
【０００５】
例えば、図１に示す関数「ｆ」に対する表明は、図２のようになる。なお、ここで「＠ｂｅｈａｖｉｏｒ」は振る舞いを表すキーワード、「＠ｒｅｑｕｉｒｅｓ」、「＠ｅｎｓｕｒｅｓ」はそれぞれ事前条件、事後条件を表すキーワード、「＠ａｓｓｕｍｅ」は該関数を呼び出す時の制約とはならない事前条件を表すキーワード、「￥ｖａｌｉｄ（）」は括弧内に示されたポインタ変数が有効である場合に真を、無効である場合に偽を返すキーワードである。この表明では、関数「ｆ」は「ｒｅａｄ＿ｆｒｏｍ＿ｐａｒａｍ」、「ｒｅａｄ＿ｆｒｏｍ＿ｅｘｔ」という２つの正常系の振る舞いと、「ｍｏｄｅ＿ｅｒｒｏｒ」という異常系の振る舞いを持ち、それぞれの振る舞いでのインタフェース条件が明確に定義されている。
【０００６】
これにより、複数の振る舞いを持つプログラムのインタフェース条件を明確に表すことができる。また、それに伴い、特定の振る舞いのみについてプログラムの正しさを検証することもできる。例えば、「ｒｅａｄ＿ｆｒｏｍ＿ｅｘｔ」の事前条件である「ｍｏｄｅ＝＝Ｍ＿ＥＸＴ」及び「￥ｖａｌｉｄｅ（ｏｕｔｐ）」を前提としてプログラムの動作を検証し事後条件「￥ｒｅｔｕｒｎ＝＝Ｅ＿ＯＫ」及び「＊ＯＵＴＰ＞＝０」が満たされれば、関数「ｆ」は振舞い「ｒｅａｄ＿ｆｒｏｍ＿ｅｘｔ」において正しいと言える。
【０００７】
しかし、プログラムの振る舞いが、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の戻り値や副作用により決まる場合には、前述の記法だけではプログラムの振る舞い毎のインタフェース条件を定義することはできない。例えば、図３に示す関数「ｆ」は、非決定的な振る舞いをする外部関数「ｅｘｔ＿ｉｎｉｔ」の戻り値により正常系と異常系といった異なった振舞いをするが、それらについてのインタフェース条件を前述の記法のみを用いて区別し定義することはできない。
【０００８】
関連する技術として、特開２００２−３４２１１５号公報（特許文献１）にデバッガ、デバッグ方法、プログラムが開示されている。この関連技術では、端末よりデバッガにモジュールの条件分岐における任意の変数の値を表示するデバックコマンドを指定されると、デバッガは現在中断している行以降のすべての条件分岐の真の処理、偽の処理のアドレス／ソース行番号／ソースファイル名をデバッグ情報から求め、デバッガに制御を戻す命令を分岐中の処理に埋め込む。モジュールの実行時に実行された分岐中の処理からデバッガが呼ばれることで、デバッガは指定された変数のアドレスをデバッグ情報からもとめ、変数の値を取り出すことで端末に実行された行及び条件分岐行をソースファイルを読み込んで表示及び変数の値を表示する。
【０００９】
また、特開２００７−０１１６９０号公報（特許文献２）にプログラムの検証プログラム、プログラムの検証装置、プログラムの検証方法が開示されている。この関連技術では、モデル生成部は、ソースコード分類処理の結果をモデルに変換する。モデルの種類は、検証処理で用いる技術により異なる。ここでは、検証処理にモデルチェックを用い、モデルとしてＦＳＭを用いる。モデル生成部は、ソースコード分類処理の結果のうち、基本ブロック単位または共有変数を参照するブロック単位で状態を割り付け、更に状態最適化を行う。状態最適化は、マークが付いた部分が含まれない状態を１つの状態にまとめるものであり、Ｓｔａｔｅ  Ｍｉｎｉｍｉｚａｔｉｏｎアルゴリズムの応用により実現可能である。次に、検証部は、モデル生成処理の結果を用いて検証処理を行う。検証処理の方法として、モデルチェック、ルールベースチェック等がある。
【００１０】
また、特開２００８−２０３９７７号公報（特許文献３）にソフトウェア検証装置、ソフトウェア検証方法およびソフトウェア検証プログラムが開示されている。この関連技術では、ソフトウェア検証装置は、中央処理装置と、出力装置と、一次記憶装置と、二次記憶装置とを備える。中央処理装置は、二次記憶装置が記憶する検証対象ソフトウェアのソースコードを読み取って検証処理を行い、検証結果を出力装置に出力する。ここでは、中央処理装置は、起点モジュールｍｓから、前条件無しで性質ｐが守られるか否かを判定する。判定不能の場合、性質ｐを含むモジュールを呼び出す可能性がある下位モジュールを起点モジュールｍｓとして、前条件無しで性質ｐが守られるか否かを判定する。性質ｐが守られないと判定した場合、性質ｐが守られないための条件Ｃｆを求め、最上位のモジュールから検証対象のモジュールの開始時までの処理結果において、条件Ｃｆが成り立つか否かを判定する。条件Ｃｆが成り立たないと判定した場合、検証対象のモジュールの検証結果を「性質ｐは守られる」とする。全ての下位モジュールに対して性質ｐが守られると判定した場合、ｍｓの検証結果Ｒｓを「性質ｐは守られる」とする。
【００１１】
また、特開２００８−２１００５９号公報（特許文献４）に情報処理装置、デバッグ支援方法及びプログラムが開示されている。この関連技術では、予め形式的に記述しておいた仕様（例えばメソッドの事前条件と事後条件）に従って、プログラムの動作状況を自動的に検証、プログラム内の誤っている箇所の範囲、つまり挙動を確認すべき範囲を自動的に絞り込む。このとき、ソースコード内の関数に付与された表明に関する注釈を解析し、デバッガ上で評価可能な式を生成する。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開２００２−３４２１１５号公報
【特許文献２】特開２００７−０１１６９０号公報
【特許文献３】特開２００８−２０３９７７号公報
【特許文献４】特開２００８−２１００５９号公報
【非特許文献】
【００１３】
【非特許文献１】Ｃａｄｕｃｅｕｓ  ＜ｈｔｔｐ：／／ｃａｄｕｃｅｕｓ．ｌｒｉ．ｆｒ／＞
【非特許文献２】Ｆｒａｍａ−Ｃ  ＜ｈｔｔｐ：／／ｆｒａｍａ−ｃ．ｃｅａ．ｆｒ／ｉｎｄｅｘ．ｈｔｍｌ＞
【非特許文献３】ＥＳＣ／Ｊａｖａ２  ＜ｈｔｔｐ：／／ｋｉｎｄ．ｕｃｄ．ｉｅ／ｐｒｏｄｕｃｔｓ／ｏｐｅｎｓｏｕｒｃｅ／ＥＳＣＪａｖａ２／＞
【非特許文献４】ＡＣＳＬ：  ＡＮＳＩ／ＩＳＯ  Ｃ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｌａｎｇｕａｇｅ  ＜ｈｔｔｐ：／／ｆｒａｍａ−ｃ．ｃｅａ．ｆｒ／ｄｏｗｎｌｏａｄ／ａｃｓｌ＿１．４．ｐｄｆ＞
【発明の概要】
【発明が解決しようとする課題】
【００１４】
本発明の目的は、プログラムと表明を入力としたプログラムの検証において、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合においても、検証対象プログラムの特定の振る舞いに関連したコードのみについて部分的に検証することを可能にするプログラム検証装置を提供することである。
【課題を解決するための手段】
【００１５】
本発明のプログラム検証装置は、検証対象のプログラムを記憶するプログラム記憶手段と、検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を記憶する表明記憶手段と、表明、及び、ユーザにより指定された振る舞いに基づき、検証対象プログラム中に振る舞いに関連したコードを埋め込み、振る舞いに関連したコードを検証するための検証用モデルを作成する検証用モデル作成手段と、検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証する検証手段とを具備する。
【００１６】
本発明のプログラム検証方法では、プログラム記憶手段に、検証対象のプログラムを保持する。また、表明記憶手段に、検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を保持する。また、表明、及び、ユーザにより指定された振る舞いに基づき、検証対象プログラム中に振る舞いに関連したコードを埋め込み、振る舞いに関連したコードを検証するための検証用モデルを作成する。また、検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証する。
【００１７】
本発明の検証機能実行用プログラムは、プログラム記憶手段に、検証対象のプログラムを保持するステップと、表明記憶手段に、検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義を含む表明を保持するステップと、表明、及び、ユーザにより指定された振る舞いに基づき、検証対象プログラム中に振る舞いに関連したコードを埋め込み、振る舞いに関連したコードを検証するための検証用モデルを作成するステップと、検証用モデルを用いて検証を行い、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合において、検証対象プログラムの特定の振る舞いに関連したコードについて部分的に検証するステップとをコンピュータに実行させるためのプログラムである。
【発明の効果】
【００１８】
非決定的な振る舞いをする外部関数の戻り値・副作用により振る舞いが決まるプログラムに対して、振る舞い毎にプログラムの振舞いを明確に定義し、振る舞い毎の部分的な検証をすることができる。
【図面の簡単な説明】
【００１９】
【図１】第１の検証対象プログラムの例を示す図である。
【図２】第１の検証対象プログラムに対する表明の例を示す図である。
【図３】第２の検証対象プログラムの例を示す図である。
【図４】第２の検証対象プログラムに対する表明の例を示す図である。
【図５】本発明の第１実施形態におけるプログラム検証装置の構成例を示すブロック図である。
【図６】中央処理装置が行う動作を示すフローチャートである。
【図７】検証用モデル作成部が行う動作を示すフローチャートである。
【図８】実施例に用いるＣ言語プログラムの例を示す図である。
【図９】本発明の第２実施形態におけるプログラム検証装置の構成例を示すブロック図である。
【図１０】本発明の第３実施形態におけるプログラム検証装置の構成例を示すブロック図である。
【発明を実施するための形態】
【００２０】
＜概説＞
本発明では、ユーザがプログラムのコード内に挿入した振る舞いを表すタグに注目して部分検証用モデルを作成する。具体的には、プログラム中の分岐文で分岐する先のブロックに対し振る舞いを表すタグを埋め込む。また、検証時に検証の対象とする振る舞いを指定し、ブロックに埋め込まれたタグと指定された振る舞いから検証すべきブロックを通過するための変数・式の値の範囲を特定する。そして、特定された範囲を検証範囲とすることで、特定の振る舞いに関連したコードのみについて部分的に検証する。なお、検証範囲は、検証に、プログラムの任意時点で取りうる変数・式の値の範囲である。
【００２１】
例えば、図３に示す関数「ｆ」に対する表明は、図４のようになる。図３に示す関数「ｆ」に対しては、表明の作成にあわせて１７行目のｉｆ文の分岐する先のｉｆ節、及びｅｌｓｅ節の各ブロックに対して、振る舞いに対応したタグを埋め込む（図４の２９行と３２行）。振る舞い「ｒｅａｄ＿ｆｒｏｍ＿ｅｘｔ」に関連したコードのみを部分的に検証する場合には、ｉｆ文のある２８行時点で、ｉｆ文の分岐する先のブロックのうち「ｒｅａｄ＿ｆｒｏｍ＿ｅｘｔ」のタグが埋め込まれているｅｌｓｅ節のブロック（図４の３２−３５行目）を通過するための条件「ｅｘｔ＿ｉｎｉｔ（）」が偽になる変数・式の範囲（この場合は関数「ｅｘｔ＿ｉｎｉｔ」の戻り値が０）を検証範囲として検証する。
【００２２】
＜第１実施形態＞
以下に、本発明の第１実施形態について添付図面を参照して説明する。
図５は、本発明のプログラム検証装置の構成例を示す図である。
本発明のプログラム検証装置は、二次記憶装置１１と、中央処理装置１２と、入力装置１３と、出力装置１４を備える。
【００２３】
二次記憶装置１１の例として、メモリ等の半導体記憶装置、ハードディスク等の外部記憶装置（ストレージ）、又は、記憶媒体（メディア）等が考えられる。また、二次記憶装置１１は、プログラム検証装置の本体に内蔵された記憶装置に限らず、周辺機器（外付けＨＤＤ等）や外部のサーバ（ストレージサーバ等）に設置された記憶装置、或いは、ＮＡＳ（Ｎｅｔｗｏｒｋ  Ａｔｔａｃｈｅｄ  Ｓｔｏｒａｇｅ）でも良い。但し、実際には、これらの例に限定されない。
【００２４】
中央処理装置１２の例として、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やマイクロプロセッサ（ｍｉｃｒｏｐｒｏｃｅｓｓｏｒ）等の処理装置、又は同様の機能を有する半導体集積回路（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ（ＩＣ））等が考えられる。但し、実際には、これらの例に限定されない。
【００２５】
入力装置１３の例として、キーボードやキーパッド、画面上のキーパッド、タッチパネル（ｔｏｕｃｈ  ｐａｎｅｌ）、タブレット（ｔａｂｌｅｔ）、又は、ＱＲコード（登録商標）やＩＣチップ、記憶媒体（メディア）等の読取装置等が考えられる。或いは、入力装置１３は、外部の入力装置や記憶装置から情報を取得するためのインターフェース（Ｉ／Ｆ：ｉｎｔｅｒｆａｃｅ）でも良い。すなわち、入力装置１３は、他の記憶装置でも良い。但し、実際には、これらの例に限定されない。
【００２６】
出力装置１４の例として、ＬＣＤ（液晶ディスプレイ）やＰＤＰ（プラズマディスプレイ）、有機ＥＬディスプレイ（ｏｒｇａｎｉｃ  ｅｌｅｃｔｒｏｌｕｍｉｎｅｓｃｅｎｃｅ  ｄｉｓｐｌａｙ）等の表示装置、又は、表示内容を壁やスクリーンに投影するプロジェクタ等の映写装置、表示内容を用紙等に印刷するプリンタ等の印刷装置等が考えられる。或いは、出力装置１４は、外部の表示装置や記憶装置に情報を出力するためのインターフェース（Ｉ／Ｆ：ｉｎｔｅｒｆａｃｅ）でも良い。すなわち、出力装置１４は、何らかの出力装置であれば良い。但し、実際には、これらの例に限定されない。
【００２７】
二次記憶装置１１は、プログラム記憶部１１１と、表明記憶部１１２を備える。
【００２８】
プログラム記憶部１１１は、検証対象のプログラムを記憶している。
【００２９】
表明記憶部１１２は、検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義（事前条件、事後条件）を含む表明を記憶している。
【００３０】
中央処理装置１２は、プログラム入力部１２１と、表明入力部１２２と、動作モード入力部１２３と、検証用モデル作成部１２４と、検証部１２５を備える。
【００３１】
プログラム入力部１２１は、ユーザ操作あるいは自動処理設定等に応じて、入力装置１３から検証対象のプログラムを読み取り、二次記憶装置１１のプログラム記憶部１１１に格納する。
【００３２】
表明入力部１２２は、入力装置１３からユーザが定義した表明を読み取り、二次記憶装置１１の表明記憶部１１２に格納する。
【００３３】
動作モード入力部１２３は、入力装置１３から振る舞いを読み取り、検証用モデル作成部１２４に振る舞いを出力する。
【００３４】
検証用モデル作成部１２４は、プログラム記憶部１１１から検証対象プログラムを読み取り、表明記憶部１１２から表明を読み取る。検証用モデル作成部１２４は、読み取られた検証対象プログラム及び表明と、動作モード入力部１２３から入力された振る舞いに基づき、該振る舞いに関連したコードのみを検証するための検証用モデルを作成し、検証部１２５に検証用モデルを出力する。
【００３５】
検証部１２５は、検証用モデル作成部１２４から入力された検証用モデルを用いて検証を行い、出力装置１４に検証結果を出力する。
【００３６】
図６のフローチャートを用いて、中央処理装置１２が行う動作を説明する。
【００３７】
（１）ステップＳＴ１０１
プログラム入力部１２１は、入力装置１３から検証対象のプログラムを読み取り、二次記憶装置１１のプログラム記憶１３１に格納する。
【００３８】
（２）ステップＳＴ１０２
表明入力部１２２は、入力装置１３からユーザが定義した表明を読み取り、二次記憶装置１１の表明記憶部１１２に格納する。
【００３９】
（３）ステップＳＴ１０３
動作モード入力部１２３は、入力装置１３から検証対象の振る舞い「ｂｔ」を読み取り検証用モデル作成部１２４に出力する。
【００４０】
（４）ステップＳＴ１０４
検査用モデル作成部１２４は、動作モード入力部１２３から振る舞い「ｂｔ」を受け取ると、プログラム記憶部１１１から検証対象プログラムを読み取り、表明記憶部１１２から検証対象プログラムの表明を読み取り、振る舞い「ｂｔ」に合わせた部分検証用モデルを作成し、検証部１２５に出力する。
【００４１】
（５）ステップＳＴ１０５
検証部１２５は、検証用モデル作成部１２４から検証用モデルを受け取ると、該検証用モデルを用いて検証を行う。
【００４２】
（６）ステップＳＴ１０６
検証部１２５は、検証結果を出力装置１４に出力し、終了する。
【００４３】
次に、図７のフローチャートを用いて、検証用モデル作成部１２４が行う動作を説明する。すなわち、図７のフローチャートは、ステップＳＴ１０４の詳細を示す。
【００４４】
（１）ステップＳＴ２０１
検査用モデル作成部１２４は、動作モード入力部１２３から振る舞い「ｂｔ」を受け取ると、プログラム記憶部１１１から検証対象プログラムを読み取る。
【００４５】
（２）ステップＳＴ２０２
検査用モデル作成部１２４は、表明記憶部１１２から検証対象プログラムの表明を読み取る。
【００４６】
（３）ステップＳＴ２０３
検査用モデル作成部１２４は、読み取った表明中から振る舞い「ｂｔ」に対応したインタフェース条件の定義を探し出し、該定義中の事前条件に合わせた初期値を検証用モデルに追加する。
【００４７】
（４）ステップＳＴ２０４
検査用モデル作成部１２４は、読み取ったプログラムの最初の文を「ｓｔｍｔ（Ｓｔａｔｅｍｅｎｔ：命令文）」とする。
【００４８】
（５）ステップＳＴ２０５
検査用モデル作成部１２４は、「ｓｔｍｔ」が分岐文かどうか判断する。
【００４９】
（６）ステップＳＴ２０６
検査用モデル作成部１２４は、「ｓｔｍｔ」が分岐文の場合、分岐先ブロックのいずれかに振る舞いを表すタグがあるかどうか調べる。
【００５０】
（７）ステップＳＴ２０７
検査用モデル作成部１２４は、分岐先ブロックのいずれかに振る舞いを表すタグがある場合、検証対象として指定された振る舞い「ｂｔ」と同じタグがあるかどうか調べる。
【００５１】
（８）ステップＳＴ２０８
検査用モデル作成部１２４は、検証対象として指定された振る舞い「ｂｔ」と同じタグがある場合、振る舞い「ｂｔ」と同じタグがある分岐先ブロックのみを通過する変数・式の値の制約を検証用モデルに追加する。
【００５２】
（９）ステップＳＴ２０９
検査用モデル作成部１２４は、検証対象として指定された振る舞い「ｂｔ」と同じタグがない場合、振る舞い「ｂｔ」と同じタグがある分岐先ブロックを通過しない変数・式の値の制約を検証用モデルに追加する。
【００５３】
（１０）ステップＳＴ２１０
検査用モデル作成部１２４は、「ｓｔｍｔ」の内容に関係なく、「ｓｔｍｔ」を検証用モデルに追加する。
【００５４】
（１１）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００５５】
（１２）ステップＳＴ２１２
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文でなければ、次の文を「ｓｔｍｔ」とし、その「ｓｔｍｔ」が分岐文かどうか判断し、同様の処理を繰り返す。
【００５６】
（１３）ステップＳＴ２１３
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であれば、検証用モデルを検証部１２５に出力し、終了する。
【００５７】
＜第１実施形態における実施例＞
次に、図８に示すＣ言語プログラムを例に、図６及び図７のフローチャートを参照し、実際のデータを用いて詳細に説明する。
【００５８】
ここでは、図８に示すＣ言語プログラムの関数「ｇ」に対して、振る舞い「ｐ＿ｃｈａｎｇｅｄ」に関連したコードを対象とし、プログラム終了後に事後条件が成立するかどうかを検証することとする。
【００５９】
（１）ステップＳＴ１０１
プログラム入力部１２１は、入力装置１３から、図８に示すＣ言語プログラム（図８の１２〜３１行目）を読み取り、二次記憶装置１１のプログラム記憶１３１に格納する。
【００６０】
（２）ステップＳＴ１０２
表明入力部１２２は、入力装置１３から表明（図８の１〜１１行目）を読み取り、二次記憶装置１１の表明記憶部１１２に格納する。
【００６１】
（３）ステップＳＴ１０３
次に、動作モード入力部１２３は、入力装置１３から検証対象の振る舞いとして「ｐ＿ｃｈａｎｇｅｄ」を読み取り、読み取られた「ｐ＿ｃｈａｎｇｅｄ」を振る舞い「ｂｔ」として、検証用モデル作成部１２４に出力する。
【００６２】
（４）ステップＳＴ１０４
検査用モデル作成部１２４は、動作モード入力部１２３から振る舞い「ｂｔ」として「ｐ＿ｃｈａｎｇｅｄ」を受け取ると、振る舞い「ｂｔ」に合わせた部分検証用モデルの作成処理として、以下の処理を行なう。
【００６３】
（５）ステップＳＴ２０１
検査用モデル作成部１２４は、動作モード入力部１２３から振る舞い「ｂｔ」を受け取ると、プログラム記憶部１１１から検証対象プログラムを読み取る。
【００６４】
（６）ステップＳＴ２０２
検査用モデル作成部１２４は、表明記憶部１１２から検証対象プログラムの表明を読み取る。
【００６５】
（７）ステップＳＴ２０３
次に、検査用モデル作成部１２４は、読み取った表明中から振る舞い「ｂｔ」に対応したインタフェース条件の定義を探しだすと、該表明中の振る舞い「ｐ＿ｃｈａｎｇｅｄ」の定義は３〜５行目になる。ところが、ここの定義には事前条件が存在しないので、全振る舞い共通の（振る舞い定義の前にある）１〜２行目の事前条件のみが振る舞い「ｐ＿ｃｈａｎｇｅｄ」の事前条件となり、ポインタ引数「ｐ」、「ｑ」が有効となるような初期値を検証用モデルに追加する。
【００６６】
（８）ステップＳＴ２０４
次に、検査用モデル作成部１２４は、読み取ったプログラム（図８の１２〜３１行目）の最初の文である１２行目を「ｓｔｍｔ」する。
【００６７】
（９）ステップＳＴ２０５
検査用モデル作成部１２４は、「ｓｔｍｔ」（１２行目）が分岐文かどうか判断する。
【００６８】
（１０）ステップＳＴ２１０
検査用モデル作成部１２４は、「ｓｔｍｔ」は分岐文ではないので、「ｓｔｍｔ」を検証用モデルに追加する。
【００６９】
（１１）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００７０】
（１２）ステップＳＴ２１２
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文ではないので、次の１３行目を「ｓｔｍｔ］とする。ここでは、検査用モデル作成部１２４は、１３行目も分岐文ではないので同様の処理を繰り返し、次の１４行目を「ｓｔｍｔ」とする。
【００７１】
（１３）ステップＳＴ２０５
検査用モデル作成部１２４は、「ｓｔｍｔ」（１４行目）が分岐文かどうか判断する。
【００７２】
（１４）ステップＳＴ２０６
検査用モデル作成部１２４は、１４行目は分岐文なので、分岐先のブロックに振る舞いを表すタグがあるかどうか調べる。
【００７３】
（１５）ステップＳＴ２０７
検査用モデル作成部１２４は、１４行目のｉｆ文の分岐先ブロックは１５〜１６行目のｉｆ節だけであり、１５行目は振る舞いを表すタグを含むので、検証対象として指定された振る舞い「ｐ＿ｃｈａｎｇｅｄ」と同じタグがあるかどうか調べる。
【００７４】
（１６）ステップＳＴ２０９
検査用モデル作成部１２４は、１５行目のタグは「ｐ＿ｃｈａｎｇｅｄ」とは違うので、１５〜１６行目のｉｆ節ブロックを通過しないよう、１４行目の時点で「！ｅｘｔ＿ｉｓ＿ｖａｌｉｄ（）」が偽になる制約を検証用モデルに追加する。
【００７５】
（１７）ステップＳＴ２１０
その後、検査用モデル作成部１２４は、「ｓｔｍｔ」を検証用モデルに追加する。
【００７６】
（１８）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００７７】
（１９）ステップＳＴ２１２
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文ではないので、次の１５行目を「ｓｔｍｔ」とする。検査用モデル作成部１２４は、同様の処理を繰り返し、１９行目のｉｆ文を「ｓｔｍｔ」とする。
【００７８】
（２０）ステップＳＴ２０５
検査用モデル作成部１２４は、１９行目のｉｆ文が「ｓｔｍｔ」となった場合、「ｓｔｍｔ」（１９行目）が分岐文かどうか判断する。
【００７９】
（２１）ステップＳＴ２０６
検査用モデル作成部１２４は、１９行目は分岐文なので、分岐先のブロックに振る舞いを表すタグがあるかどうか調べる。
【００８０】
（２２）ステップＳＴ２０７
検査用モデル作成部１２４は、１９行目のｉｆ文の分岐先ブロックは２０〜２１行目のｉｆ節と２３〜２４行目のｅｌｓｅ節であり、２０、２３行目は振る舞いを表すタグを含むので、検証対象として指定された振る舞い「ｐ＿ｃｈａｎｇｅｄ」と同じタグがあるかどうか調べる。
【００８１】
（２３）ステップＳＴ２０９
検査用モデル作成部１２４は、２０行目のタグは「ｐ＿ｃｈａｎｇｅｄ」と同じであり、２３行目のタグは違うので、２０〜２１行目のｉｆ節ブロックを通過し２３〜２４行目のｅｌｓｅ節ブロックを通過しないよう、１９行目の時点で「ｎ＞０」が真になる制約を検証用モデルに追加する。
【００８２】
（２４）ステップＳＴ２１０
その後、検査用モデル作成部１２４は、「ｓｔｍｔ」を検証用モデルに追加する。
【００８３】
（２５）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００８４】
（２６）ステップＳＴ２１２
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文ではないので、次の２０行目を「ｓｔｍｔ」とする。検査用モデル作成部１２４は、同様の処理を繰り返し、２６行目のｉｆ文を「ｓｔｍｔ」とする。
【００８５】
（２７）ステップＳＴ２０５
検査用モデル作成部１２４は、２６行目のｉｆ文が「ｓｔｍｔ」となった場合、「ｓｔｍｔ」（２６行目）が分岐文かどうか判断する。
【００８６】
（２８）ステップＳＴ２０６
検査用モデル作成部１２４は、２６行目は分岐文なので、分岐先のブロックに振る舞いを表すタグがあるかどうか調べる。
【００８７】
（２９）ステップＳＴ２１０
その後、検査用モデル作成部１２４は、２６行目のｉｆ文の分岐先ブロックは２７行目のｉｆ節と２９行目のｅｌｓｅ節であり、いずれも振る舞いを表すタグを含まないので、そのまま「ｓｔｍｔ」を検証用モデルに追加する。
【００８８】
（３０）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００８９】
（３１）ステップＳＴ２１２
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文ではないので、次の２７行目を「ｓｔｍｔ」とする。検査用モデル作成部１２４は、同様の処理を繰り返し、３１行目のｉｆ文を「ｓｔｍｔ」とする。
【００９０】
（３２）ステップＳＴ２０５
検査用モデル作成部１２４は、３１行目のｉｆ文が「ｓｔｍｔ」となった場合、「ｓｔｍｔ」（３１行目）が分岐文かどうか判断する。
【００９１】
（３３）ステップＳＴ２０６
検査用モデル作成部１２４は、３１行目は分岐文なので、分岐先のブロックに振る舞いを表すタグがあるかどうか調べる。
【００９２】
（３４）ステップＳＴ２１０
その後、検査用モデル作成部１２４は、３１行目のｉｆ文の分岐先ブロックは２７行目のｉｆ節と２９行目のｅｌｓｅ節であり、いずれも振る舞いを表すタグを含まないので、そのまま「ｓｔｍｔ」を検証用モデルに追加する。
【００９３】
（３５）ステップＳＴ２１１
検査用モデル作成部１２４は、「ｓｔｍｔ」がプログラムの終わりの文であるか確認する。
【００９４】
（３６）ステップＳＴ２１３
検査用モデル作成部１２４は、３１行目はプログラムの終わりの文になるので、検証用モデルを検証部１２５に出力する。
【００９５】
（３７）ステップＳＴ１０５
検証部１２５は、検証用モデル作成部１２４から検証用モデルを受け取ると、該検証用モデルを用いて検証を行う。
【００９６】
該検証用モデルは、前述の検証用モデル作成部１２４の処理で１５〜１６行目のｉｆ節ブロック、２３〜２４行目のｅｌｓｅ節ブロックを通過せず他の部分を実行するようになっているので、２１行目で「＊ｐ」の値は「ｎ」の値と等しく、「ｎ」は正値であり、「＊ｐ」、「＊ｑ」の値によらず２７行目もしくは２９行目で戻り値が０以上になるので、振る舞い「ｐ＿ｃｈａｎｇｅｄ」の事後条件「＊ｐ＞０」、「￥ｒｅｔｕｒｎ＞＝０」はどちらも成立する。
【００９７】
（３８）ステップＳＴ１０６
検証部１２５は、この検証結果を出力装置１４に出力し、終了する。
【００９８】
本発明の第１の効果は、非決定的な振る舞いをする外部関数の戻り値・副作用により振る舞いが決まるプログラムに対して、振る舞い毎のプログラムのインタフェース条件を明確に定義できることにある。その理由は、プログラム中の分岐文に対応した分岐先ブロックに対してタグを埋め込むことにより、非決定的な振る舞いをする外部関数の戻り値・副作用に依存した分岐に対して、振る舞いを対応付けられるためである。
【００９９】
また、本発明の第２の効果は、非決定的な振る舞いをする外部関数の戻り値・副作用により振る舞いが決まるプログラムに対して、振る舞い毎の部分的な検証ができることにある。その理由は、上記の第１の効果により、振る舞い毎にプログラムの振舞いを明確に定義できるためである。
【０１００】
＜第２実施形態＞
以下に、本発明の第２実施形態について説明する。
図５に示す第１実施形態のプログラム検証装置の構成において、入力装置１３、プログラム入力部１２１、表明入力部１２２、動作モード入力部１２３が無くても良い。その場合、検証対象プログラム、表明、検証対象の振る舞いは二次記憶装置１１に事前に格納されており（例えば、二次記憶装置１２がリポジトリとして使われている等）、二次記憶装置１１から直接読み取られる。
【０１０１】
図９は、本実施形態におけるプログラム検証装置の構成例を示す図である。
本発明のプログラム検証装置は、二次記憶装置１１と、中央処理装置１２と、出力装置１４を備える。
【０１０２】
二次記憶装置１１は、プログラム記憶部１１１と、表明記憶部１１２と、振る舞い記憶部１１３を備える。
【０１０３】
プログラム記憶部１１１は、予め（事前に）検証対象のプログラムを記憶している。
【０１０４】
表明記憶部１１２は、予め検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義（事前条件、事後条件）を含む表明を記憶している。
【０１０５】
振る舞い記憶部１１３は、予めユーザが検証対象のプログラムのコード内に挿入した振る舞いを記憶している。これにより、入力装置１３から振る舞いを読み取る必要が無くなるため、入力装置１３、プログラム入力部１２１、表明入力部１２２、動作モード入力部１２３が不要となる。
【０１０６】
中央処理装置１２は、検証用モデル作成部１２４と、検証部１２５を備える。
【０１０７】
検証用モデル作成部１２４は、プログラム記憶部１１１から検証対象プログラムを読み取り、表明記憶部１１２から表明を読み取り、振る舞い記憶部１１３から振る舞いを読み取る。検証用モデル作成部１２４は、読み取られた検証対象プログラム、表明、及び振る舞いに基づき、該振る舞いに関連したコードのみを検証するための検証用モデルを作成し、検証部１２５に検証用モデルを出力する。
【０１０８】
検証部１２５は、検証用モデル作成部１２４から入力された検証用モデルを用いて検証を行い、出力装置１４に検証結果を出力する。
【０１０９】
＜第３実施形態＞
以下に、本発明の第３実施形態について説明する。
図５に示す第１実施形態のプログラム検証装置の構成において、検証用モデル作成部１２４が検証部１２５と分離しておらず、統合されていても良い。ここでは、検証用モデル作成部１２４及び検証部１２５が統合されたものを、「検証実行部」と呼ぶ。その場合、図６のフローチャートのステップＳＴ１０３、ＳＴ１０４、ＳＴ１０５、ＳＴ１０６、及び図７のフローチャートの全ステップは全て、統合された検証実行部が行うことになる。その際、検証モデル作成と検証が同時に行われても良い。
【０１１０】
図１０は、本実施形態におけるプログラム検証装置の構成例を示す図である。
本発明のプログラム検証装置は、二次記憶装置１１と、中央処理装置１２と、入力装置１３と、出力装置１４を備える。
【０１１１】
二次記憶装置１１は、プログラム記憶部１１１と、表明記憶部１１２を備える。
【０１１２】
プログラム記憶部１１１は、検証対象のプログラムを記憶している。
【０１１３】
表明記憶部１１２は、検証対象プログラムの振る舞いと振る舞い毎のインタフェース条件定義（事前条件、事後条件）を含む表明を記憶している。
【０１１４】
中央処理装置１２は、プログラム入力部１２１と、表明入力部１２２と、動作モード入力部１２３と、検証実行部１２６を備える。
【０１１５】
プログラム入力部１２１は、入力装置１３から検証対象のプログラムを読み取り、二次記憶装置１１のプログラム記憶部１１１に格納する。
【０１１６】
表明入力部１２２は、入力装置１３からユーザが定義した表明を読み取り、二次記憶装置１１の表明記憶部１１２に格納する。
【０１１７】
動作モード入力部１２３は、入力装置１３から振る舞いを読み取り、検証用モデル作成部１２４に振る舞いを出力する。
【０１１８】
検証実行部１２６は、検証用モデル作成部１２４と検証部１２５を統合したものである。すなわち、検証実行部１２６は、検証用モデル作成部１２４と検証部１２５の両方の機能を有する単一の装置又は回路である。あるいは、検証実行部１２６は、検証用モデル作成部１２４と検証部１２５の両方の機能をコンピュータに実行させるためのプログラムである。検証実行部１２６は、プログラム記憶部１１１から検証対象プログラムを読み取り、表明記憶部１１２から表明を読み取る。検証実行部１２６は、読み取られた検証対象プログラム及び表明と、動作モード入力部１２３から入力された振る舞いに基づき、該振る舞いに関連したコードのみを検証するための検証用モデルを作成し、作成された検証用モデルを用いて検証を行い、出力装置１４に検証結果を出力する。
【０１１９】
また、本実施形態においても、第２実施形態と同じく、入力装置１３、プログラム入力部１２１、表明入力部１２２、動作モード入力部１２３が無くても良い。
【０１２０】
なお、上記の各実施形態は、組み合わせて実施することも可能である。
【０１２１】
以上のように、本発明は、プログラムと表明を入力としたプログラムの検証において、呼び出し時点での動作コンテキストでは決定されない振る舞い（非決定的な振る舞い）をする外部関数の呼び出しがある場合においても、検証対象プログラムの特定の振る舞いに関連したコードのみについて部分的に検証することを可能にする。
【０１２２】
本発明は、非決定的な振る舞いをする外部関数を呼び出すプログラムに対する、振る舞い毎の部分検証に適用できる。
【０１２３】
以上、本発明の実施形態を詳述してきたが、実際には、上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
【符号の説明】
【０１２４】
１１…  二次記憶装置
１１１…  プログラム記憶部
１１２…  表明記憶部
１１３…  振る舞い記憶部
１２…  中央処理装置
１２１…  プログラム入力部
１２２…  表明入力部
１２３…  動作モード入力部
１２４…  検証用モデル作成部
１２５…  検証部
１２６…  検証実行部
１３…  入力装置
１４…  出力装置
【図１】
2010204954.tif 000003
【図２】
2010204954.tif 000004
【図３】
2010204954.tif 000005
【図４】
2010204954.tif 000006
【図５】
2010204954.tif 000007
【図６】
2010204954.tif 000008
【図７】
2010204954.tif 000009
【図８】
2010204954.tif 000010
【図９】
2010204954.tif 000011
【図１０】
2010204954.tif 000012