(57)【特許請求の範囲】
【請求項１】
第１関数と第２関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第１関数と前記第２関数との等価性を検査する検査部を備え、
前記第１関数は、第１プログラムに含まれ、前記第１プログラムにおいて複数回実行され、前記第１関数の実行の度に値が変わる第１状態変数を使用し、前記第１状態変数の値に対応する値を出力し、
前記第２関数は、第２プログラムに含まれ、前記第２プログラムにおいて複数回実行され、前記第２関数の実行の度に値が変わる第２状態変数を使用し、前記第２状態変数の値に対応する値を出力する
等価性検証装置。
【請求項２】
前記検査部は、前記第１関数と前記第２関数とが呼び出された回数毎に前記第１関数と前記第２関数との等価性を判定する
請求項１に記載の等価性検証装置。
【請求項３】
前記検査部は、前記第１関数と前記第２関数とが呼び出された回数毎の判定結果に基づいて、前記第１関数と前記第２関数とが不等価となるときの呼び出し回数を特定する
請求項２に記載の等価性検証装置。
【請求項４】
前記ループ文を記述することによって前記検査ラッパーを生成する生成部を備える
請求項１から請求項３のいずれか１項に記載の等価性検証装置。
【請求項５】
前記生成部は、さらに、前記第１状態変数と前記第２状態変数とを初期化するための初期化文を前記ループ文より前に実行される文として前記検査ラッパーに記述する
請求項４に記載の等価性検証装置。
【請求項６】
前記初期化文は、前記第１状態変数を初期化する第１初期化関数と前記第２状態変数を初期化する第２初期化関数とを呼び出す文である
請求項５に記載の等価性検証装置。
【請求項７】
前記生成部は、さらに、前記第１初期化関数と前記第２初期化関数とを参照するための宣言文を含んだ検査ヘッダをインクルードするためのインクルード文を前記検査ラッパーに記述する
請求項６に記載の等価性検証装置。
【請求項８】
前記生成部は、さらに、前記第１関数と前記第２関数との入力値同士が等しいという事前条件を定義する事前条件文と、前記第１関数と前記第２関数との出力値同士が等しいという事後条件を定義する事後条件文とを前記検査ラッパーに記述する
請求項４から請求項７のいずれか１項に記載の等価性検証装置。
【請求項９】
前記生成部は、さらに、前記第１関数と前記第２関数とを呼び出す回数を定義する定義文を前記検査ラッパーに記述する
請求項４から請求項８のいずれか１項に記載の等価性検証装置。
【請求項１０】
前記等価性検証装置は、
前記第１状態変数の値が初期値に戻るときの前記第１関数の呼び出し回数である第１巡回数と、前記第２状態変数の値が初期値に戻るときの前記第２関数の呼び出し回数である第２巡回数とを求め、前記第１関数と前記第２関数とを前記検査ラッパーによって呼び出す回数を前記第１巡回数と前記第２巡回数とに基づいて決定する解析部を備え、
前記生成部は、決定された回数を定義する文を前記定義文として前記検査ラッパーに記述する
請求項９に記載の等価性検証装置。
【請求項１１】
前記解析部は、前記第１関数を繰り返し呼び出すための第１ループ文を含んだプログラムコードである第１解析ラッパーを用いて等価性検査を行うことによって前記第１巡回数を求め、前記第２関数を繰り返し呼び出すための第２ループ文を含んだプログラムコードである第２解析ラッパーを用いて等価性検査を行うことによって前記第２巡回数を求める
請求項１０に記載の等価性検証装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、関数同士の等価性を検査するための技術に関するものである。
【背景技術】
【０００２】
多機能化および付加価値の向上に応えるための制御機能の電子化により、制御装置に搭載される制御プログラムの大規模化および複雑化が急速に進んでいる。さらに、派生機種または仕向け地の違いにより、制御プログラムのバリエーションが、今後急増していくことが見込まれる。
このような状況下で収益力を維持または強化するには、制御プログラムの開発において、生産性の向上に取り組む必要がある。具体的な施策としては、通信処理、タイマ処理、スケジューラ、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）およびミドルウェアなどのプログラムの実行環境を導入することによって、プログラム開発を差分開発または派生開発へ移行することが考えられる。また、差分開発および派生開発の運用において、プログラムの品質確保および作業の効率化を実現するためのプログラム開発手法およびプログラム開発ツールをプログラム開発に適用することが考えられる。【０００３】
特許文献１および特許文献２は、プログラムの品質確保を目的とした検証技術を開示している。
特許文献１の技術では、プログラムの入力値列とプログラムの内部状態値列とプログラムの出力値列とソフトウェアの要件を記述した検査条件とが、充足可能性問題の制約条件として記述される。そして、プログラムが制約条件に違反しているか、充足可能性判定ツールで検査される。
特許文献２の技術では、内部状態値列の遷移が、定義された状態遷移と同じになるかを検証することによって、プログラムが検査される。【０００４】
非特許文献１は、等価性検査という技術を開示している。
等価性検査は、二つのプログラムの間で論理的に演算内容が同じかどうかを関数単位で判定する技術である。
具体的には、一方のプログラムの関数に対する入力値列が他方のプログラムの関数に対する入力値列と等しいという条件のもと、それぞれの関数の出力値列が互いに一致するかどうか、充足可能性判定ツールまたはモデル検査ツールを利用して判定される。それぞれの関数の出力値列が互いに一致する場合、関数同士が等価であると判定される。【０００５】
等価性検証は、一つのプログラムに対する検証ではなく、二つのプログラムに対する検証である。
例えば、新たな実行環境への移行の前後またはバージョンの変更の前後における二つのプログラムの間で、演算内容が論理的に変更されていない同等部分と演算内容が論理的に変更された差異部分とを特定するために、等価性検証が行われる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１６−５７９６９号公報
【特許文献２】特開平４−２３６６３６号公報
【非特許文献】
【０００７】
【非特許文献１】Ｒｕｐａｋ  Ｍａｊｕｍｄａｒ，  “Ｃｏｍｐｏｓｉｔｉｏｎａｌ  Ｅｑｕｉｖａｌｅｎｃｅ  Ｃｈｅｃｋｉｎｇ  ｆｏｒ  Ｍｏｄｅｌｓ  ａｎｄ  Ｃｏｄｅ  ｏｆ  Ｃｏｎｔｒｏｌ  Ｓｙｓｔｅｍｓ，”  ５２ｎｄ  ＩＥＥＥ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｄｅｃｉｓｉｏｎ  ａｎｄ  Ｃｏｎｔｒｏｌ，  Ｄｅｃｅｍｂｅｒ  ２０１３．
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従来の等価性検査では、検査対象の関数同士の入力値列および出力値列が制約条件として網羅的に解析される。
しかし、従来の等価性検証は、関数内で前のステップから次のステップへ引き継がれる内部状態値列を考慮していない。
例えば、同じ入力値列に対して常に同じ出力値列を返す関数の場合、内部状態値列は無いため、従来の等価性検査によって関数の等価性を正しく検査することができる。しかし、ステップごとに遷移する内部状態値列に依存して出力値列が決まる関数の場合、内部状態値列が有るため、従来の等価性検査によって関数同士の等価性を正しく検査することができない。ステップは、関数を呼び出して実行する工程である。【０００９】
本発明は、ステップごとに遷移する内部状態値列に依存して出力値が決まる関数同士の等価性を正しく検査できるようにすることを目的とする。
【課題を解決するための手段】
【００１０】
本発明の等価性検証装置は、第１関数と第２関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第１関数と前記第２関数との等価性を検査する検査部を備える。
【発明の効果】
【００１１】
本発明によれば、第１関数と第２関数とを繰り返し呼び出しながら第１関数と第２関数との等価性を検査することができる。そのため、ステップごとに遷移する内部状態値列に依存して出力値が決まる関数同士の等価性を正しく検査することが可能となる。
【図面の簡単な説明】
【００１２】
【図１】実施の形態１における等価性検証装置１００の構成図。
【図２】実施の形態１における第１プログラム２１０を示す図。
【図３】実施の形態１における第２プログラム２２０を示す図。
【図４】実施の形態１におけるステップを説明するための図。
【図５】実施の形態１における対象情報２３０を示す図。
【図６】実施の形態１における入力値列と出力値列とを説明するための図。
【図７】実施の形態１におけるプログラムコードの関係図。
【図８】実施の形態１における等価性検証方法のフローチャート。
【図９】実施の形態１における検査ヘッダ２４０を示す図。
【図１０】実施の形態１における検査ラッパー２５０を示す図。
【図１１】実施の形態１における生成処理（Ｓ１１０）のフローチャート。
【図１２】実施の形態１における第１プログラム２１０を示す図。
【図１３】実施の形態１における第２プログラム２２０を示す図。
【図１４】実施の形態１における加工処理（Ｓ１２０）のフローチャート。
【図１５】実施の形態１における関数名の関係図。
【図１６】実施の形態１における検査処理（Ｓ１３０）のフローチャート。
【図１７】実施の形態１における実行結果２６０を示す図。
【図１８】実施の形態１における実行結果２６１を示す図。
【図１９】実施の形態２における等価性検証装置１００の構成図。
【図２０】実施の形態２における対象情報２３１を示す図。
【図２１】実施の形態２におけるプログラムコードの関係図。
【図２２】実施の形態２における等価性検証方法のフローチャート。
【図２３】実施の形態２における解析処理（Ｓ２１０）のフローチャート。
【図２４】実施の形態２における第１解析ラッパー２７０を示す図。
【図２５】実施の形態２における第２解析ラッパー２８０を示す図。
【図２６】実施の形態２における生成処理（Ｓ２１１）のフローチャート。
【図２７】実施の形態２における加工処理（Ｓ２１２）のフローチャート。
【図２８】実施の形態２における実行結果２６２を示す図。
【図２９】実施の形態２における巡回数決定処理（Ｓ２１４）のフローチャート。
【図３０】実施の形態２における検査ステップ数決定処理（Ｓ２１５）のフローチャート。
【図３１】実施の形態における等価性検証装置１００のハードウェア構成図。
【発明を実施するための形態】
【００１３】
実施の形態および図面において、同じ要素および対応する要素には同じ符号を付している。同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
【００１４】
実施の形態１．
第１関数と第２関数との等価性を検査する形態について、図１から図１８に基づいて説明する。
【００１５】
＊＊＊構成の説明＊＊＊
図１に基づいて、等価性検証装置１００の構成を説明する。
等価性検証装置１００は、プロセッサ９０１とメモリ９０２と補助記憶装置９０３といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
【００１６】
プロセッサ９０１は、演算処理を行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）であり、他のハードウェアを制御する。例えば、プロセッサ９０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、またはＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
メモリ９０２は揮発性の記憶装置である。メモリ９０２は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ９０２はＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。メモリ９０２に記憶されたデータは必要に応じて補助記憶装置９０３に保存される。
補助記憶装置９０３は不揮発性の記憶装置である。例えば、補助記憶装置９０３は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、またはフラッシュメモリである。補助記憶装置９０３に記憶されたデータは必要に応じてメモリ９０２にロードされる。
【００１７】
等価性検証装置１００は、生成部１１０と加工部１２０と検査部１３０といったソフトウェア要素を備える。ソフトウェア要素はソフトウェアで実現される要素である。
【００１８】
補助記憶装置９０３には、生成部１１０と加工部１２０と検査部１３０としてコンピュータを機能させるための等価性検証プログラムが記憶されている。等価性検証プログラムは、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
さらに、補助記憶装置９０３にはＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が記憶されている。ＯＳの少なくとも一部は、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
つまり、プロセッサ９０１は、ＯＳを実行しながら、等価性検証プログラムを実行する。
等価性検証プログラムを実行して得られるデータは、メモリ９０２、補助記憶装置９０３、プロセッサ９０１内のレジスタまたはプロセッサ９０１内のキャッシュメモリといった記憶装置に記憶される。
【００１９】
メモリ９０２はデータを記憶する記憶部１９１として機能する。但し、他の記憶装置が、メモリ９０２の代わりに、又は、メモリ９０２と共に、記憶部１９１として機能してもよい。
【００２０】
等価性検証装置１００は、プロセッサ９０１を代替する複数のプロセッサを備えてもよい。複数のプロセッサは、プロセッサ９０１の役割を分担する。
【００２１】
等価性検証プログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体にコンピュータ読み取り可能に記憶することができる。不揮発性の記憶媒体は、一時的でない有形の媒体である。
【００２２】
図２に基づいて、第１プログラム２１０を説明する。
第１プログラム２１０は、第１プログラムの具体例であり、記憶部１９１に予め記憶される。
第１プログラムは、等価性検査の対象となる２つのプログラムのうちの一方のプログラムである。
【００２３】
第１プログラム２１０は、ｃ言語で記述されたプログラムコードであり、第１関数ｘを含んでいる。
第１関数ｘは、第１関数の具体例である。
第１関数は、等価性検査の対象となる２つの関数のうちの一方の関数である。
【００２４】
第１関数は以下のような特徴を有する。
第１関数は、第１プログラムに含まれる。例えば、第１関数ｘは、第１プログラム２１０に含まれる。
第１関数は、第１プログラムにおいて複数回実行される。例えば、第１関数ｘは、第１プログラム２１０のｍａｉｎ関数において特定の条件が満たされる間、繰り返し実行される。
第１関数は第１状態変数を使用し、第１状態変数の値は第１関数の実行の度に変わる。例えば、第１関数ｘは第１状態変数ｓｔａｔｅ＿ｘを使用し、第１状態変数ｓｔａｔｅ＿ｘの値は第１関数ｘの実行の度に変わる。具体的には、第１状態変数ｓｔａｔｅ＿ｘの初期値は０である。第１状態変数ｓｔａｔｅ＿ｘの値が０である場合に第１関数ｘが実行されると第１状態変数ｓｔａｔｅ＿ｘの値は１に変わる。第１状態変数ｓｔａｔｅ＿ｘの値が１である場合に第１関数ｘが実行されると第１状態変数ｓｔａｔｅ＿ｘの値は２に変わる。第１状態変数ｓｔａｔｅ＿ｘの値が２である場合に第１関数ｘが実行されると第１状態変数ｓｔａｔｅ＿ｘの値は０に変わる。
第１関数は、第１状態変数に対応する値を出力する。例えば、第１関数ｘは、第１状態変数ｓｔａｔｅ＿ｘに対応する値を出力する。具体的には、第１状態変数ｓｔａｔｅ＿ｘの値が０である場合、第１関数ｘの出力値はｉｎ＋１である。第１状態変数ｓｔａｔｅ＿ｘの値が１である場合、第１関数ｘの出力値はｉｎ＋２である。第１状態変数ｓｔａｔｅ＿ｘの値が２である場合、第１関数ｘの出力値はｉｎ＋３である。第１関数におけるｉｎは第１関数ｘの入力値である。
【００２５】
第１プログラム２１０は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔを有する。
第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔは、第１初期化関数の具体例である。
第１初期化関数は、第１状態変数を初期化する関数である。具体的には、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔは、第１状態変数ｓｔａｔｅ＿ｘに初期値０を設定する。
【００２６】
図３に基づいて、第２プログラム２２０を説明する。
第２プログラム２２０は、第２プログラムの具体例であり、記憶部１９１に予め記憶される。
第２プログラムは、等価性検査の対象となる２つのプログラムのうちの他方のプログラムである。
【００２７】
第２プログラム２２０は、ｃ言語で記述されたプログラムコードであり、第２関数ｙを含んでいる。
第２関数ｙは、第２関数の具体例である。
第２関数は、等価性検査の対象となる２つの関数のうちの他方の関数である。
【００２８】
第２関数は以下のような特徴を有する。
第２関数は、第２プログラムに含まれる。例えば、第２関数ｙは、第２プログラム２２０に含まれる。
第２関数は、第２プログラムにおいて複数回実行される。例えば、第２関数ｙは、第２プログラム２２０のｍａｉｎ関数において特定の条件が満たされる間、繰り返し実行される。
第２関数は第２状態変数を使用し、第２状態変数の値は第２関数の実行の度に変わる。例えば、第２関数ｙは第２状態変数ｓｔａｔｅ＿ｙを使用し、第２状態変数ｓｔａｔｅ＿ｙの値は第２関数ｙの実行の度に変わる。具体的には、第２状態変数ｓｔａｔｅ＿ｙの初期値は１である。第２状態変数ｓｔａｔｅ＿ｙの値が１である場合に第２関数ｙが実行されると第２状態変数ｓｔａｔｅ＿ｙの値は２に変わる。第２状態変数ｓｔａｔｅ＿ｙの値が２である場合に第２関数ｙが実行されると第２状態変数ｓｔａｔｅ＿ｙの値は３に変わる。第２状態変数ｓｔａｔｅ＿ｙの値が３である場合に第２関数ｙが実行されると第２状態変数ｓｔａｔｅ＿ｙの値は１に変わる。
第２関数は、第２状態変数に対応する値を出力する。例えば、第２関数ｙは、第２状態変数ｓｔａｔｅ＿ｙに対応する値を出力する。具体的には、第２状態変数ｓｔａｔｅ＿ｙの値が１である場合、第２関数ｙの出力値はｉｎ＋１である。第２状態変数ｓｔａｔｅ＿ｙの値が２である場合、第２関数ｙの出力値はｉｎ＋２である。第２状態変数ｓｔａｔｅ＿ｙの値が３である場合、第２関数ｙの出力値はｉｎ＋３である。第２関数におけるｉｎは第２関数の入力値である。
【００２９】
第２プログラム２２０は、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔを有する。
第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔは、第２初期化関数の具体例である。
第２初期化関数は、第２状態変数を初期化する関数である。具体的には、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔは、第２状態変数ｓｔａｔｅ＿ｙに初期値１を設定する。
【００３０】
図４に基づいて、実施の形態１におけるステップを説明する。
等価性検査の対象となるプログラムを対象プログラムという。具体的には、対象プログラムは第１プログラム２１０および第２プログラム２２０である。
等価性検査の対象となる関数を対象関数という。具体的には、対象関数は第１関数ｘおよび第２関数ｙである。
状態変数の値を状態値という。具体的には、状態値は第１状態変数ｓｔａｔｅ＿ｘの値および第２状態変数ｓｔａｔｅ＿ｙの値である。
ステップは、対象関数を呼び出して実行する工程である。
ステップ数は、対象関数が呼び出される回数、すなわち、対象関数が実行される回数である。
ステップ間において、対象関数の状態値が引き継がれる。つまり、第１ステップが終了したときの状態値が第２ステップで使用され、第２ステップが終了したときの状態値が第３ステップで使用される。入力値および出力値はステップ間で引き継がれない。
【００３１】
図５に基づいて、対象情報２３０を説明する。
対象情報２３０は、記憶部１９１に予め記憶される。
対象情報２３０は、対象関数の入力変数、出力変数および初期化関数を示す。
入力変数は、入力値が設定される変数である。入力値は、関数に入力される値である。
出力変数は、出力値が設定される変数である。出力値は、関数から出力される値である。
【００３２】
具体的には、対象情報２３０は、第１関数ｘの情報である第１入力変数ｉｎ、第１出力変数ｏｕｔおよび第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔを示す。さらに、対象情報２３０は、第２関数ｙの情報である第２入力変数ｉｎ、第２出力変数ｏｕｔおよび第２初期化関数ｓｔｅｔｅ＿ｙ＿ｉｎｉｔを示す。
【００３３】
図６に基づいて、入力値列および出力値列を説明する。
入力値列は、ステップ数と同じ数の入力値であり、対象関数のステップ数毎の入力値から成る。ｉｎ＿ｘ［ｔ］は第１関数ｘの第ｔステップの入力値である。ｉｎ＿ｙ［ｔ］は第２関数ｙの第ｔステップの入力値である。
出力値列は、ステップ数と同じ数の出力値であり、対象関数のステップ数毎の出力値から成る。ｏｕｔ＿ｘ［ｔ］は第１関数ｘの第ｔステップの出力値である。ｏｕｔ＿ｙ［ｔ］は第２関数ｙの第ｔステップの出力値である。
入力値列および出力値列は、記憶部１９１に保存される。
【００３４】
図７に基づいて、第１プログラム２１０と第２プログラム２２０と検査ヘッダ２４０と検査ラッパー２５０との関係を説明する。
検査ヘッダ２４０は、第１関数ｘと第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔと第２関数ｙと第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔとを検査ラッパー２５０から参照するために生成されるヘッダである。検査ヘッダ２４０の詳細については後述する。
検査ラッパー２５０は、第１関数ｘと第２関数ｙとの等価性を検査するために生成される検査ラッパーである。検査ラッパー２５０の詳細については後述する。
【００３５】
検査ラッパーは、モデル検査ツールによる等価性検査のために使用されるプログラムコードである。
モデル検査ツールは、等価性検査を行う従来のツールである。
等価性検査では、事前条件の下で事後条件を満たすか検査される。事前条件の下で事後条件を満たす場合、対象関数同士が等価である。
【００３６】
＊＊＊動作の説明＊＊＊
等価性検証装置１００の動作は等価性検証方法に相当する。また、等価性検証方法の手順は等価性検証プログラムの手順に相当する。
【００３７】
図８に基づいて、等価性検証方法を説明する。
ステップＳ１１０において、生成部１１０は、検査ヘッダ２４０と検査ラッパー２５０とを生成する。
【００３８】
図９に基づいて、検査ヘッダ２４０を説明する。
検査ヘッダ２４０は、図２の第１プログラム２１０と図３の第２プログラム２２０とに基づいて生成される。
検査ヘッダ２４０は、宣言文２４１と宣言文２４２とを含んでいる。
宣言文２４１は、第１関数ｘと第２関数ｙとを検査ラッパー２５０から参照するための宣言文である。
宣言文２４２は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔと第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔとを検査ラッパー２５０から参照するための宣言文である。
【００３９】
図１０に基づいて、検査ラッパー２５０を説明する。
検査ラッパー２５０は、インクルード文２５１と定義文２５２と定義部分２５３と事前条件文２５４と初期化文２５５とループ文２５６と事後条件文２５７とを含んでいる。
インクルード文２５１は、検査ヘッダ２４０をインクルードする文である。
定義文２５２は、検査ステップ数を定義する文である。検査ステップ数は、ループ文２５６において第１関数ｘと第２関数ｙとを呼び出す回数である。
定義部分２５３は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの定義部分である。
事前条件文２５４は、第１関数ｘと第２関数ｙとの入力値同士が等しいという事前条件を定義する文である。
初期化文２５５は、第１状態変数ｓｔａｔｅ＿ｘと第２状態変数ｓｔａｔｅ＿ｙとを初期化するための文である。具体的には、初期化文２５５は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔと第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔとを呼び出す文である。初期化文２５５は、ループ文２５６より前に実行される文として記述される。
ループ文２５６は、第１関数ｘと第２関数ｙとを繰り返し呼び出すための文である。
事後条件文２５７は、第１関数ｘと第２関数ｙとの出力値同士が等しいという事後条件を定義する文である。
【００４０】
図１１に基づいて、生成処理（Ｓ１１０）の手順を説明する。
ステップＳ１１１において、生成部１１０は、検査ヘッダ２４０（図９参照）を生成する。
具体的には、生成部１１０は、宣言文２４１と宣言文２４２とを記述する。宣言文２４１と宣言文２４２とが記述されたファイルが検査ヘッダ２４０である。
【００４１】
生成部１１０は、宣言文２４１を以下のように記述する。
生成部１１０は、第１プログラム２１０に対する構文解析を行うことによって第１プログラム２１０から第１関数ｘのプロトタイプを抽出し、第１関数ｘのプロトタイプを用いて第１関数ｘのｅｘｔｅｒｎ宣言を生成する。
生成部１１０は、第２プログラム２２０に対する構文解析を行うことによって第２プログラム２２０から第２関数ｙのプロトタイプを抽出し、第２関数ｙのプロトタイプを用いて第２関数ｙのｅｘｔｅｒｎ宣言を生成する。
そして、生成部１１０は、第１関数ｘのｅｘｔｅｒｎ宣言と第２関数ｙのｅｘｔｅｒｎ宣言とを記述する。
第１関数ｘのｅｘｔｅｒｎ宣言および第２関数ｙのｅｘｔｅｒｎ宣言が宣言文２４１である。
【００４２】
生成部１１０は、宣言文２４２を以下のように記述する。
生成部１１０は、第１プログラム２１０に対する構文解析を行うことによって第１プログラム２１０から第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔのプロトタイプを抽出する。生成部１１０は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔのプロトタイプを用いて第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔのｅｘｔｅｒｎ宣言を生成する。
生成部１１０は、第２プログラム２２０に対する構文解析を行うことによって第２プログラム２２０から第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔのプロトタイプを抽出する。生成部１１０は、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔのプロトタイプを用いて第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔのｅｘｔｅｒｎ宣言を生成する。
そして、生成部１１０は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔのｅｘｔｅｒｎ宣言と第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔのｅｘｔｅｒｎ宣言とを記述する。
第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔのｅｘｔｅｒｎ宣言および第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔのｅｘｔｅｒｎ宣言が宣言文２４２である。
【００４３】
ステップＳ１１２からステップＳ１１８によって、生成部１１０は、検査ラッパー２５０（図１０参照）を生成する。
【００４４】
ステップＳ１１２において、生成部１１０は、インクルード文２５１（図１０参照）を記述する。
具体的には、生成部１１０は、検査ヘッダ２４０のファイル名（ａｎａｌｙｓｉｓ．ｈ）を用いてインクルード文２５１を生成し、生成されたインクルード文２５１を検査ラッパー２５０の先頭に記述する。
【００４５】
ステップＳ１１３において、生成部１１０は、検査ステップ数の定義文２５２（図１０参照）を記述する。
具体的には、生成部１１０は、ステップ変数の変数名（ＳＴＥＰ）と検査ステップ数（３）とを用いて定義文２５２を生成し、生成された定義文２５２をインクルード文２５１の下に記述する。ステップ変数の変数名および検査ステップ数は予め決められている。
【００４６】
ステップＳ１１４において、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの定義部分２５３（図１０参照）を記述する。
【００４７】
具体的には、生成部１１０は、定義部分２５３を以下のように生成し、生成された定義部分２５３を定義文２５２の下に記述する。
まず、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙのプロトタイプを記述する。「ｖｏｉｄ  ｊｕｄｇｅ＿ｘ＿ｙ（）｛｝」は検査関数ｊｕｄｇｅ＿ｘ＿ｙのプロトタイプである。
次に、生成部１１０は、第１関数ｘ用の入力変数と第２関数ｙ用の入力変数との組を検査ステップ数と同じ数だけ生成し、生成された入力変数の組を検査関数ｊｕｄｇｅ＿ｘ＿ｙの引数として記述する。ｉｎ＿ｘ１およびｉｎ＿ｘ２が第１関数ｘ用の入力変数である。ｉｎ＿ｙ１およびｉｎ＿ｙ２が第２関数ｙ用の入力変数である。
そして、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの中で使用される内部変数を定義する定義文を定義文の形式に従って生成し、生成された定義文を検査関数ｊｕｄｇｅ＿ｘ＿ｙの中に記述する。定義文の形式は予め決められている。
１つ目の定義文は内部変数ｉを定義する文である。内部変数ｉは、ループ文２５６においてループ数を制御するために用いられる変数である。
２つ目の定義文は内部変数ｉｎ＿ｘ［］を定義する文である。内部変数ｉｎ＿ｘ［］は第１関数ｘ用の入力変数の値が設定される配列である。
３つ目の定義文は内部変数ｉｎ＿ｙ［］を定義する文である。内部変数ｉｎ＿ｙ［］は第２関数ｙ用の入力変数の配列である。
４つ目の定義文は内部変数ｏｕｔ＿ｘ［］と内部変数ｏｕｔ＿ｙ［］とを定義する文である。内部変数ｏｕｔ＿ｘ［］は第１関数ｘの出力値が設定される配列である。内部変数ｏｕｔ＿ｙ［］は第２関数ｙの出力値が設定される配列である。
【００４８】
ステップＳ１１５において、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの中に事前条件文２５４（図１０参照）を記述する。
具体的には、生成部１１０は、検査ステップ数と同じ数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分２５３の４つの定義文の下に記述する。生成された事前条件文が事前条件文２５４である。事前条件文の形式は予め決められている。
第ｎ事前条件文は、第１関数ｘと第２関数ｙとのｎ回目の呼び出しにおいて第１関数ｘと第２関数ｙとの入力値同士が等しいという事前条件を定義する文である。ｎは１以上検査ステップ数以下の整数である。
【００４９】
ステップＳ１１６において、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの中に初期化文２５５（図１０参照）を記述する。
具体的には、生成部１１０は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔの関数名を用いて第１初期化文を生成し、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔの関数名を用いて第２初期化文を生成する。そして、生成部１１０は、第１初期化文と第２初期化文とを事前条件文２５４の下に記述する。第１初期化文および第２初期化文が初期化文２５５である。第１初期化文は第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔを呼び出す文であり、第２初期化文は第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔを呼び出す文である。
【００５０】
ステップＳ１１７において、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの中にループ文２５６（図１０参照）を記述する。
具体的には、生成部１１０は、内部変数ｉの値が検査ステップ数以下であることを繰り返しの条件とするｆｏｒ文を初期化文２５５の下に記述する。そして、生成部１１０は、第１呼び出し文と第２呼び出し文とを呼び出し文の形式に従って生成し、第１呼び出し文と第２呼び出し文とをｆｏｒ文の中に記述する。呼び出し文の形式は予め決められている。
第１呼び出し文は、ｉ回目のループにおいて、第１関数ｘ用の内部変数ｉｎ＿ｘ［ｉ］の値を入力値として第１関数ｘを呼び出して、第１関数ｘ用の内部変数ｏｕｔ＿ｘ［ｉ］に第１関数ｘの出力値を設定するための文である。
第２呼び出し文は、ｉ回目のループにおいて、第２関数ｙ用の内部変数ｉｎ＿ｙ［ｉ］の値を入力値として第２関数ｙを呼び出して、第２関数ｙ用の内部変数ｏｕｔ＿ｘ［ｉ］に第２関数ｙの出力値を設定するための文である。
【００５１】
ステップＳ１１８において、生成部１１０は、検査関数ｊｕｄｇｅ＿ｘ＿ｙの中に事後条件文２５７（図１０参照）を記述する。
具体的には、生成部１１０は、検査ステップ数と同じ数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文２５６の下に記述する。検査ステップ数と同じ数の事後条件文が事後条件文２５７である。
第ｎ事後条件文は、第１関数ｘと第２関数ｙとのｎ回目の呼び出しにおいて第１関数ｘと第２関数ｙとの出力値同士が等しいという事後条件を定義する文である。ｎは１以上検査ステップ数以下の整数である。
【００５２】
図８に戻り、ステップＳ１２０を説明する。
ステップＳ１２０において、加工部１２０は、等価性検査のために第１プログラム２１０と第２プログラム２２０とを加工する。
【００５３】
図１２に基づいて、加工後の第１プログラム２１０を説明する。
加工後の第１プログラム２１０は、インクルード文２１１を含んでいる。
インクルード文２１１は、検査ヘッダ２４０をインクルードする文である。
【００５４】
図１３に基づいて、加工後の第２プログラム２２０を説明する。
加工後の第２プログラム２２０は、インクルード文２２１を含んでいる。
インクルード文２２１は、検査ヘッダ２４０をインクルードする文である。
【００５５】
図１４に基づいて、加工処理（Ｓ１２０）の手順を説明する。
ステップＳ１２１において、加工部１２０は、第１プログラム２１０にインクルード文２１１（図１２参照）を記述する。
さらに、加工部１２０は、第２プログラム２２０にインクルード文２２１（図１３参照）を記述する。
インクルード文２１１とインクルード文２２１とは互いに同じ文である。
具体的には、加工部１２０は、検査ヘッダ２４０のファイル名（ａｎａｌｙｓｉｓ．ｈ）を用いてインクルード文（２１１、２２１）を生成する。そして、加工部１２０は、生成されたインクルード文２１１を第１プログラム２１０の先頭に記述する。さらに、加工部１２０は、生成されたインクルード文２２１を第２プログラム２２０の先頭に記述する。
【００５６】
ステップＳ１２２において、加工部１２０は、第１プログラム２１０の初期化関数名が第２プログラム２２０の初期化関数名と同じであるか判定する。初期化関数名は、初期化関数の名前である。
第１プログラム２１０の初期化関数名が第２プログラム２２０の初期化関数名と同じである場合、処理はステップＳ１２３に進む。
第１プログラム２１０の初期化関数名が第２プログラム２２０の初期化関数名と異なる場合、処理はステップＳ１２４に進む。
【００５７】
ステップＳ１２３において、加工部１２０は、第１プログラム２１０の初期化関数名と第２プログラム２２０の初期化関数名との少なくとも一方を変更する。
例えば、図１５に示すように、第１プログラム２１０の初期化関数名と第２プログラム２２０の初期化関数名とが共にｆｕｎｃである場合、加工部１２０は、それぞれの初期化関数名に識別子を付加する。具体的には、加工部１２０は、第１プログラム２１０の初期化関数名をｆｕｎｃからｆｕｎｃ＿ａに変更し、第２プログラム２２０の初期化関数名をｆｕｎｃからｆｕｎｃ＿ｂに変更する。「＿ａ」および「＿ｂ」が付加された識別子である。
【００５８】
ステップＳ１２４において、加工部１２０は、第１プログラム２１０の対象関数名が第２プログラム２２０の対象関数名と同じであるか判定する。対象関数名は、等価性検査の対象となる関数の名前である。
第１プログラム２１０の対象関数名が第２プログラム２２０の対象関数名と同じである場合、処理はステップＳ１２５に進む。
第１プログラム２１０の対象関数名が第２プログラム２２０の対象関数名と異なる場合、加工処理（Ｓ１２０）は終了する。
【００５９】
ステップＳ１２５において、加工部１２０は、第１プログラム２１０の対象関数名と第２プログラム２２０の対象関数名との少なくとも一方を変更する。
例えば、図１５に示すように、第１プログラム２１０の対象関数名と第２プログラム２２０の対象関数名とが共にｆｕｎｃである場合、加工部１２０は、それぞれの対象関数名に識別子を付加する。具体的には、加工部１２０は、第１プログラム２１０の対象関数名をｆｕｎｃからｆｕｎｃ＿ａに変更し、第２プログラム２２０の対象関数名をｆｕｎｃからｆｕｎｃ＿ｂに変更する。「＿ａ」および「＿ｂ」が付加された識別子である。
【００６０】
図８に戻り、ステップＳ１３０を説明する。
ステップＳ１３０において、検査部１３０は、第１関数ｘと第２関数ｙとの等価性を検査する。
【００６１】
図１６に基づいて、検査処理（Ｓ１３０）の手順を説明する。
検査処理（Ｓ１３０）において、第１プログラム２１０は加工後の第１プログラム２１０を意味し、第２プログラム２２０は加工後の第２プログラム２２０を意味する。
【００６２】
ステップＳ１３１において、検査部１３０は、検査ラッパー２５０を用いて、モデル検査ツールを実行する。
これにより、第１関数ｘと第２関数ｙとが呼び出された回数毎に、第１関数ｘと第２関数ｙとの等価性が判定される。
【００６３】
モデル検査ツールは、等価性検査を行うための従来のツールであり、記憶部１９１に予め記憶される。
変換機能を有するモデル検査ツールと変換機能を有さないモデル検査ツールが存在する。
変換機能は、対象プログラムと検査ラッパーとを検査コードに変換する機能である。
検査コードは、等価性検査用のプログラムコードである。
【００６４】
具体的には、モデル検査ツールは以下のように実行される。
モデル検査ツールが変換機能を有する場合、検査部１３０は、第１プログラム２１０と第２プログラム２２０と検査ラッパー２５０とを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、第１プログラム２１０と第２プログラム２２０と検査ラッパー２５０とが検査コードに変換され、検査コードが実行される。検査コードが実行されると、実行結果２６０が出力される。
【００６５】
モデル検査ツールが変換機能を有さない場合、検査部１３０は、第１プログラム２１０と第２プログラム２２０と検査ラッパー２５０とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。
そして、検査部１３０は、検査コードを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、実行結果２６０が出力される。
【００６６】
図１７に基づいて、実行結果２６０を説明する。
実行結果２６０は、検査ラッパー２５０を用いてモデル検査ツールを実行することによって得られる結果である。
実行結果２６０は、第１ステップと第２ステップとの両方で第１関数ｘと第２関数ｙとが等価であることを示している。
出力値ｎは第ｎステップにおける第１関数ｘの出力値を意味し、出力値ｎ’は第ｎステップにおける第２関数ｙの出力値を意味する。ＳＵＣＣＥＳＳは事後条件を満たしたことを意味する。つまり、ＳＵＣＣＥＳＳは等価を意味する。
第ｎステップは、第１関数ｘと第２関数ｙとがｎ回呼び出された段階を意味する。ｎは１以上検査ステップ数以下の整数である。
【００６７】
図１６に戻り、ステップＳ１３２から説明を続ける。
ステップＳ１３２において、検査部１３０は、ステップＳ１３１で得られた結果に基づいて、第１関数ｘと第２関数ｙとが検査ステップ数まで等価であったか判定する。
第１関数ｘと第２関数ｙとが検査ステップ数まで等価であった場合、処理はステップＳ１３４に進む。
第１関数ｘと第２関数ｙとが等価でない検査ステップがあった場合、処理はステップＳ１３３に進む。
【００６８】
ステップＳ１３３において、検査部１３０は、ステップＳ１３１で得られた結果に基づいて、不等価ステップ数を特定する。
不等価ステップ数は、第１関数ｘと第２関数ｙとが不等価となるときのステップ数、すなわち、第１関数ｘと第２関数ｙとが不等価となるときの呼び出し回数である。具体的には、不等価ステップ数は、第１関数ｘと第２関数ｙとが不等価となる最初のステップ数である。
例えば、ステップＳ１３１で得られた結果が図１８の実行結果２６１である場合、第１ステップおよび第２ステップの判定結果がＳＵＣＣＥＳＳであり、第３ステップの判定結果がＦＡＩＬＵＲＥであるため、不等価ステップ数は３である。ＦＡＩＬＵＲＥは事後条件を満たさなかったことを意味する。つまり、ＦＡＩＬＵＲＥは不等価を意味する。
【００６９】
ステップＳ１３４において、検査部１３０は、検査結果を記憶部１９１に記憶する。
検査結果は、第１関数ｘと第２関数ｙとが検査ステップ数まで等価であるか否かを示す。
第１関数ｘと第２関数ｙとが検査ステップ数まで等価でない場合、検査結果は、さらに、不等価ステップ数を示す。
【００７０】
＊＊＊実施の形態１の効果＊＊＊
前のステップから次のステップへ値を保持する状態値を保有する関数同士の等価性検査を実現することができる。具体的には、設定されたステップ数において等価または不等価という判定結果を得ることができる。
【００７１】
＊＊＊他の構成＊＊＊
対象プログラム、対象関数、検査ラッパーおよび検査ヘッダはｃ言語以外のプログラミング言語を用いて記述されても構わない。検査ヘッダが無くても検査ラッパーから対象関数を呼び出すことが可能であれば、検査ヘッダは不要である。
【００７２】
実施の形態２．
検査ステップ数を決定する形態について、主に実施の形態１と異なる点を図１９から図３０に基づいて説明する。
【００７３】
＊＊＊構成の説明＊＊＊
図１９に基づいて、等価性検証装置１００の構成を説明する。
等価性検証装置１００は、さらに、解析部１４０をソフトウェア要素として備える。
等価性検証プログラムは、さらに、解析部１４０としてコンピュータを機能させる。
【００７４】
図２０に基づいて、対象情報２３１を説明する。
対象情報２３１は、対象情報の一例であり、記憶部１９１に予め記憶されている。
対象情報２３１は、入力変数と出力変数と初期化関数との他に、状態変数を示している。
【００７５】
図２１に基づいて、第１プログラム２１０と検査ヘッダ２４０と第１解析ラッパー２７０との関係を説明する。
検査ヘッダ２４０は、第１プログラム２１０と第１解析ラッパー２７０とにインクルードされる。
第１解析ラッパー２７０は、第１巡回数を求めるための等価性検査で使用される検査ラッパーである。
第１巡回数は、第１状態変数の値が初期値に戻るときの第１関数の呼び出し回数である。
第１解析ラッパー２７０の詳細については後述する。
【００７６】
図２１に基づいて、第２プログラム２２０と検査ヘッダ２４０と第２解析ラッパー２８０との関係を説明する。
検査ヘッダ２４０は、第２プログラム２２０と第２解析ラッパー２８０とにインクルードされる。
第２解析ラッパー２８０は、第２巡回数を求めるための等価性検査で使用される検査ラッパーである。
第２巡回数は、第２状態変数の値が初期値に戻るときの第２関数の呼び出し回数である。
第２解析ラッパー２８０の詳細については後述する。
【００７７】
＊＊＊動作の説明＊＊＊
図２２に基づいて、等価性検証方法を説明する。
ステップＳ２１０において、解析部１４０は、検査ラッパー２５０に定義する検査ステップ数を決定する。検査ステップ数を決定する方法については後述する。
【００７８】
ステップＳ２２０からステップＳ２４０は、実施の形態１（図８参照）におけるステップＳ１１０からステップＳ１３０と同じである。
但し、ステップＳ２２０において、生成部１１０は、ステップＳ２１０で決定された検査ステップ数を定義する文を定義文２５２として検査ラッパー２５０に記述する。
また、ステップＳ２４０において、第１関数と第２関数とが等価であると判定された場合、第１関数と第２関数とは完全に等価である。完全に等価とは、ステップ数に関わらず関数同士が等価であることを意味する。
【００７９】
図２３に基づいて、解析処理（Ｓ２１０）の手順を説明する。
ステップＳ２１１において、生成部１１０は、第１解析ラッパー２７０および第２解析ラッパー２８０を生成する。
【００８０】
図２４に基づいて、第１解析ラッパー２７０を説明する。
第１解析ラッパー２７０は、インクルード文２７１と定義文２７２と定義部分２７３と事前条件文２７４と初期化文２７５とループ文２７６と事後条件文２７７とを含んでいる。
インクルード文２７１は、検査ヘッダ２４０をインクルードする文である。
定義文２７２は、解析ステップ数を定義する文である。
定義部分２７３は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの定義部分である。
事前条件文２７４は、第１関数ｘの１回目の入力値が第１関数ｘの２回目以降の入力値と等しいという第１事前条件を定義する文である。
初期化文２７５は、第１状態変数ｓｔａｔｅ＿ｘを初期化するための文である。具体的には、初期化文２７５は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔを呼び出す文である。初期化文２７５は、ループ文２７６より前に実行される文として記述される。
ループ文２７６は、第１関数ｘを繰り返し呼び出すための文である。
事後条件文２７７は、第１関数ｘの１回目の出力値が第１関数ｘの２回目以降の出力値と等しい、且つ、第１関数ｘの１回目の第１状態変数の値が第１関数ｘの２回目以降の第１状態変数の値と等しいという第１事後条件を定義する文である。
【００８１】
図２５に基づいて、第２解析ラッパー２８０を説明する。
第２解析ラッパー２８０は、インクルード文２８１と定義文２８２と定義部分２８３と事前条件文２８４と初期化文２８５とループ文２８６と事後条件文２８７とを含んでいる。
インクルード文２８１は、検査ヘッダ２４０をインクルードする文である。
定義文２８２は、解析ステップ数を定義する文である。
定義部分２８３は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの定義部分である。
事前条件文２８４は、第２関数ｙの１回目の入力値が第２関数ｙの２回目以降の入力値と等しいという第２事前条件を定義する文である。
初期化文２８５は、第２状態変数ｓｔａｔｅ＿ｙを初期化するための文である。具体的には、初期化文２８５は、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔを呼び出す文である。初期化文２８５は、ループ文２８６より前に実行される文として記述される。
ループ文２８６は、第２関数ｙを繰り返し呼び出すための文である。
事後条件文２８７は、第２関数ｘの１回目の出力値が第２関数ｙの２回目以降の出力値と等しい、且つ、第２関数ｙの１回目の第２状態変数の値が第２関数ｙの２回目以降の第２状態変数の値と等しいという第２事後条件を定義する文である。
【００８２】
図２６に基づいて、生成処理（Ｓ２１１）の手順を説明する。
ステップＳ２１１１において、生成部１１０は、検査ヘッダ２４０（図９参照）を生成する。
【００８３】
ステップＳ２１１２からステップＳ２１１８によって、生成部１１０は、第１解析ラッパー２７０（図２４参照）および第２解析ラッパー２８０（図２５参照）を生成する。
【００８４】
ステップＳ２１１２において、生成部１１０は、インクルード文２７１を第１解析ラッパー２７０の先頭に記述し、インクルード文２８１を第２解析ラッパー２８０の先頭に記述する。
【００８５】
ステップＳ２１１３において、生成部１１０は、定義文２７２をインクルード文２７１の下に記述し、定義文２８２をインクルード文２８１の下に記述する。
【００８６】
ステップＳ２１１４において、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの定義部分２７３を第１解析ラッパー２７０に記述する。
【００８７】
具体的には、生成部１１０は、定義部分２７３を以下のように生成し、生成された定義部分２７３を定義文２７２の下に記述する。
まず、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘのプロトタイプを記述する。「ｖｏｉｄ  ｓｔｅｐ＿ｊｕｄｇｅ＿ｘ（）｛｝」は検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘのプロトタイプである。
次に、生成部１１０は、第１関数ｘ用の入力変数を解析ステップ数と同じ数だけ生成し、生成された入力変数を検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの引数として記述する。ｉｎ＿ｘ１、ｉｎ＿ｘ２およびｉｎ＿ｘ３が第１関数ｘ用の入力変数である。
そして、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中で使用される内部変数を定義する定義文を定義文の形式に従って生成し、生成された定義文を検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中に記述する。定義文の形式は予め決められている。
１つ目の定義文は内部変数ｉを定義する文である。内部変数ｉは、ループ文２７６においてループ数を制御するために用いられる変数である。
２つ目の定義文は内部変数ｉｎ＿ｘ［］を定義する文である。内部変数ｉｎ＿ｘ［］は第１関数ｘ用の入力変数の値が設定される配列である。
３つ目の定義文は内部変数ｏｕｔ＿ｘ［］を定義する文である。内部変数ｏｕｔ＿ｘ［］は第１関数ｘの出力値が設定される配列である。
４つ目の定義文は内部変数ｓｔａｔｅ＿ｘ［］を定義する文である。内部変数ｓｔａｔｅ＿ｘ［］は第１状態変数の値が設定される配列である。
【００８８】
同様に、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの定義部分２８３を第２解析ラッパー２８０に記述する。
【００８９】
ステップＳ２１１５において、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中に事前条件文２７４を記述する。
具体的には、生成部１１０は、解析ステップ数より１つ少ない数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分２７３の４つの定義文の下に記述する。生成された事前条件文が事前条件文２７４である。事前条件文の形式は予め決められている。
第ｍ事前条件文は、第１関数ｘの１回目の入力値が第１関数ｘのｍ＋１回目の入力値と等しいという事前条件を定義する文である。ｍは１以上（解析ステップ数−１）以下の整数である。
【００９０】
同様に、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの中に事前条件文２８４を記述する。
【００９１】
ステップＳ２１１６において、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中に初期化文２７５を記述し、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの中に初期化文２８５を記述する。
具体的には、生成部１１０は、第１初期化関数ｓｔａｔｅ＿ｘ＿ｉｎｉｔの関数名を用いて初期化文２７５を生成し、初期化文２７５を事前条件文２７４の下に記述する。さらに、生成部１１０は、第２初期化関数ｓｔａｔｅ＿ｙ＿ｉｎｉｔの関数名を用いて初期化文２８５を生成し、初期化文２８５を事前条件文２８４の下に記述する。
【００９２】
ステップＳ２１１７において、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中にループ文２７６を記述する。
具体的には、生成部１１０は、内部変数ｉの値が解析ステップ数以下であることを繰り返しの条件とするｆｏｒ文を初期化文２７５の下に記述する。そして、生成部１１０は、呼び出し文を呼び出し文の形式に従って生成し、代入文を代入文の形式に従って生成し、呼び出し文と代入文とをｆｏｒ文の中に記述する。呼び出し文の形式および代入文の形式は予め決められている。
呼び出し文は、ｉ回目のループにおいて、第１関数ｘ用の内部変数ｉｎ＿ｘ［ｉ］の値を入力値として第１関数ｘを呼び出して、第１関数ｘ用の内部変数ｏｕｔ＿ｘ［ｉ］に第１関数ｘの出力値を設定するための文である。
代入文は、ｉ回目のループにおいて、第１関数ｘ用の内部変数ｓｔａｔｅ＿ｘ［ｉ］に第１状態変数ｓｔａｔｅ＿ｘの値を設定するための文である。
【００９３】
同様に、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの中にループ文２８６を記述する。
【００９４】
ステップＳ２１１８において、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｘの中に事後条件文２７７を記述する。
具体的には、生成部１１０は、解析ステップ数より１つ少ない数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文２７６の下に記述する。生成された事後条件文が事後条件文２７７である。
第ｍ事後条件文は、第１関数ｘの１回目の出力値が第１関数ｘのｍ＋１回目の出力値と等しいという事後条件を定義する文である。ｍは１以上（解析ステップ数−１）以下の整数である。
【００９５】
同様に、生成部１１０は、検査関数ｓｔｅｐ＿ｊｕｄｇｅ＿ｙの中に事後条件文２８７を記述する。
【００９６】
図２３に戻り、ステップＳ２１２を説明する。
ステップＳ２１２において、加工部１２０は、等価性検査のために第１プログラム２１０と第２プログラム２２０とを加工する。
【００９７】
図２７に基づいて、加工処理（Ｓ２１２）の手順を説明する。
ステップＳ２１２１は、実施の形態１（図１４参照）におけるステップＳ１２１と同じである。
ステップＳ２１２２は、実施の形態１（図１４参照）におけるステップＳ１２２と同じである。
ステップＳ２１２３は、実施の形態１（図１４参照）におけるステップＳ１２３と同じである。
ステップＳ２１２４は、実施の形態１（図１４参照）におけるステップＳ１２４と同じである。
ステップＳ２１２５は、実施の形態１（図１４参照）におけるステップＳ１２５と同じである。
【００９８】
図２３に戻り、ステップＳ２１３を説明する。
ステップＳ２１３において、解析部１４０は、第１等価性検査と第２等価性検査とを行う。
第１等価性検査は、第１関数ｘに対する等価性検査である。第１関数ｘに対する等価性検査は、第１関数ｘが呼び出された回数毎に第１事後条件を満たすか判定するための検査である。
第２等価性検査は、第２関数ｙに対する等価性検査である。第２関数ｙに対する等価性検査は、第２関数ｙが呼び出された回数毎に第２事後条件を満たすか判定するための検査である。
【００９９】
具体的には、解析部１４０は、第１解析ラッパー２７０を用いて、モデル検査ツールを実行する。これにより、第１関数ｘが呼び出された回数毎に第１事後条件を満たすか判定される。
さらに、解析部１４０は、第２解析ラッパー２８０を用いて、モデル検査ツールを実行する。これにより、第２関数ｙが呼び出された回数毎に第２事後条件を満たすか判定される。
【０１００】
具体的には、モデル検査ツールは以下のように実行される。
モデル検査ツールが変換機能を有する場合、解析部１４０は、加工後の第１プログラム２１０と第１解析ラッパー２７０とを入力として、モデル検査ツールを実行する。これにより、加工後の第１プログラム２１０と第１解析ラッパー２７０とが検査コードに変換され、検査コードが実行される。そして、第１関数ｘに対する等価性検査の実行結果が出力される。
さらに、検査部１３０は、加工後の第２プログラム２２０と第２解析ラッパー２８０とを入力として、モデル検査ツールを実行する。これにより、加工後の第２プログラム２２０と第２解析ラッパー２８０とが検査コードに変換され、検査コードが実行される。そして、第２関数ｙに対する等価性検査の実行結果が出力される。
【０１０１】
モデル検査ツールが変換機能を有さない場合、解析部１４０は、加工後の第１プログラム２１０と第１解析ラッパー２７０とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。そして、解析部１４０は、検査コードを入力として、モデル検査ツールを実行する。これにより、第１関数ｘに対する等価性検査の実行結果が出力される。
さらに、解析部１４０は、加工後の第２プログラム２２０と第２解析ラッパー２８０とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。そして、解析部１４０は、検査コードを入力として、モデル検査ツールを実行する。これにより、第２関数ｙに対する等価性検査の実行結果が出力される。
【０１０２】
図２８に基づいて、実行結果２６２を説明する。
実行結果２６２は、ステップＳ２１３で得られる実行結果の一例である。
（ステップ１）出力値は、対象関数の１回目の出力値を意味する。
（ステップｍ）出力値は、対象関数のｍ回目の出力値を意味する。
（ステップ１）状態値は、対象関数の１回目の状態値を意味する。
（ステップｍ）状態値は、対象関数のｍ回目の状態値を意味する。
ＦＡＩＬＵＲＥは、事後条件を満たさなかったことを意味する。
ＳＵＣＣＥＳＳは、事後条件を満たしたことを意味する。
【０１０３】
図２３に戻り、ステップＳ２１４を説明する。
ステップＳ２１４において、解析部１４０は、第１等価性検査の結果に基づいて第１巡回数を求め、第２等価性検査の結果に基づいて第２巡回数を求める。
【０１０４】
図２９に基づいて、巡回数決定処理（ステップＳ２１４）の手順を説明する。
ステップＳ２１４０において、解析部１４０は、第１等価性検査の結果を参照することによって、解析ステップ数まで成功したか判定する。成功は、第１事後条件が満たされたことを意味する。
解析ステップ数まで成功した場合、処理はステップＳ２１４１に進む。
成功しなかった解析ステップがあった場合、処理はステップＳ２１４２に進む。
【０１０５】
ステップＳ２１４１において、解析部１４０は、第１巡回数を２にする。
ステップＳ２１４１の後、処理はステップＳ２１４５に進む。
【０１０６】
ステップＳ２１４２において、解析部１４０は、第１等価性検査の結果を参照することによって、第１成功ステップが有ったか判定する。第１成功ステップは、第１事後条件が満たされた解析ステップである。
第１成功ステップが有った場合、処理はステップＳ２１４３に進む。
第１成功ステップが無かった場合、処理はステップＳ２１４４に進む。
【０１０７】
ステップＳ２１４３において、解析部１４０は、第１巡回数を第１成功ステップ数にする。第１成功ステップ数は、第１成功ステップ時のステップ数である。
ステップＳ２１４３の後、処理はステップＳ２１４５に進む。
【０１０８】
ステップＳ２１４４において、解析部１４０は、第１巡回数を０にする。
【０１０９】
ステップＳ２１４５において、解析部１４０は、第２等価性検査の結果を参照することによって、解析ステップ数まで成功したか判定する。
解析ステップ数まで成功した場合、処理はステップＳ２１４６に進む。
成功しなかった解析ステップがあった場合、処理はステップＳ２１４７に進む。
【０１１０】
ステップＳ２１４６において、解析部１４０は、第２巡回数を２にする。
ステップＳ２１４６の後、巡回数決定処理（Ｓ２１４）は終了する。
【０１１１】
ステップＳ２１４７において、解析部１４０は、第２等価性検査の結果を参照することによって、第２成功ステップが有ったか判定する。第２成功ステップは、第２事後条件が満たされた解析ステップである。
第２成功ステップが有った場合、処理はステップＳ２１４８に進む。
第２成功ステップが無かった場合、処理はステップＳ２１４９に進む。
【０１１２】
ステップＳ２１４８において、解析部１４０は、第２巡回数を第２成功ステップ数にする。第２成功ステップ数は、第２成功ステップ時のステップ数である。
ステップＳ２１４８の後、巡回数決定処理（Ｓ２１４）は終了する。
【０１１３】
ステップＳ２１４９において、解析部１４０は、第２巡回数を０に決定する。
【０１１４】
図２３に戻り、ステップＳ２１５を説明する。
ステップＳ２１５において、解析部１４０は、第１巡回数と第２巡回数とに基づいて検査ステップ数を決定する。
【０１１５】
図３０に基づいて、検査ステップ数決定処理（Ｓ２１５）の手順を説明する。
ステップＳ２１５１において、解析部１４０は、第１巡回数と第２巡回数との両方が０でないか判定する。
第１巡回数と第２巡回数との両方が０でない場合、処理はステップＳ２１５２に進む。
第１巡回数と第２巡回数との少なくともいずれかが０である場合、処理はステップＳ２１５３に進む。
【０１１６】
ステップＳ２１５２において、解析部１４０は、第１巡回数と第２巡回数との最小公倍数を算出する。
そして、解析部１４０は、検査ステップ数を第１巡回数と第２巡回数との最小公倍数にする。
【０１１７】
ステップＳ２１５３において、解析部１４０は、検査ステップ数を規定数にする。規定数は予め決められた数である。
【０１１８】
＊＊＊実施の形態２の効果＊＊＊
巡回数に対応する検査ステップ数を決定することができる。そして、巡回数に対応する検査ステップ数において等価性検査を行うことにより、関数同士が完全に等価であるか否かを判定することができる。
【０１１９】
＊＊＊実施の形態の補足＊＊＊
図３１に基づいて、等価性検証装置１００のハードウェア構成を説明する。
等価性検証装置１００は処理回路９９０を備える。
処理回路９９０は、生成部１１０と加工部１２０と検査部１３０と解析部１４０とを実現するハードウェアである。
処理回路９９０は、専用のハードウェアであってもよいし、メモリ９０２に格納されるプログラムを実行するプロセッサ９０１であってもよい。
【０１２０】
処理回路９９０が専用のハードウェアである場合、処理回路９９０は、例えば、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ、ＡＳＩＣ、ＦＰＧＡまたはこれらの組み合わせである。
ＧＡはＧａｔｅ  Ａｒｒａｙの略称であり、ＡＳＩＣはＡｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略称であり、ＦＰＧＡはＦｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略称である。
等価性検証装置１００は、処理回路９９０を代替する複数の処理回路を備えてもよい。複数の処理回路は、処理回路９９０の役割を分担する。
【０１２１】
等価性検証装置１００の機能について、一部が専用のハードウェアで実現されて、残りがソフトウェアまたはファームウェアで実現されてもよい。
【０１２２】
このように、処理回路９９０はハードウェア、ソフトウェア、ファームウェアまたはこれらの組み合わせで実現することができる。
【０１２３】
実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
【符号の説明】
【０１２４】
１００  等価性検証装置、１１０  生成部、１２０  加工部、１３０  検査部、１４０  解析部、１９１  記憶部、２１０  第１プログラム、２１１  インクルード文、２２０  第２プログラム、２２１  インクルード文、２３０  対象情報、２３１  対象情報、２４０  検査ヘッダ、２４１  宣言文、２４２  宣言文、２５０  検査ラッパー、２５１  インクルード文、２５２  定義文、２５３  定義部分、２５４  事前条件文、２５５  初期化文、２５６  ループ文、２５７  事後条件文、２６０  実行結果、２６１  実行結果、２６２  実行結果、２７０  第１解析ラッパー、２７１  インクルード文、２７２  定義文、２７３  定義部分、２７４  事前条件文、２７５  初期化文、２７６  ループ文、２７７  事後条件文、２８０  第２解析ラッパー、２８１  インクルード文、２８２  定義文、２８３  定義部分、２８４  事前条件文、２８５  初期化文、２８６  ループ文、２８７  事後条件文、９０１  プロセッサ、９０２  メモリ、９０３  補助記憶装置、９９０  処理回路。
【図１】
0006556410.tif 000002
【図２】
0006556410.tif 000003
【図３】
0006556410.tif 000004
【図４】
0006556410.tif 000005
【図５】
0006556410.tif 000006
【図６】
0006556410.tif 000007
【図７】
0006556410.tif 000008
【図８】
0006556410.tif 000009
【図９】
0006556410.tif 000010
【図１０】
0006556410.tif 000011
【図１１】
0006556410.tif 000012
【図１２】
0006556410.tif 000013
【図１３】
0006556410.tif 000014
【図１４】
0006556410.tif 000015
【図１５】
0006556410.tif 000016
【図１６】
0006556410.tif 000017
【図１７】
0006556410.tif 000018
【図１８】
0006556410.tif 000019
【図１９】
0006556410.tif 000020
【図２０】
0006556410.tif 000021
【図２１】
0006556410.tif 000022
【図２２】
0006556410.tif 000023
【図２３】
0006556410.tif 000024
【図２４】
0006556410.tif 000025
【図２５】
0006556410.tif 000026
【図２６】
0006556410.tif 000027
【図２７】
0006556410.tif 000028
【図２８】
0006556410.tif 000029
【図２９】
0006556410.tif 000030
【図３０】
0006556410.tif 000031
【図３１】
0006556410.tif 000032