(57)【要約】【課題】事前条件を表す論理式に全称記号や存在記号が含まれる場合でも、境界値制約を用いて、組み合わせ爆発を抑えたテストデータを生成するテストデータ生成プログラムを提供する。【解決手段】  論理式に存在記号が含まれている場合、論理式から存在記号と当該存在記号の要素を含む入力データを識別する入力データ識別情報とを含む部分述語論理式を抽出し、入力データ識別情報で識別されるテーブル毎に該テーブルの行数が記憶された記憶部を参照し、部分述語論理式に含まれる入力データ識別情報に対応するテーブルの行数を取得し、行数を表す変数の値を、取得した行数の最小値、最大値、及び、最小値より大きく最大値より小さい範囲とする論理式をそれぞれ生成し、生成した論理式を論理和で結んだ制約式を生成し、記憶部に記憶された論理式に含まれる部分述語論理式を生成した制約式との論理積に変換する。【選択図】図２
2013012082.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータが、
テスト対象のプログラムの入力データに関する事前条件を表した論理式が記憶された記憶部を参照して、前記論理式に存在記号が含まれているか否かを判定し、
前記判定において含まれると判定した場合、前記論理式から前記存在記号と当該存在記号の要素を含む入力データを識別する入力データ識別情報とを含む部分述語論理式を抽出し、
前記入力データ識別情報で識別されるテーブル毎に該テーブルの行数が記憶された記憶部を参照して、前記部分述語論理式に含まれる入力データ識別情報に対応するテーブルの行数を取得し、
前記行数を表す変数の値を、前記取得した行数の最小値、最大値、及び、前記最小値より大きく前記最大値より小さい範囲とする論理式をそれぞれ生成し、
前記生成した論理式を論理和で結んだ制約式を生成し、
前記記憶部に記憶された前記論理式に含まれる前記部分述語論理式を前記生成した制約式との論理積に変換する、
処理を実行することを特徴とする論理式変換プログラム。
【請求項２】
前記論理式に否定が係る論理積が含まれるか否かを判定し、
前記判定において前記否定が係る論理積が含まれると判定した場合に、前記記憶部に記された前記否定が係る論理積で示される論理式のデータを、前記論理積の左辺及び右辺の論理式に各々否定が係る論理式及び該否定が係る論理式のうちの一方を左辺、他方を右辺とする論理和で示される論理式のデータに変換する、
処理を前記コンピュータに実行させることを特徴とする請求項１に記載の論理式変換プログラム。
【請求項３】
前記論理式に否定が係る論理和が含まれるか否かを判定し、
前記判定において前記否定が係る論理和が含まれると判定した場合に、前記記憶部に記憶された前記否定が係る論理和で示される論理式のデータを、前記論理和演算子の左辺及び右辺の論理式の各々に否定が係り、該否定が係る論理式のうちの一方を左辺、他方を右辺とする論理積で示される論理式のデータに変換する、
処理を前記コンピュータに実行させることを特徴とする請求項１または２に記載の論理式変換プログラム。
【請求項４】
前記論理式に含意が含まれるか否かを判定し、
前記判定において前記含意が含まれると判定した場合に、前記記憶部に記憶された前記含意で示される論理式のデータを、前記含意の左辺の論理式に否定が付いた第１の論理式と、前記第１の論理式と、前記含意の右辺のうち、一方を左辺、他方を右辺とする論理積で示される論理式とに変換する、
処理を前記コンピュータに実行させることを特徴とする請求項１から３のいずれかに記載の論理式変換プログラム。
【請求項５】
前記論理式に論理積が係る論理和が含まれるか否かを判定し、
前記判定において前記論理積が係る論理和が含まれると判定した場合に、前記記憶部に記憶された前記論理積が係る論理和で示される論理式のデータを、前記論理積の左辺を第１の辺とし前記論理和の前記論理積が係らない辺である他方の辺を第２の辺とする第１の論理和と、前記論理積の右辺を第１の辺とし前記他方の辺を第２の辺とする第２の論理和と、前記第１の論理和を第１の辺とし前記第２の論理和を第２の辺とする論理積とで示される論理式のデータに変換する、
処理を前記コンピュータに実行させることを特徴とする請求項１から４のいずれかに記載の論理式変換プログラム。
【請求項６】
前記判定において、前記論理積が係る論理和が含まれないと判定した場合に、前記記憶
部に記憶された前記論理式のデータを、論理和を含まず、かつ、論理積で結合された論理
式の部分論理式毎に分割し、
前記分割した各々の部分論理式のデータを、充足可能性の判定対象の論理式のデータを記憶する記憶部に記憶する、
処理を前記コンピュータに実行させることを特徴とする請求項５に記載の論理式変換プ
ログラム。
【請求項７】
コンピュータによって実行されるテストデータ生成方法であって、
テスト対象のプログラムの入力データに関する事前条件を表した論理式が記憶された記憶部を参照して、前記論理式に存在記号が含まれているか否かを判定し、
前記判定において含まれると判定した場合、前記論理式から前記存在記号と当該存在記号の要素を含む入力データを識別する入力データ識別情報とを含む部分述語論理式を抽出し、
前記入力データ識別情報で識別されるテーブル毎に該テーブルの行数が記憶された記憶部を参照して、前記部分述語論理式に含まれる入力データ識別情報に対応するテーブルの行数を取得し、
前記行数を表す変数の値を、前記取得した行数の最小値、最大値、及び、前記最小値より大きく前記最大値より小さい範囲とする論理式をそれぞれ生成し、
前記生成した論理式を論理和で結んだ制約式を生成し、
前記記憶部に記憶された前記論理式に含まれる前記部分述語論理式を前記生成した制約式との論理積に変換する、
ことを特徴とするテストデータ生成方法。
【請求項８】
テスト対象のプログラムの入力データに関する事前条件を表した論理式が記憶された記憶部を参照して、前記論理式に存在記号が含まれているか否かを判定し、前記判定において含まれると判定した場合、前記論理式から前記存在記号と当該存在記号の要素を含む入力データを識別する入力データ識別情報とを含む部分述語論理式を抽出する抽出部と、
前記入力データ識別情報で識別されるテーブル毎に該テーブルの行数が記憶された記憶部を参照して、前記部分述語論理式に含まれる入力データ識別情報に対応するテーブルの行数を取得し、前記行数を表す変数の値を、前記取得した行数の最小値、最大値、及び、前記最小値より大きく前記最大値より小さい範囲とする論理式をそれぞれ生成し、前記生成した論理式を論理和で結んだ制約式を生成し、前記記憶部に記憶された前記論理式に含まれる前記部分述語論理式を前記生成した制約式との論理積に変換する変換部と、
前記変換後の論理式に論理積が係る論理和が含まれるか否かを判定し、前記判定において前記論理積が係る論理和が含まれると判定した場合に、前記記憶部に記憶された前記論理積が係る論理和で示される論理式のデータを、前記論理積の左辺を第１の辺とし前記論理和の前記論理積が係らない辺である他方の辺を第２の辺とする第１の論理和と、前記論理積の右辺を第１の辺とし前記他方の辺を第２の辺とする第２の論理和と、前記第１の論理和を第１の辺とし前記第２の論理和を第２の辺とする論理積とで示される論理式のデータに変換し、前記判定において、前記論理積が係る論理和が含まれないと判定した場合に、前記記憶部に記憶された前記論理式のデータを、論理和を含まず、かつ、論理積で結合された論理式の部分論理式毎に分割した部分論理式各々を生成する生成部と、
前記部分論理式各々を入力としてＳＭＴソルバを実行し、当該部分論理式を充足する解を求める充足値生成部と、
を備えることを特徴とするテストデータ生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのテストに用いるテストデータを生成するテストデータ生成プログラム、テストデータ生成方法、テストデータ生成装置に関する。
【背景技術】
【０００２】
従来、仕様に基づいて作成されたプログラムのテストをする場合には、仕様に含まれる条件を用いてテストデータを生成する方法や、プログラムに含まれる条件を用いてテストデータを生成する方法がある。例えば、業務システムで用いられるプログラムのテストは、業務システムなどのプログラムの仕様を用いて行われるチェックや、作成したプログラムを用いて行われる境界値テストなど、様々な観点より行うことが望ましい。境界値テストとは、プログラムに誤りがある場合、誤りはデータの境界で起こりやすいという経験則に基づいて、プログラムの分岐条件により変化するデータの境界を求めて、その境界を示す境界値を入力（テストデータ）として用いるテストである。
【０００３】
プログラムの仕様は「ＸならばＹとなる」のような形式で表されることが多く、仕様にはこのような形式で表される条件が複数含まれている。また、仕様をテストするためのテストデータは、Ｘが示す事前条件が論理式で表現されている場合に、Ｘを充足する充足値といえる。充足値は、Ｘを入力としてSatisfiability Modulo Theories（ＳＭＴソルバ）などを利用し、Ｘの充足値を自動的に求めることによりテストデータを生成することができる。ＳＭＴソルバは、入力された論理式ごとに、充足可能性を判定し、充足可能であると判定した場合に、この論理式各々を満たす１つの解（充足値）を出力するものである。
【０００４】
また、入力される論理式を変形してＳＭＴソルバが充足値を求め易くする方法として、例えば、事前条件Ｘを表す論理式に論理和（or）が含まれる場合、該論理式を論理和標準形に変換し、論理和で結ばれている各論理式ごとに充足値を求める方法が知られている。
【０００５】
また、事前条件Ｘを表す論理式に限量子が含まれる場合、限量子を除去してから、充足値を生成する方法が知られている。例えば、事前条件として「not(会員ID=“”) and ∃r(i)∈注文明細, r(i).購入数=“” or r(i).品名=“”」があり、事前条件の「注文明細」が５つの行（ｉ＝０〜４）を有するテーブルを示し、入力データが「会員ID」「購入数」「品名」である場合を考える。この事前条件の「∃r(i)∈注文明細, r(i).購入数=“” or r(i).品名=“”」から限量子を除去し、展開すると「F(0) or F(1) or F(2) or F(3) or F(4)」と表すことができる。
【０００６】
展開した例
「F(0)」＝「注文明細, r(0).購入数=“” or r(0).品名=“”」
「F(1)」＝「注文明細, r(1).購入数=“” or r(1).品名=“”」
「F(2)」＝「注文明細, r(2).購入数=“” or r(2).品名=“”」
「F(3)」＝「注文明細, r(3).購入数=“” or r(3).品名=“”」
「F(4)」＝「注文明細, r(4).購入数=“” or r(4).品名=“”」
【０００７】
すると、「F(0)」「F(1)」「F(2)」「F(3)」「F(4)」各々において、２通りの組み合わせが存在するため、１０通り（５×２）の組み合わせとなることがわかる。本例では、１０通りの組み合わせですんでいるが、他の仕様では上記に示したような論理式がいくつも積み重なっていく場合が想定されるため、組み合わせ爆発が発生する要因となる。さらに、本例において１０通りの組み合わせの中には有用でない組み合わせが存在していることが想定される。すなわち、組み合わせの中にはテスト内容が重複する組み合わせがあり、重複するものの中から代表する組み合わせだけを用いればよいため、すべての組み合わせを用いる必要がないことが想定される。本例では１０通りであるが、組み合わせの数が多ければ重複する組み合わせも多くなることが想定される。
【０００８】
なお、関連する技術として、限量子記号付きブール式の充足可能性を判定する際に使用される技法が開示されている。この技術によれば、限量子記号付きブール式は、充足可能性ソルバによって分析可能な構成要素部に分解される。各構成要素は、独立または並列に、充足可能性のために分析される。構成要素が充足不能である場合、限量子記号付きブール式は充足不能であると判定され、分析が中止される。構成要素が充足可能である場合、充足可能な構成要素に対応する割り当てが書き留められる。構成要素が充足可能である場合、それが別の未テストの構成要素に追加されて、組合せ構成要素が提供され、組合せ構成要素の充足可能性が分析される。そのような追加および分析は、限量子記号付きブール式が完了され、充足可能と判定されるか、または充足不能と判定されるまで繰り返される。
【０００９】
また、関連する技術として自動テスト実行システムが実行した自動テスト結果から重複を省き、必要最小限のテスト結果のみを確認するようにし、より効率的にテストを実施するための方法が開示されている。この方法によれば、テスト対象のソースコードに処理の流れを追跡するための処理を埋め込むトレース機能埋込部を有している。また、トレース情報表と自動テスト実行システムが出力したテスト実行結果表を連結し、重複したテストケースを削除するテスト結果分析部を用いて、重複したテストケースを削除した後、テスト実行結果表を表示装置に表示する。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００６−２０２２８８号公報
【特許文献２】特開２００９−２１７６６４号公報
【非特許文献】
【００１１】
【非特許文献１】Nikolai Tillmann and Jonathan de Halleux, "Pex-White Box Test Generation for .NET", TAP 2008, LNCS 4966, pp.134-153, 2008.
【発明の概要】
【発明が解決しようとする課題】
【００１２】
本発明は、事前条件を表す論理式に全称記号や存在記号が含まれる場合でも、境界値制約を用いて、組み合わせ爆発を抑えたテストデータを生成するテストデータ生成プログラム、テストデータ生成方法、テストデータ生成装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
本実施の態様のひとつであるテストデータ生成プログラムは、テスト対象のプログラムの入力データに関する事前条件を表した論理式が記憶された記憶部を参照して、上記論理式に存在記号が含まれているか否かを判定する。
【００１４】
続いて、上記判定において含まれると判定した場合、上記論理式から上記存在記号と当該存在記号の要素を含む入力データを識別する入力データ識別情報とを含む部分述語論理式を抽出する。
【００１５】
続いて、上記入力データ識別情報で識別されるテーブル毎に該テーブルの行数が記憶された記憶部を参照して、上記部分述語論理式に含まれる入力データ識別情報に対応するテーブルの行数を取得する。
【００１６】
続いて、上記行数を表す変数の値を、上記取得した行数の最小値、最大値、及び、上記最小値より大きく上記最大値より小さい範囲とする論理式をそれぞれ生成する。
【００１７】
続いて、上記生成した論理式を論理和で結んだ制約式を生成する。
続いて、上記記憶部に記憶された上記論理式に含まれる上記部分述語論理式を上記生成した制約式との論理積に変換する。
【発明の効果】
【００１８】
本実施の態様によれば、事前条件を表す論理式に全称記号や存在記号が含まれる場合でも、境界値制約を用いて、組み合わせ爆発を抑えたテストデータを生成することができるという効果を奏する。
【図面の簡単な説明】
【００１９】
【図１】テストデータ生成装置のハードウェアの一実施例を示す図である。
【図２】テストデータ生成装置の一実施例を示す図である。
【図３】抽出部の動作の一実施例を示す図である。
【図４】商品購入アプリケーションの商品購入画面の一実施例を示す図である。
【図５】論理式を木構造で表した一実施例を示す図である。
【図６】論理式情報のデータ構造の一実施例を示す図である。
【図７】含意演算子除去処理の動作の一実施例を示すフロー図である。
【図８】含意演算子を含む論理式を木構造で表した一実施例を示す図である。
【図９】図８に対応する論理式情報のデータ構造の一実施例を示す図である。
【図１０】二重否定演算子除去処理の動作の一実施例を示すフロー図である。
【図１１】二重否定演算子を含む論理式を木構造で表した一実施例を示す図である。
【図１２】図１１に対応する論理式情報のデータ構造の一実施例を示す図である。
【図１３】ドモルガンの処理の動作の一実施例を示すフロー図である。
【図１４】ドモルガンの処理を含む論理式を木構造で表した一実施例を示す図である。
【図１５】図１４に対応する論理式情報のデータ構造の一実施例を示す図である。
【図１６】限量子変換処理の動作の一実施例を示すフロー図である。
【図１７】限量子を含む論理式を木構造で表した一実施例を示す図である。
【図１８】図１７に対応する論理式情報のデータ構造の一実施例を示す図である。
【図１９】変換情報のデータ構造の一実施例を示す図である。
【図２０】変換部の動作の一実施例を示す図である。
【図２１】制約式を木構造で表した一実施例を示す図である。
【図２２】変換情報のデータ構造の一実施例を示す図である。
【図２３】変換情報を論理式情報に反映させた一実施例を示す図である。
【図２４】論理式情報の論理和標準形への変換の一実施例を示す図である。
【図２５】制御部の生成部と充足値生成部の動作の一実施例を示す図である。
【図２６】データセット情報のデータ構造の一実施例を示す図である。
【発明を実施するための形態】
【００２０】
実施の態様に示すテストデータの生成は、プログラムをテストする際に用いるプロパティに含まれる事前条件を表した論理式に全称記号または存在記号が含まれている場合、該論理式を否定標準形に変換して、全称記号を含まない論理式を生成する。次に、生成した論理式から存在記号を含む部分述語論理式を抽出する。
【００２１】
続いて、部分述語論理式により特定されるテーブルの行数を表す変数に代入される数値を用いて、最小値と、最大値と、最小値より大きく最大値より小さい範囲を決定する。そして、変数と最小値と最大値とその範囲とを用いて表される論理式各々を論理和で結び、制約式を生成する。また、部分述語論理式の存在記号を論理積に変換する。その後、部分述語論理式に関連して変数を用いて表される論理式と制約式とを変換した論理積で結ぶ。
【００２２】
続いて、事前条件の部分述語論理式を、論理積で結んで生成した論理式に変更し、変更した事前条件を論理和標準形に変換し、論理和ごとに変更した該事前条件を分割した部分論理式各々を生成する。
【００２３】
その後、事前条件に示されている入力変数に入力するデータと部分論理式各々とを組み合わせて入力として、ＳＭＴソルバを実行し、事前条件を充足する解を、部分論理式各々に対して求める。その結果、事前条件を表す論理式に全称記号や存在記号が含まれる場合でも、境界値制約を用いて、組み合わせ爆発を抑えたテストデータを生成することができる。
【００２４】
以下図面に基づいて、実施形態について詳細を説明する。
テストデータ生成装置１について説明する。
【００２５】
図１は、テストデータ生成装置のハードウェアの一実施例を示す図である。テストデータ生成装置１は、制御部２、記憶部３、記録媒体読取装置４、入出力インタフェース５（入出力Ｉ／Ｆ）、通信インタフェース６（通信Ｉ／Ｆ）などを備えている。また、上記各構成部はバス７によってそれぞれ接続されている。
【００２６】
制御部２は、後述する抽出部２０１、変換部２０２、生成部２０３、充足値生成部２０４などを有している。また、制御部２はCentral Processing Unit（ＣＰＵ）、マルチコアＣＰＵ、プログラマブルなデバイス（Field Programmable Gate Array（ＦＰＧＡ）、Programmable Logic Device（ＰＬＤ）など）を用いることが考えられる。
【００２７】
記憶部３は、後述するプロパティ情報、論理式情報、変換情報、テストデータ生成情報、データセット情報などを記憶している。記憶部３は、例えばRead Only Memory（ＲＯＭ）、Random Access Memory（ＲＡＭ）などのメモリやハードディスクなどが考えられる。なお、記憶部３にはパラメータ値、変数値などのデータを記録してもよいし、実行時のワークエリアとして用いてもよい。上記プロパティ情報、論理式情報、変換情報、テストデータ生成情報、データセット情報などは、データベースに記録されていてもよい。
【００２８】
記録媒体読取装置４は、制御部２の制御に従って記録媒体８に対するデータのリード／ライトを制御する。そして、記録媒体８に記録媒体読取装置４の制御で書き込まれたデータを記録させたり、記録媒体８に記録されたデータを読み取らせたりする。また、着脱可能な記録媒体８は、コンピュータで読み取り可能なnon-transitory（非一時的）な記録媒体として、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記録装置には、ハードディスク装置（ＨＤＤ）などがある。光ディスクには、Digital Versatile Disc（ＤＶＤ）、ＤＶＤ−ＲＡＭ、Compact Disc Read Only Memory（ＣＤ−ＲＯＭ）、ＣＤ−Ｒ(Recordable)／ＲＷ（ReWritable）などがある。光磁気記録媒体には、Magneto-Optical disk（ＭＯ）などがある。なお、記憶部３もnon-transitory（非一時的）な記録媒体に含まれる。
【００２９】
入出力インタフェース５には、入出力部９が接続され、利用者が入力した情報（例えば、プログラムや仕様などのデータ）を受信し、バス７を介して制御部２または記憶部３などに送信する。また、制御部２からの命令に従ってディスプレイの画面上に出力情報（プログラムのテスト結果やテストデータなど）や操作情報などを表示する。入出力部９の入力装置は、例えば、キーボード、ポインティングデバイス（マウスなど）、タッチパネルなどが考えられる。なお、入出力部９の出力部であるディスプレイは、例えば、液晶ディスプレイなどが考えられる。また、出力部はCathode Ray Tube（ＣＲＴ）ディスプレイ、プリンタなどの出力装置であってもよい。
【００３０】
通信インタフェース６は、Local Area Network（ＬＡＮ）接続やインターネット接続や無線接続を行うためのインタフェースである。また、通信インタフェース６は必要に応じ、他のコンピュータとの間のＬＡＮ接続やインターネット接続や無線接続を行うためのインタフェースである。また、他の装置に接続され、外部装置からのデータの入出力を制御する。
【００３１】
このようなハードウェア構成を有するコンピュータを用いることによって、後述する各種処理機能（例えば、図３、８、１２に示すフロー）が実現される。その場合システムが有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体８に記録しておくことができる。
【００３２】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの記録媒体８が販売される。また、プログラムをサーバコンピュータの記憶装置に記録しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【００３３】
プログラムを実行するコンピュータは、例えば、記録媒体８に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶部３に記録する。そして、コンピュータは、自己の記憶部３からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、記録媒体８から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【００３４】
図２は、テストデータ生成装置の一実施例を示す図である。
抽出部２０１は、否定標準形変換部２０６、木構造生成部２０５、存在記号付論理式抽出部２０７を有している。否定標準形変換部２０６は、記憶部３の後述するプロパティ情報からプロパティに含まれる事前条件を表す論理式を取得する。また、否定標準形変換部２０６は、事前条件を表す論理式に限量子を示す記号（全称記号または存在記号）がある場合に、該論理式を否定標準形に変換する。否定標準形への変換は、例えば、後述する含意記号除去処理と二重否定除去処理とドモルガンの法則を行う処理と限量子変換処理とを用いて行う。木構造生成部２０５は、否定標準形へ変換された論理式を木構造で表して後述する論理式情報に記憶する。存在記号付論理式抽出部２０７は、論理式情報に存在記号の存在する部分述語論理式があるか否かを判定し、存在記号の存在する論理式が場合に、論理式と論理式に関連付けられている情報を変換情報に記憶する。
【００３５】
変換部２０２は、同値クラス算出部２０８、存在記号なし論理式変換部２０９を有している。同値クラス算出部２０８は、変換情報から存在記号を有する論理式を選択し、存在記号を有する論理式により特定されるテーブルを参照して、設定された該テーブルの行数を取得する。また、同値クラス算出部２０８は、取得した行数を用いて同値クラスを求め、制約式を生成する。また、同値クラス算出部２０８が制約式を木構造で表し、変換情報に追加する。
【００３６】
存在記号なし論理式変換部２０９は、選択した存在記号を有する論理式を論理積に変換する。また、存在記号なし論理式変換部２０９は、選択されている変換した論理式と、追加された制約式を関連付ける。その後、存在記号なし論理式変換部２０９は、変換情報を論理式情報に反映させ、反映させた論理式情報を用いて、論理和標準形に変換し、論理和ごとに分割して部分論理式を生成して記憶部３に記憶する。
【００３７】
生成部２０３は、分割した論理式各々（部分論理式）と標準値情報を取得する。標準値情報は、アプリケーションが動作した際に必要な入力情報である。生成部２０３は、部分論理式各々と標準値情報を組み合わせてテストデータ生成情報を生成する。
【００３８】
充足値生成部２０４は、充足値生成部２０４がテストデータ生成情報を入力として、ＳＭＴソルバなどを用いて、テストデータ生成情報の論理式各々を充足する解（充足値）を求める。そして、生成部２０３は、テストデータ生成情報各々に対応する充足値であるテストデータ（後述するデータセット情報）を記憶部３に記憶する。
なお、充足値生成部２０４はテストデータ生成装置１以外のコンピュータに設けてもよい。
【００３９】
テストデータ生成装置の制御部の動作について説明する。
抽出部２０１の動作について説明する。図３は、制御部２の抽出部２０１の動作の一実施例を示す図である。ステップＳ１では、抽出部２０１の否定標準形変換部２０６が記憶部３のプロパティ情報からプロパティに含まれる事前条件を示す論理式を取得する。プロパティ情報は、例えば、仕様に基づいて作成されたプロパティが記憶されている。また、プロパティは「事前条件が成立する」ならば「事後条件となる」のような形式で記載された情報である。
【００４０】
一例として、図４に示す商品購入アプリケーションをテストする仕様のひとつのプロパティについて説明する。図４は、商品購入アプリケーションの商品購入画面の一実施例を示す図である。図４の商品購入画面４０１は、入出力部９の出力部であるディスプレイに表示される。会員ＩＤ入力ボックス４０２には会員ＩＤが入力される。注文明細表入力ボックス４０３には品名と購入数が入力される。本例の商品購入アプリケーションでは、５個の商品を購入することが可能で、注文明細表入力ボックス４０３には品名と購入数を入力するレコードが５行用意されている。メッセージ出力ボックス４０４には、品名または購入数の入力された状態に応じたメッセージが出力される。
【００４１】
商品購入アプリケーションを実行されると、会員ＩＤ入力ボックス４０２に会員ＩＤが入力されると、注文明細表入力ボックス４０３に品名と購入数を入力することができるようになる。すなわち、会員ＩＤ入力ボックス４０２に会員ＩＤが入力されると、記憶部３に記憶されている複数の会員ＩＤを参照して、入力された会員ＩＤと一致するか否かを判定する。一致する会員ＩＤが存在する場合には、注文明細表入力ボックス４０３に品名と購入数を入力することができるようにする。
【００４２】
続いて、注文明細表入力ボックス４０３の品名とその購入数が入力されると、記憶部３に記憶されている複数の品名を参照して、入力された品名と一致する品名を検索する。一致する品名が存在する場合には、品名に関連付けられて記憶部３に記憶されている商品ＩＤ単価を取得する。そして、注文明細表入力ボックス４０３には商品ＩＤ、品名、単価、購入数がすべて表示される。なお、備考欄に表示する項目があれば表示する。
【００４３】
また、注文明細表入力ボックス４０３のいずれかの行に、品名または購入数が入力されないときには、メッセージ出力ボックス４０４に品名または購入数が入力されていない主の内容を出力する。
【００４４】
上記で説明した商品購入アプリケーションをテストする仕様のひとつのプロパティとして、事前条件「会員ＩＤが入力されていて、注文明細表の品名か購入数が空の行がある」ならば、事後条件「メッセージに品名または購入数が入力されていないことを表示する」のようなプロパティが考えられる。
【００４５】
ステップＳ１では、論理式で表わされた上記事前条件を否定標準形変換部２０６が取得する。
【００４６】
事前条件を論理式で表した例
not(会員ID=“”) and
(∃r(i)∈注文明細,r(i).購入数=“” or r(i).品名=“”)
【００４７】
なお、本例の論理式おいて、「not(会員ID = “”)」は、事前条件の「会員ＩＤが入力されていて」に相当し、「(∃r(i)∈注文明細, r(i).購入数=“” or r(i).品名=“”)」は、事前条件の「注文明細表の購入数か品名が空の行がある」に相当する。なお、本例では「not」は否定を示し、「“”」はデータが入力されていないことを示し、「and」は論理積を示している。また、「∃」は存在記号を示し、「∃r(i) ∈注文明細」（部分述語論理式）は、注文明細という名称の記憶部に記憶されているテーブルには少なくともｉ行のレコードが存在することを示している。「r(i).購入数=“” or r(i).品名=“”)」は、ｉ行のレコード各々に含まれている商品の購入数を示すセルに入力がないこと、または、ｉ行のレコード各々に含まれている品名を示すセルに入力がないことを示している。「or」は論理和を示している。なお、プロパティの「ならば」は例えば「→」と表す。また、事後条件も「メッセージに品名または購入数が入力されていない表示する」は、例えば、「メッセージ = “品名または購入数が入力されていない”」と表す。
【００４８】
ステップＳ２では、木構造生成部２０５が論理式を木構造で表して論理式情報に記憶する。図５は、論理式を木構造で表した一実施例を示す図である。図６は、論理式情報のデータ構造の一実施例を示す図である。
【００４９】
木構造の生成について説明する。図５は、上記事前条件を論理式「not(会員ID=“”) and (∃r(i)∈注文明細,r(i).購入数=“” or r(i).品名=“”)」を木構造で表した例である。
【００５０】
論理式で使用されている演算子「not」「and」「or」を抽出し、「not」「and」「or」各々に直接関係する要素を検出する。論理式の「not」に関連する要素は「(会員ID=“”)」である。論理式の「and」に関連する要素は「not(会員ID=“”)」と「(∃r(i)∈注文明細,r(i).購入数=“” or r(i).品名=“”)」である。論理式の「or」に関連する要素は「∃r(i)∈注文明細,r(i).購入数=“”」と「∃r(i)∈注文明細,r(i).品名=“”」である。
【００５１】
上記検出の結果、「and」に関連する要素は、「not」に関連する要素と「or」に関連する要素をすべて含んでいるので、「and」（∧）を木の頂点のノード０とする。
【００５２】
次に、「and」の左側の「not(会員ID=“”)」と「(∃r(i)∈注文明細,r(i).購入数=“” or r(i).品名=“”)」をノードに分ける。「not」（¬）をノード１とし、「(会員ID)」（“会員ID”）をノード５とし、「=」（＝＝）をノード３とし、「“”」をノード６とする。「(∃r(i)∈注文明細)」はひとつの要素として扱いノード２とする。「r(i).購入数」をノード９とし、「=」（＝＝）をノード７とし、「“”」をノード１０とし、「or」（∨）をノード４とし、「r(i).品名」をノード１１とし、「=」（＝＝）をノード８とし、「“”」をノード１２とする。
【００５３】
本例では、上記のように木構造を生成したが限定されるものではない。
論理式情報について説明する。
【００５４】
図６は、論理式情報のデータ構造の一実施例を示す図である。図６の論理式情報６０１は、図５に示した木構造を記憶部３に記憶した例である。論理式情報６０１は、ノード番号の情報を記憶する「Ｎｏ」、変数名、数値、文字列などが記憶される「値」、演算子や存在記号を含む論理式の情報を記憶する「演算子、限量子」を有する。また、「演算子、限量子」に関連するノードの情報を記憶する「左ノード」「右ノード」を有する。「左ノード」には演算子や存在記号を含む論理式の左側に存在するノード番号が記憶され、「右ノード」には演算子や存在記号を含む論理式の右側に存在するノード番号が記憶される。
【００５５】
本例では、「Ｎｏ」にはノード「０」「１」「２」・・・「１２」が記憶されている。
「値」には、Ｎｏ「５」に関連付けられて文字列「“会員ID”」が、Ｎｏ「６」に関連付けられて空「“”」（文字列に含まれる）が記憶されている。また、Ｎｏ「９」に関連付けられて数値「r(i).購入数」が、Ｎｏ「６」に関連付けられて空「“”」（文字列に含まれる）が記憶されている。また、Ｎｏ「１１」に関連付けられて数値「r(i).品名」が、Ｎｏ「１２」に関連付けられて空「“”」（文字列に含まれる）が記憶されている。
【００５６】
「演算子、限量子」には、Ｎｏ「０」に関連付けられて論理積記号「∧」が記憶され、Ｎｏ「１」に関連付けられて否定記号「¬」が記憶され、Ｎｏ「２」に関連付けられて存在記号を含む論理式の情報「∃r(i)∈注文明細」が記憶されている。Ｎｏ「３」に関連付けられて等号記号「＝＝」が記憶され、Ｎｏ「４」に関連付けられて論理積記号「∨」が記憶されている。
【００５７】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられてＮｏを示す「１」「３」「４」「５」「７」「９」「１１」が記憶されている。
【００５８】
「右ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられてＮｏを示す「２」「６」「８」「１０」「１２」が記憶されている。
【００５９】
ステップＳ３では、否定標準形変換部２０６が論理式を否定標準形に変換する。否定標準形への変換は、例えば、含意演算子除去、二重否定演算子除去、ドモルガンの法則、限量子変換を用いて行う。
【００６０】
事前条件を示す論理式を否定標準形に変換する方法として、論理式に含意記号がある場合にはまず含意記号をとる含意除去処理を行う。次に、ドモルガンの法則を用いた処理を行い、否定記号を内側に押し込む操作を繰り返すことによって、論理的に等価な否定標準形に置き換える。その結果、変形した論理式に二重否定（¬¬：否定記号が連続している）が表れたときは二重否定を除去する処理を行う。そして、上記限量子変換の例の変換前に示した¬∀ｘＳ１に当てはまる箇所がある場合には、∃ｘ¬Ｓ１の形に変形する。
【００６１】
上記に示した処理を繰り返し、全称記号がない否定標準形に変換された論理式が求まると処理を終了する。
【００６２】
含意演算子除去の処理について説明する。
含意演算子除去の例
Ｓ１→Ｓ２（変換前）
¬Ｓ１∨Ｓ２（変換後）
「Ｓ１」と「Ｓ２」は要素または論理式などを示し、「→」は含意演算子を示し、「¬」は否定演算子を示し、「∨」は論理和記号を示す記号である。
【００６３】
図７は、含意演算子除去処理の動作の一実施例を示すフロー図である。図８は、含意演算子を含む論理式を木構造で表した一実施例を示す図である。図９は、図８に対応する論理式情報のデータ構造の一実施例を示す図である。
【００６４】
ステップＳ２０１では、否定標準形変換部２０６が含意演算子を含む論理式情報の最初の行（図８の論理式の木構造の最上位のノード）から順に、含意演算子を検索する。例えば、図９の「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「含意（→）」があるノードを検索する。
【００６５】
図８に示す木構造は、含意演算子除去の例のＳ１→Ｓ２（変換前）を示す木構造と、含意演算子除去の例の¬Ｓ１∨Ｓ２（変換後）を示す木構造を示している。
【００６６】
図９に示す論理式情報９１は、含意演算子除去の例のＳ１→Ｓ２（変換前）を示す情報で、論理式情報９２は、含意演算子除去の例の¬Ｓ１∨Ｓ２（変換後）を示す情報である。論理式情報９１、９２は、「Ｎｏ」「値」「演算子、限量子」「左ノード」「右ノード」に記憶される情報を有している。論理式情報９１、９２の「Ｎｏ」には、例えば、ノードを示す情報が記憶されている。本例では、ノードを示す情報として連番「０」「１」「２」・・・が記憶されている。
【００６７】
「値」には、「Ｎｏ」に関連付けられた要素が記憶されている。論理式情報９１では、Ｎｏ「１」に関連付けられて要素「Ｓ１」が記憶されている。また、Ｎｏ「２」に関連付けられて要素「Ｓ２」が記憶されている。本例では、要素Ｓ１、Ｓ２は木構造の末端のノードであると考えて値が記憶されているが、要素Ｓ１、Ｓ２が論理式である場合（末端のノードでない場合）には、要素Ｓ１、Ｓ２は記憶されない。また、末端のノードでない場合には、後述する「演算子、限量子」「左ノード」「右ノード」に、ノードに関連付けられている論理式に対応付けられる情報各々が記憶される。その場合、「Ｎｏ」のノード「２」以降にも論理式を表現するためのノードを示す情報と、該「Ｎｏ」に関連する「値」「演算子、限量子」「左ノード」「右ノード」が追加される。
【００６８】
「演算子、限量子」には、演算子や限量子を有する情報が記憶されている。論理式情報９１では、Ｎｏ「０」に関連付けられて含意演算子「→」が記憶され、論理式情報９２では、Ｎｏ「０」に関連付けられて論理和「∨」が記憶され、Ｎｏ「３」に関連付けられて否定演算子「¬」が記憶されている。
【００６９】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。本例では、Ｎｏ「０」に関連付けられて「１」が記憶されている。
【００７０】
「右ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。本例では、Ｎｏ「０」に関連付けられて「２」が記憶されている。
【００７１】
ステップＳ２０１では、否定標準形変換部２０６が図８に示す含意演算子を含む論理式の木構造の最上位のノード０、つまり図９に示すＮｏ「０」のノードから順に「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「含意（→）」があるノードを検索する。
【００７２】
ステップＳ２０２では、否定標準形変換部２０６が論理式情報を検索して含意演算子（→）が検出できたか否かを判定し、含意演算子（→）がある場合、ステップＳ２０３（Ｙｅｓ）に移行し、含意演算子（→）がない場合にはこの処理を終了する。本例では、論理式情報９１の「演算子、限量子」に含意演算子「→」があるのでステップＳ２０３（Ｙｅｓ）に移行する。
【００７３】
ステップＳ２０３では、否定標準形変換部２０６が論理式情報９１に示す「左ノード」の項目の値を記憶部３の図示しない左ノードに記憶されている情報を退避領域に記憶する。本例では、論理式情報９１の「左ノード」の「ｓ１」が退避領域に記憶される。
【００７４】
ステップＳ２０４では、否定標準形変換部２０６が記憶部３に記憶された、ノードの「演算子、限量子」の項目値を、含意演算子「→」から論理和「∨」に更新する。本例では、図４の論理式情報９１のＮｏ「０」の行の「演算子、限量子」の「→」が論理和「∨」に更新され、図４の論理式情報９２のＮｏ「０」に対応する行の「演算子、限量子」のように論理和「∨」となる。
【００７５】
ステップＳ２０５では、否定標準形変換部２０６が更新した論理和「∨」に対応する行の「左ノード」の情報を、新しい番号に更新する。例えば、新しい番号として「左ノード」の情報を、「Ｎｏ」に記憶されている情報としてまだ使用されていない情報にする。本例では、論理式情報９１の「Ｎｏ」で使用している最大値「２」に１を加算して「３」を求め、論理式情報９１の「左ノード」の「２」を「３」に更新し、論理式情報９２のＮｏ「０」の行のようになる。
【００７６】
ステップＳ２０６では、否定標準形変換部２０６が新しい行を追加する。例えば、新しい行の「Ｎｏ」には、ステップＳ２０５の処理で作成した新しい番号が記憶され、「演算子、限量子」に否定演算子「¬」が記憶される。また、「左ノード」には、ステップＳ２０３で退避領域に記憶した情報を記憶する。それぞれ格納した新しいノードのデータを生成し、記憶部３に追加格納する。本例では、新しい行の「Ｎｏ」に「３」が記憶され、「演算子、限量子」に否定演算子「¬」が記憶され、「左ノード」に「１」が記憶される。
【００７７】
二重否定演算子除去の処理について説明する。
二重否定演算子除去の例
¬¬Ｓ１（変換前）
Ｓ１    （変換後）
【００７８】
図１０は、二重否定演算子除去処理の動作の一実施例を示すフロー図である。図１１は、二重否定演算子を含む論理式を木構造で表した一実施例を示す図である。図１２は、図１１に対応する論理式情報のデータ構造の一実施例を示す図である。
【００７９】
ステップＳ３０１では、否定標準形変換部２０６が二重否定演算子を含む論理式情報の最初の行（図１１の論理式の木構造の最上位のノード）から順に、二重否定演算子を検索する。例えば、図１２の「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「二重否定（¬¬）」がある部分木を検索する。
【００８０】
図１１に示す木構造は、二重否定演算子除去の例の¬¬Ｓ１（変換前）を示す木構造と、二重否定演算子除去の例のＳ１（変換後）を示す木構造を示している。
【００８１】
図１２に示す論理式情報１２１は、二重否定演算子除去の例の¬¬Ｓ１（変換前）を示す情報で、論理式情報９２は、二重否定演算子除去の例のＳ１（変換後）を示す情報である。
【００８２】
論理式情報１２１、１２２は、「Ｎｏ」「値」「演算子、限量子」「左ノード」「右ノード」に記憶される情報を有している。論理式情報１２１、１２２の「Ｎｏ」には、例えば、ノードを示す情報が記憶されている。本例では、ノードを示す情報として連番「０」「１」「２」・・・が記憶されている。
【００８３】
「値」には、「Ｎｏ」に関連付けられた要素が記憶されている。論理式情報１２１では、Ｎｏ「１」に関連付けられて要素「Ｓ１」が記憶されている。本例では、要素Ｓ１は木構造の末端のノードであると考えて値が記憶されているが、要素Ｓ１が論理式である場合（末端のノードでない場合）には、要素Ｓ１は記憶されない。また、末端のノードでない場合には、後述する「演算子、限量子」「左ノード」「右ノード」に、ノードに関連付けられている論理式に対応付けられる情報各々が記憶される。その場合、「Ｎｏ」のノード「２」以降にも論理式を表現するためのノードを示す情報と、該「Ｎｏ」に関連する「値」「演算子、限量子」「左ノード」「右ノード」が追加される。
【００８４】
「演算子、限量子」には、演算子や限量子を有する情報が記憶されている。論理式情報１２１では、Ｎｏ「０」に関連付けられて否定演算子「¬」が記憶されている。
【００８５】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。本例では、Ｎｏ「０」に関連付けられて「１」が記憶され、Ｎｏ「１」に関連付けられて「２」が記憶され。
【００８６】
「右ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。
【００８７】
ステップＳ３０１では、否定標準形変換部２０６が図１１に示す二重否定演算子を含む論理式の木構造の最上位のノード０、つまり図１２に示すＮｏ「０」のノードから順に「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「否定（¬）」が２つ連続する二重否定を検索する。
【００８８】
ステップＳ３０２では、否定標準形変換部２０６が論理式情報を検索して二重否定演算子（¬¬）が検出できたか否かを判定し、二重否定演算子（¬¬）がある場合、ステップＳ３０３（Ｙｅｓ）に移行し、二重否定演算子（¬¬）がない場合にはこの処理を終了する。本例では、論理式情報１２１の「演算子、限量子」に二重否定演算子「¬¬」があるのでステップＳ３０３（Ｙｅｓ）に移行する。
【００８９】
ステップＳ３０３では、否定標準形変換部２０６が検出された部分木「¬¬」の、下位のノードの下位にあるノードのＮｏ以外（「値」「演算子、限量子」「左ノード」「右ノード」）の情報を取得する。本例では、図１１の二重否定演算子のノード１に対応する論理式情報１２１のＮｏ「１」の下位にあるＮｏ「２」に対応する「値」「演算子、限量子」「左ノード」「右ノード」の情報を取得する。論理式情報１２１の場合、「演算子、限量子」の「Ｓ１」を取得する。
【００９０】
ステップＳ３０４では、否定標準形変換部２０６が検出された部分木の上位のノードに、ステップＳ３０３で取得した情報を記憶し、更新する。本例では、論理式情報１２２のＮｏ「０」に、取得した情報「演算子、限量子」の「Ｓ１」を記憶する。
【００９１】
また、ステップＳ３０４では、上記更新が終了した後、否定標準形変換部２０６が検出された部分木の上位のノード以外の情報を削除する。本例では、論理式情報１２２のＮｏ「１」「２」に対応する行それぞれを削除する。
【００９２】
ドモルガンの処理について説明する。
ドモルガンの処理の例
¬（Ｓ１∧Ｓ２）（変換前）
¬Ｓ１∨¬Ｓ２  （変換後）
または、
¬（Ｓ１∨Ｓ２）（変換前）
¬Ｓ１∧¬Ｓ２  （変換後）
【００９３】
図１３は、ドモルガンの処理の動作の一実施例を示すフロー図である。図１４は、ドモルガンの処理を含む論理式を木構造で表した一実施例を示す図である。図１５は、図１４に対応する論理式情報のデータ構造の一実施例を示す図である。
【００９４】
ステップＳ４０１では、否定標準形変換部２０６が「否定（¬）」と論理演算子（「論理和（∨）」又は「論理積（∧）」）とが連続する論理式情報の最初の行から順に検索をする。例えば、図１４に示す「¬（Ｓ１∧Ｓ２）」や「¬（Ｓ１∨Ｓ２）」の論理式の木構造の最上位のノード０から検索をする。また、図１５の「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「否定（¬）」と論理演算子（「論理和（∨）」又は「論理積（∧）」）とが連続する部分木を検索する。
【００９５】
図１４に示す木構造は、ドモルガンの処理の例の¬（Ｓ１∧Ｓ２）（変換前）を示す木構造と、ドモルガンの処理の例の¬Ｓ１∨¬Ｓ２（変換後）を示す木構造を示している。または、ドモルガンの処理の例の¬（Ｓ１∨Ｓ２）（変換前）を示す木構造と、ドモルガンの処理の例の¬Ｓ１∧¬Ｓ２（変換後）を示す木構造を示している。
【００９６】
図１５に示す論理式情報１５１は、ドモルガンの処理の例の¬（Ｓ１∧Ｓ２）（変換前）を示す情報で、論理式情報１５２は、ドモルガンの処理の例の¬Ｓ１∨¬Ｓ２（変換後）を示す情報である。図１５に示す論理式情報１５３は、ドモルガンの処理の例の¬（Ｓ１∨Ｓ２）（変換前）を示す情報で、論理式情報１５４は、ドモルガンの処理の例の¬Ｓ１∧¬Ｓ２（変換後）を示す情報である。
【００９７】
論理式情報１５１〜１５４は、「Ｎｏ」「値」「演算子、限量子」「左ノード」「右ノード」に記憶される情報を有している。論理式情報１５１〜１５４の「Ｎｏ」には、例えば、ノードを示す情報が記憶されている。本例では、ノードを示す情報として連番「０」「１」「２」・・・が記憶されている。
【００９８】
「値」には、「Ｎｏ」に関連付けられた要素が記憶されている。論理式情報１５１〜１５４では、Ｎｏ「２」「３」に関連付けられて要素「Ｓ１」「Ｓ２」が記憶されている。本例では、要素Ｓ１、Ｓ２は木構造の末端のノードであると考えて値が記憶されているが、要素Ｓ１、Ｓ２が論理式である場合（末端のノードでない場合）には、要素Ｓ１、Ｓ２は記憶されない。また、末端のノードでない場合には、後述する「演算子、限量子」「左ノード」「右ノード」に、ノードに関連付けられている論理式に対応付けられる情報各々が記憶される。その場合、「Ｎｏ」のノード「２」以降にも論理式を表現するためのノードを示す情報と、該「Ｎｏ」に関連する「値」「演算子、限量子」「左ノード」「右ノード」が追加される。
【００９９】
「演算子、限量子」には、演算子や限量子を有する情報が記憶されている。論理式情報１５１では、Ｎｏ「０」に関連付けられて否定演算子「¬」が記憶され、Ｎｏ「１」に関連付けられて論理積（∧）が記憶されている。論理式情報１５２では、Ｎｏ「０」に関連付けられて論理和（∨）が記憶され、Ｎｏ「４」「５」に関連付けられて否定演算子「¬」がそれぞれ記憶されている。論理式情報１５３では、Ｎｏ「０」に関連付けられて否定演算子「¬」が記憶され、Ｎｏ「１」に関連付けられて論理和（∨）が記憶されている。論理式情報１５４では、Ｎｏ「０」に関連付けられて論理積（∧）が記憶され、Ｎｏ「４」「５」に関連付けられて否定演算子「¬」がそれぞれ記憶されている。
【０１００】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。本例では、論理式情報１５１ではＮｏ「０」に関連付けられて「１」が記憶され、Ｎｏ「１」に関連付けられて「２」が記憶されている。論理式情報１５２ではＮｏ「０」に関連付けられて「４」が記憶され、Ｎｏ「４」に関連付けられて「２」が記憶され、Ｎｏ「５」に関連付けられて「３」が記憶されている。論理式情報１５３ではＮｏ「０」に関連付けられて「１」が記憶され、Ｎｏ「１」に関連付けられて「２」が記憶されている。論理式情報１５４ではＮｏ「０」に関連付けられて「４」が記憶され、Ｎｏ「４」に関連付けられて「２」が記憶され、Ｎｏ「５」に関連付けられて「３」が記憶されている。
【０１０１】
「右ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。本例では、論理式情報１５１ではＮｏ「１」に関連付けられて「３」が記憶されている。論理式情報１５２ではＮｏ「０」に関連付けられて「５」が記憶されている。本例では、論理式情報１５３ではＮｏ「１」に関連付けられて「３」が記憶されている。論理式情報１５４ではＮｏ「０」に関連付けられて「５」が記憶されている。
【０１０２】
ステップＳ４０１では、否定標準形変換部２０６が図１４に示す否定演算子を含む論理式の木構造の最上位のノード０、つまり図１５に示すＮｏ「０」のノードから順に「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に「否定（¬）」と論理演算子（「論理和（∨）」又は「論理積（∧）」）とが連続する部分木を検索する。
【０１０３】
ステップＳ４０２では、否定標準形変換部２０６が「演算子、限量子」に「否定（¬）」と論理演算子（「論理和（∨）」又は「論理積（∧）」）とが連続する部分木が検出できたか否かを判定する。検出できた場合、ステップＳ４０３（Ｙｅｓ）に移行し、検出できない場合、この処理を終了する。
【０１０４】
ステップＳ４０３では、否定標準形変換部２０６が「否定（¬）」の下位の論理演算子が「論理和（∨）」か否かを判定し、「論理和（∨）」である場合にはステップＳ４０４（Ｙｅｓ）に移行し、「論理積（∧）」である場合にはステップＳ４０５（Ｎｏ）に移行する。
【０１０５】
ステップＳ４０４では、否定標準形変換部２０６が検出された部分木の上位のノードである否定演算子（¬）を論理和（∨）に更新する。
【０１０６】
一方、ステップＳ４０５では、否定標準形変換部２０６が検出された部分木の上位のノードである否定演算子（¬）を論理積（∧）に更新する。
【０１０７】
ステップＳ４０６では、否定標準形変換部２０６が検出された部分木の下位ノード、つまり論理演算子（「論理和（∨）」又は「論理積（∧）」）の「左ノード」および「右ノード」の情報を取得する。図１５に示す論理式情報１５１では、「左ノード」の「２」、「右ノード」の「３」を取得する。また、図１５に示す論理式情報１５３では、「左ノード」の「２」、「右ノード」の「３」を取得する。
【０１０８】
ステップＳ４０７では、否定標準形変換部２０６がステップＳ４０４又はステップＳ４０５で処理した上位ノードの「左ノード」及び「右ノード」の情報をそれぞれ新しい番号に更新する。例えば、図１５に示す論理式情報１５２および１５４では「左ノード」の新しい番号として、「Ｎｏ」の情報の最大値に１加算した値「４」、「右ノード」の新しい番号として、「左ノード」の新しい番号に更に１加算した値「５」を記憶することが考えられる。
【０１０９】
ステップＳ４０８では、否定標準形変換部２０６がステップＳ４０７で追加した上位の「左ノード」に記憶した新しい番号を「Ｎｏ」に追加する。例えば、図１５に示す論理式情報１５１、１５３の「Ｎｏ」に新しい番号「４」を追加する。新しい番号を追加した「Ｎｏ」に対応する「演算子、限量子」には「否定（¬）」を記憶する。また、「左ノード」にはステップＳ４０６で取得した「左ノード」の情報を記憶する。例えば、図１５に示す論理式情報１５２、１５４に示すように、Ｎｏ「４」に対応する「左ノード」にステップＳ４０６で取得した「２」を追加する。
【０１１０】
ステップＳ４０９では、否定標準形変換部２０６がステップＳ４０７で追加した上位の「右ノード」に記憶した新しい番号を「Ｎｏ」に追加する。例えば、図１５に示す論理式情報１５１、１５３の「Ｎｏ」に新しい番号「５」を追加する。新しい番号を追加した「Ｎｏ」に対応する「演算子、限量子」には「否定（¬）」を記憶する。また、「左ノード」にはステップＳ４０６で取得した「右ノード」の情報を記憶する。例えば、図１５に示す論理式情報１５２、１５４に示すように、Ｎｏ「５」に対応する「右ノード」にステップＳ４０６で取得した「３」を追加する。
【０１１１】
このように、否定標準形変換部２０６は、処理対象の木構造の論理式データについて、「演算子、限量子」の情報が「否定（¬）」と論理演算子（「論理和（∨）」又は「論理積（∧）」）が連続する部分木が検出できなくなるまで、ドモルガンの法則に基づく論理式の否定標準形への変換の処理を繰り返し実行する。
【０１１２】
限量子変換の処理について説明する。
限量子変換の例
¬∀ｘＳ１（変換前）
∃ｘ¬Ｓ１（変換後）
または、
¬∃ｘＳ１（変換前）
∀ｘ¬Ｓ１（変換後）
「∀ｘ」は全称記号を示し、「∃ｘ」は存在記号を示している。
【０１１３】
図１６は、限量子変換処理の動作の一実施例を示すフロー図である。図１７は、限量子を含む論理式を木構造で表した一実施例を示す図である。図１８は、図１７に対応する論理式情報のデータ構造の一実施例を示す図である。
【０１１４】
ステップＳ５０１では、否定標準形変換部２０６が否定演算子（¬）つき限量子を含む論理式情報の最初の行（図１７の論理式の木構造の最上位のノード）から順に、否定演算子（¬）つき限量子を検索する。例えば、図１８の「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、「演算子、限量子」に否定演算子（¬）つき限量子があるノードを検索する。
【０１１５】
図１７に示す木構造は、限量子変換の例の¬∀ｘＳ１（変換前）を示す木構造と、限量子変換の例の∃ｘ¬Ｓ１（変換後）を示す木構造を示している。また、限量子変換の例の¬∃ｘＳ１（変換前）を示す木構造と、限量子変換の例の∀ｘ¬Ｓ１（変換後）を示す木構造を示している。
【０１１６】
図１８に示す論理式情報１８１は、限量子変換の例の¬∀ｘＳ１（変換前）を示す情報で、論理式情報１８２は、限量子変換の例の∃ｘ¬Ｓ１（変換後）を示す情報である。また、図１８に示す論理式情報１８３は、限量子変換の例の¬∃ｘＳ１（変換前）を示す情報で、論理式情報１８４は、限量子変換の例の∀ｘ¬Ｓ１（変換後）を示す木構造を示す情報である。
【０１１７】
論理式情報１８１〜１８４は、「Ｎｏ」「値」「演算子、限量子」「左ノード」「右ノード」に記憶される情報を有している。論理式情報１８１〜１８４の「Ｎｏ」には、例えば、ノードを示す情報が記憶されている。本例では、ノードを示す情報として連番「０」「１」「２」・・・が記憶されている。
【０１１８】
「値」には、「Ｎｏ」に関連付けられた要素が記憶されている。論理式情報１８１〜１８４では、Ｎｏ「２」に関連付けられて要素「Ｓ１」が記憶されている。本例では、要素Ｓ１は木構造の末端のノードであると考えて値が記憶されているが、要素Ｓ１が論理式である場合（末端のノードでない場合）には、要素Ｓ１は記憶されない。また、末端のノードでない場合には、後述する「演算子、限量子」「左ノード」「右ノード」に、ノードに関連付けられている論理式に対応付けられる情報各々が記憶される。その場合、「Ｎｏ」のノード「２」以降にも論理式を表現するためのノードを示す情報と、該「Ｎｏ」に関連する「値」「演算子、限量子」「左ノード」「右ノード」が追加される。
【０１１９】
「演算子、限量子」には、演算子や限量子を有する情報が記憶されている。論理式情報１８１では、Ｎｏ「０」に関連付けられて否定演算子（¬）が記憶され、Ｎｏ「１」に関連付けられて全称記号「∀ｘ」が記憶されている。論理式情報１８２では、Ｎｏ「０」に関連付けられて存在記号「∃ｘ」が記憶され、Ｎｏ「１」に関連付けられて否定演算子（¬）が記憶されている。論理式情報１８３では、Ｎｏ「０」に関連付けられて否定演算子（¬）が記憶され、Ｎｏ「１」に関連付けられて存在記号「∃ｘ」が記憶されている。論理式情報１８４では、Ｎｏ「０」に関連付けられて全称記号「∀ｘ」が記憶され、Ｎｏ「１」に関連付けられて否定演算子（¬）が記憶されている。
【０１２０】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられているノードを示す情報が記憶されている。論理式情報１８１〜１８４では、Ｎｏ「０」に関連付けられて「１」が記憶され、Ｎｏ「１」に関連付けられて「２」が記憶されている。
【０１２１】
ステップＳ５０１では、否定標準形変換部２０６が図１７に示す否定演算子（¬）つき限量子を含む論理式の木構造の最上位のノード０、つまり図１８に示すＮｏ「０」のノードから順に「左ノード」および「右ノード」に記憶された情報（ポインタ）を辿りながら、否定演算子（¬）つき限量子があるノードを検索する。
【０１２２】
ステップＳ５０２では、否定標準形変換部２０６が論理式情報を検索して否定演算子（¬）つき限量子が検出されたか否かを判定し、否定演算子（¬）つき限量子を含む論理式がある場合、ステップＳ５０３（Ｙｅｓ）に移行する。否定演算子（¬）つき限量子を含む論理式がない場合にはこの処理を終了する。本例では、論理式情報１８１、１８３の「演算子、限量子」に否定演算子（¬）つき限量子があるのでステップＳ５０３（Ｙｅｓ）に移行する。
【０１２３】
ステップＳ５０３では、否定標準形変換部２０６が否定演算子（¬）つき限量子を、否定演算子（¬）なし限量子に変更する。論理式情報１８１の場合、Ｎｏ「０」に対応する否定演算子（¬）を存在記号「∃ｘ」に変更する。Ｎｏ「１」に対応する全称記号「∀ｘ」を否定演算子（¬）に変換して、論理式情報１８２のようにする。論理式情報１８３の場合、Ｎｏ「０」に対応する否定演算子（¬）を全称記号「∀ｘ」に変更する。Ｎｏ「１」に対応する存在記号「∃ｘ」を否定演算子（¬）に変換して、論理式情報１８４のようにする。
【０１２４】
「∀ｘＳ１」が存在する場合について説明する。
Ｓ１が｛ｓ１，ｓ２，ｓ３｝などの要素を有している場合、「∀ｘＳ１」を検出した場合には「ｓ１∧ｓ２∧ｓ３」に変換する。この変換は既知の技術である。
【０１２５】
論理式１を否定標準形に変換する例について説明する。
なお、Ｐ（ｘ）は限量子内論理式とする。
【０１２６】
（（∀ｘ.Ｐ（ｘ）→ａ）∨¬ｂ）→ｃ        （論理式１）
上記論理式１に対して含意除去処理を行い論理式２に変形する。
¬（（∀ｘ.Ｐ（ｘ）→ａ）∨¬ｂ）∨ｃ      （論理式２）
上記論理式２に対して含意除去処理を行い論理式３に変形する。
【０１２７】
¬（（∀ｘ.¬Ｐ（ｘ）∨ａ）∨¬ｂ）∨ｃ    （論理式３）
上記論理式３に対してドモルガンの法則を用いた処理を行い論理式４に変形する。
【０１２８】
(¬（∀ｘ.¬Ｐ（ｘ）∨ａ）∧¬¬ｂ)∨ｃ    （論理式４）
上記論理式４に対して二重否定除去の処理を行い論理式５に変形する。
【０１２９】
（¬（∀ｘ.¬Ｐ（ｘ）∨ａ）∧ｂ）∨ｃ      （論理式５）
上記論理式４に対して全称子記号を存在子記号に変換する処理を行い論理式５に変形する。
（（∃ｘ.¬（¬Ｐ（ｘ）∨ａ））∧ｂ）∨ｃ  （論理式６）
上記論理式６に対してドモルガンの法則を用いた処理を行い論理式７に変形する。
（（∃ｘ.¬¬Ｐ（ｘ）∧¬ａ）∧ｂ）∨ｃ    （論理式７）
上記論理式７に対して二重否定除去の処理を行い論理式８に変形する。
（（∃ｘ.Ｐ（ｘ）∧¬ａ）∧ｂ）∨ｃ        （論理式８）
【０１３０】
ステップＳ４では、存在記号付論理式抽出部２０７が論理式情報の１行目を選択する。本例では、Ｎｏ「０」の行を選択する。
【０１３１】
ステップＳ５では、存在記号付論理式抽出部２０７が現在選択されている行の論理式の「演算子、限量子」を参照し、論理式に存在記号があるか否かを判定し、ある場合にはステップＳ６（Ｙｅｓ）に移行し、ない場合にはステップＳ８（Ｎｏ）に移行する。本例では、Ｎｏ「２」の行が選択された場合に「∃r(i)∈注文明細」があるので、存在記号があると判定してステップＳ６（Ｙｅｓ）に移行する。
【０１３２】
ステップＳ６では、存在記号付論理式抽出部２０７が存在記号の存在する行を変換情報に記憶する。本例では、Ｎｏ「２」の行を変換情報に記憶する。図１９は、変換情報のデータ構造の一実施例を示す図である。変換情報７０１は、ノード番号の情報を記憶する「Ｎｏ」、変数名、数値、文字列などが記憶される「値」、演算子や存在記号を含む論理式の情報を記憶する「演算子、限量子」を有する。また、「演算子、限量子」に関連するノードの情報を記憶する「左ノード」「右ノード」を有する。「左ノード」には演算子や存在記号を含む論理式の左側に存在するノード番号が記憶され、「右ノード」には演算子や存在記号を含む論理式の右側に存在するノード番号が記憶される。
【０１３３】
ステップＳ７では、存在記号付論理式抽出部２０７が論理式情報に未選択の行があるか否かを判定し、未選択の行がある場合にはステップＳ８（Ｙｅｓ）に移行し、未選択の行がない場合には抽出処理を終了（Ｎｏ）する。
【０１３４】
ステップＳ８では、存在記号付論理式抽出部２０７が論理式情報の現在選択されている行の次の行を選択する。
【０１３５】
なお、本例では１行目から順に存在記号を有する論理式を参照しているが、限定されるものではない。
【０１３６】
変換部２０２の動作について説明する。
図２０は、制御部２の変換部２０２の動作の一実施例を示す図である。ステップＳ９では、同値クラス算出部２０８が変換情報から存在記号を有する論理式を選択する。
【０１３７】
ステップＳ１０では、選択した存在記号を有する論理式により特定されるテーブルに対し、設定された該テーブルの行数を取得する。例えば、「∃r(i)∈注文明細」の場合、注文明細に関連付けられて、記憶部３に記憶されているテーブルを特定するとともに、該テーブルの行数に関連付けられて記憶部３に記憶されている「ｉ」を特定する。「ｉ」には、例えば、記憶部３に記憶されている注文明細のレコード長を決定する「５」が関連付けられているとする。ただし、注文明細のレコード長は「５」に限定されるものではない。
【０１３８】
ステップＳ１１では、同値クラス算出部２０８が取得した行数を用いて同値クラスを求め、制約式を生成する。例えば、同値クラスは注文明細のテーブルの行数ｉのとり得る範囲の最小値と最大値と中間値を求める。注文明細のレコード長として現在ｉ＝５が記憶されているとすれば、同値クラスは最小値ｉ＝０、最大値ｉ＝４、中間値のとり得る範囲＝０＜ｉ＜４となる。そして、求めた最大値と最小値と中間値とを論理和で結び、制約式を生成し変形する。
【０１３９】
制約式の例
(i=0) or (i=4) or (0<i<4)              （制約式）
(i=0) or (i=4) or ((0<i) and (i<4))
【０１４０】
ステップＳ１２では、同値クラス算出部２０８が制約式を木構造で表し、変換情報に追加する。制約式を木構造で表す方法について説明する。
【０１４１】
図２１は、制約式を木構造で表した一実施例を示す図である。図２１は、上記制約式「(i=0) or (i=4) or ((0<i) and (i<4))」を木構造で表した例である。制約式で使用されている演算子「or」「and」を抽出し、「or」「and」各々に直接関係する要素を検出する。制約式の左から１番目の「or」に関連する要素は「(i=0)」と「(i=4)」で、左から２番目の「or」に関連する要素は「(i=0) or (i=4)」と「(i>0) and (i<4)」である。「and」に関連する要素は「(0<i)」と「(i<4)」である。
【０１４２】
上記検出の結果、左から２番目の「or」に関連する要素はすべての要素を含んでいるので、左から２番目の「or」（∨）を木の頂点のノードＹ００とする。次に、制約式の左から１番目の「or」（∨）をノードＹ０１とし、「and」（∧）をノードＹ０２する。制約式の左から１番目の「or」に関連する「(i=0)」を分けて、「i」と「=」（＝＝）と「0」にし、「i」をノードＹ０７、「=」をノードＹ０３、「0」をノードＹ０８とする。また、「(i=4)」を分けて、「i」と「=」（＝＝）と「4」にし、「i」をノードＹ０９、「=」をノードＹ０４、「4」をノードＹ１０とする。
【０１４３】
次に、制約式の「and」に関連する「(i>0)」を分けて、「i」と「>」（＞）と「0」にし、「i」をノードＹ１１、「>」をノードＹ０５、「0」をノードＹ１２とする。また、「(i<4)」を分けて、「i」と「<」（＜）と「4」にし、「i」をノードＹ１３、「<」をノードＹ０６、「4」をノードＹ１４とする。
【０１４４】
本例では、上記のように木構造を生成したが限定されるものではない。
変換情報への追加について説明する。
【０１４５】
図２２は、変換情報のデータ構造の一実施例を示す図である。図２２の変換情報１０１は、図１９に示した情報に、図２１に示した木構造を追加した例である。変換情報１０１は、本例では、「Ｎｏ」にはノード「２」「Ｙ００」「Ｙ０１」「Ｙ０２」・・・「Ｙ１２」が記憶されている。
【０１４６】
「値」には、Ｎｏ「Ｙ０７」に関連付けられて「ｉ」が、Ｎｏ「Ｙ０８」に関連付けられて「０」が記憶されている。また、Ｎｏ「Ｙ０９」に関連付けられて「ｉ」が、Ｎｏ「Ｙ１０」に関連付けられて「４」が記憶されている。また、Ｎｏ「Ｙ１１」に関連付けられて「ｉ」が、Ｎｏ「Ｙ１２」に関連付けられて「０」が記憶されている。Ｎｏ「Ｙ１３」に関連付けられて「ｉ」が、Ｎｏ「Ｙ１４」に関連付けられて「４」が記憶されている。
【０１４７】
「演算子、限量子」には、Ｎｏ「２」に関連付けられて存在記号を含む論理式の情報「∃r(i)∈注文明細」が記憶されている。Ｎｏ「Ｙ００」に関連付けられて論理和記号「∨」が記憶されている。Ｎｏ「Ｙ０１」に関連付けられて論理和記号「∨」が記憶されている。Ｎｏ「Ｙ０２」に関連付けられて論理積記号「∧」が記憶されている。Ｎｏ「Ｙ０３」、Ｎｏ「Ｙ０４」に関連付けられて等号記号「＝＝」がそれぞれ記憶されている。また、Ｎｏ「Ｙ０５」に関連付けられて不等号「＞」が記憶され、Ｎｏ「Ｙ０６」に関連付けられて不等号「＜」が記憶されている。
【０１４８】
「左ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられて「Ｙ０１」「Ｙ０３」「Ｙ０５」「Ｙ０７」「Ｙ０９」「Ｙ０１１」が記憶されている。
【０１４９】
「右ノード」には、「値」または「演算子、限量子」に記憶されている情報に関連付けられて「Ｙ０２」「Ｙ０４」「Ｙ０６」「Ｙ０８」「Ｙ１０」「Ｙ１２」「Ｙ１４」が記憶されている。
【０１５０】
ステップＳ１３では、存在記号なし論理式変換部２０９が選択した存在記号を有する論理式を論理積に変換する。本例では、「演算子、限量子」のＮｏ「２」に関連付けられて存在記号を含む論理式の情報「∃r(i)∈注文明細」を論理積「∧」に変換する。例えば、図２２の行１０２を参照。
【０１５１】
ステップＳ１４では、存在記号なし論理式変換部２０９が選択されている変換した論理式と、追加された制約式を関連付ける。本例では、Ｎｏ「２」に関連付けられている「右ノード」に制約式に関係付けるための「Ｙ００」を記憶する。すなわち、生成した木構造は、論理式「(r(i).購入数=“” or r(i).品名=“”) and ((i=0) or (i=4) or ((0<i) and (i<4)))」を示している。
【０１５２】
ステップＳ１５では、存在記号なし論理式変換部２０９が変換情報を論理式情報に反映させ、反映させた論理式情報を用いて、論理和標準形に変換する。図２３は、変換情報を論理式情報に反映させた一実施例を示す図である。例えば、図２３に示すは変換情報を反映させた論理式情報１１１が示す論理式は「not(会員ID=“”) and (r(i).購入数=“” or r(i).品名=“”) and ((i=0) or (i=4) or ((0<i) and (i<4)))」と表すことができる。そして、上記論理式を論理和標準形に変換すると、論理和標準形の例のような式を求めることができる。
【０１５３】
論理和標準形の例
(not(会員ID=“”) and (r(i).購入数=“”) and (i=0)) or
(not(会員ID=“”) and (r(i).購入数=“”) and (i=4)) or
(not(会員ID=“”) and (r(i).購入数=“”) and ((0<i) and (i<4)) or
(not(会員ID=“”) and (r(i).品名=“”) and (i=0)) or
(not(会員ID=“”) and (r(i).品名=“”) and (i=4)) or
(not(会員ID=“”) and (r(i).品名=“”) and ((0<i) and (i<4)) or
【０１５４】
なお、論理和標準形へ変換する技術は限定されるものではなく、論理和標準形へ変換できればよい。
【０１５５】
論理式情報の論理和標準形への変換について説明する。
図２４は、論理式情報の論理和標準形への変換の一実施例を示す図である。
【０１５６】
ステップＳ７０１では、存在記号なし論理式変換部２０９が論理式情報の最上位ノードからポインタを辿り論理積と論理和が連続する部分木を検索する。例えば図２３の変換情報を反映させた論理式情報１１１に示す最上位のノード、つまり「Ｎｏ」の情報が「０」の行から順に「左ノード」および「右ノード」に格納された情報ポインタを辿りながら、「演算子、限量子」の情報が「論理積（∧）」であるノードと、「演算子、限量子」の情報が「論理和（∨）」であるノードが連続する部分木を検索する。
【０１５７】
ステップＳ７０２では、存在記号なし論理式変換部２０９がステップＳ７０１での検索した結果を用いて、「演算子、限量子」の項目値が「論理積（∧）」であるノードと、「演算子、限量子」の項目値が「論理和（∨）」であるノードが連続する部分木を検索し、部分木が検出できたか否かを判定する。検出できた場合にはステップＳ７０３（Ｙｅｓ）に移行し、検出できない場合にはこの処理を終了（Ｎｏ）する。
【０１５８】
ステップＳ７０３では、存在記号なし論理式変換部２０９が検出された部分木の上位のノードつまり「演算子、限量子」の情報が「論理積（∧）」であるノードの、「演算子、限量子」の情報を、「論理積（∧）」から「論理和（∨）」に更新する。
【０１５９】
ステップＳ７０４では、存在記号なし論理式変換部２０９が検出された部分木の上位のノードの「左ノード」および「右ノード」の情報を、記憶部３の図示しない左ノードと右ノードの情報を退避される領域に記憶する。
【０１６０】
ステップＳ７０５では、存在記号なし論理式変換部２０９が検出された部分木の上位のノードの「左ノード」および「右ノード」の情報を、それぞれ新しい番号に更新する。例えば、「左ノード」の新しい番号として、まだ論理式情報１１１の「Ｎｏ」で使用されていない情報を用いる。また、「右ノード」の新しい番号として、該「左ノード」の新しい番号を含めて、まだ論理式情報１１１の「Ｎｏ」で使用されていない情報を用いる。
【０１６１】
ステップＳ７０６では、存在記号なし論理式変換部２０９が検出された部分木の下位のノード、つまり、「演算子、限量子」の情報が「論理和」のノードの「左ノード」および「右ノード」の情報を取得する。
【０１６２】
ステップＳ７０７では、存在記号なし論理式変換部２０９が検出された部分木の下位ノードのＮｏの情報は左ノードの退避領域の情報と一致するか否かを判定する。一致する場合にはステップＳ７０８（Ｙｅｓ）に移行し、一致しない場合にはステップＳ７１０（Ｎｏ）に移行する。
【０１６３】
ステップＳ７０８では、存在記号なし論理式変換部２０９が論理式情報１１１の「Ｎｏ」にはステップＳ７０５で上位ノードの「左ノード」に記憶した新しい番号を、「演算子、限量子」には「論理積（∧）」を記憶する。また、「左ノード」にはステップＳ７０６で取得した下位ノードの「左ノード」の情報を、「右ノード」には左ノードの退避領域の情報を、それぞれ記憶した新しいノードのデータを生成し、論理式情報１１１に追加する。
【０１６４】
ステップＳ７０９では、存在記号なし論理式変換部２０９が論理式情報１１１の「Ｎｏ」にはステップＳ７０５で上位ノードの「右ノード」に記憶した新しい番号を、「演算子、限量子」には「論理積（∧）」を記憶する。また、「左ノード」にはステップＳ７０６で取得した下位ノードの「右ノード」の情報を、「右ノード」には左ノードの退避領域の情報を、それぞれ記憶した新しいノードのデータを生成し、論理式情報１１１に追加する。その後、ステップＳ７０１に移行する。
【０１６５】
ステップＳ７１０では、存在記号なし論理式変換部２０９が論理式情報１１１の「Ｎｏ」にはステップＳ７０５で上位ノードの「左ノード」に記憶した新しい番号を、「演算子、限量子」には「論理積（∧）」を記憶する。また、「左ノード」には左ノードの退避領域の情報を、「右ノード」にはステップＳ７０６で取得した下位ノードの「左ノード」の情報を、それぞれ記憶した新しいノードのデータを生成し、論理式情報１１１に追加する。
【０１６６】
ステップＳ７１０では、存在記号なし論理式変換部２０９が論理式情報１１１の「Ｎｏ」にはステップＳ７０５で上位ノードの「右ノード」に記憶した新しい番号を、「演算子、限量子」には「論理積（∧）」を記憶する。また、「左ノード」には左ノードの退避領域の情報を、「右ノード」にはステップＳ７０６で取得した下位ノードの「右ノード」の情報を、それぞれ記憶した新しいノードのデータを生成し、論理式情報１１１に追加する。その後、ステップＳ７０１に移行する。
【０１６７】
上記処理によって、木構造形式の論理式情報が表す否定標準形の論理式が、論理和標準形の論理式に変換される。
【０１６８】
図２０のステップＳ１６では、存在記号なし論理式変換部２０９が論理和標準形へ変換した論理式を、論理和ごとに分割して部分論理式を生成して記憶部３に記憶する。
【０１６９】
部分論理式の例
(not(会員ID=“”) and (r(i).購入数=“”) and (i=0))            （式１）
(not(会員ID=“”) and (r(i).購入数=“”) and (i=4))            （式２）
(not(会員ID=“”) and (r(i).購入数=“”) and ((0<i) and (i<4)) （式３）
(not(会員ID=“”) and (r(i).品名=“”) and (i=0))              （式４）
(not(会員ID=“”) and (r(i).品名=“”) and (i=4))              （式５）
(not(会員ID=“”) and (r(i).品名=“”) and ((0<i) and (i<4))   （式６）
【０１７０】
ステップＳ１７では、存在記号なし論理式変換部２０９が論理式情報に存在記号がある未選択の論理式があるか否かを判定し、未選択の論理式がある場合にはステップＳ９（Ｙｅｓ）に移行する。また、未選択の論理式がない場合には変換部の処理を終了（Ｎｏ）する。
【０１７１】
生成部２０３、充足値生成部２０４の動作について説明する。
図２５は、制御部２の生成部２０３、充足値生成部２０４の動作の一実施例を示す図である。ステップＳ１８では、生成部２０３が記憶部３からステップＳ１６で分割した論理式（部分論理式）各々を取得する。また、生成部２０３が記憶部３から標準値情報を取得する。標準値情報は、アプリケーションが動作した際に必要な入力情報である。本例では、商品購入アプリケーションが実行された際に入力する情報は、「会員ID」「購入数」「品名」である。
【０１７２】
標準値情報の例
会員ID  ：“X1000”（文字列）
購入数   ：5        （数値）
品名     ：“ハ゜ソコン”（文字列）
【０１７３】
また、ステップＳ１８では、生成部２０３が部分論理式各々と標準値情報とを組み合わせて生成されたテストデータ生成情報を生成する。上記部分論理式の例で示した部分論理式各々と、上記標準値情報の例で示した標準値情報と組み合わせて生成したテストデータ生成情報を入力として、ＳＭＴソルバを用いて充足する解（充足値）を求める。
【０１７４】
すなわち、式１に示す部分論理式と標準値情報の組み合わせ、式２に示す部分論理式と標準値情報の組み合わせ、式３に示す部分論理式と標準値情報の組み合わせ、各々をテストデータ生成情報とする。また、式４に示す部分論理式と標準値情報の組み合わせ、式５に示す部分論理式と標準値情報の組み合わせ、式６に示す部分論理式と標準値情報の組み合わせ、各々をテストデータ生成情報とする。
【０１７５】
ステップＳ１９では、充足値生成部２０４が部分論理式各々と標準値情報とを組み合わせて生成されたテストデータ生成情報が示す論理式を充足する解（充足値）を求める。充足値生成部２０４は、ＳＭＴソルバなどが考えられる。例えば、上記部分論理式の例で示した部分論理式各々と、上記標準値情報の例で示した標準値情報と組み合わせて生成したテストデータ生成情報を入力として、ＳＭＴソルバを用いて充足する解（充足値）を求める。すなわち、上記６つのテストデータ生成情報を入力として、ＳＭＴソルバを用いて充足する解（充足値）であるデータセット情報を求める。
【０１７６】
図２６は、データセット情報のデータ構造の一実施例を示す図である。図２６のデータセット情報１３１〜１３６は、「Ｎｏ」「品名」「購入数」に記憶される情報を有している。データセット１は、式１に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、ｉ＝０は注文明細のテーブルの１行目の購入数が空「“”」であることを示している。
【０１７７】
データセット２は、式２に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、ｉ＝４は注文明細のテーブルの５行目の購入数が空「“”」であることを示している。
【０１７８】
データセット３は、式３に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、０＜ｉ＜４は注文明細のテーブルの３行目の購入数が空「“”」であることを示している。つまり、０と４の中間値である２に相当する３行目を空「“”」にしている。
【０１７９】
データセット４は、式４に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、ｉ＝０は注文明細のテーブルの１行目の品名が空「“”」であることを示している。
【０１８０】
データセット５は、式５に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、ｉ＝４は注文明細のテーブルの５行目の品名が空「“”」であることを示している。
【０１８１】
データセット６は、式６に示す部分論理式と標準値情報の組み合わせに対する充足値を示している。すなわち、０＜ｉ＜４は注文明細のテーブルの３行目の品名が空「“”」であることを示している。つまり、０と４の中間値である２に相当する３行目を空「“”」にしている。
【０１８２】
ステップＳ２０では、生成部２０３が生成されたテストデータ生成情報各々に対応するテストデータ（データセット情報）を記憶部３に記憶する。
【０１８３】
本実施の態様によれば、事前条件を表す論理式に全称記号や存在記号が含まれる場合でも、境界値制約を用いて、組み合わせ爆発を抑えたテストデータを生成することができる。
【０１８４】
従来の組み合わせ数＝ｉ（存在記号により特定されるテーブルの行数）×ｍ（存在記号に関連する論理式内の組合せ）であったが、本実施の態様を適応した組み合わせ数＝Ｌ（同値クラス数）×ｍ（存在記号に関連する論理式内の組合せ）となる。すなわち、ｉ＞Ｌとなる可能性が大きいため、組み合わせを削減する効果がある。また、テーブルの行数ｉが大きくなればなるほど効果が高くなる。
【０１８５】
また、本発明は、上記実施の形態に限定されるものでなく、本発明の要旨を逸脱しない範囲内で種々の改良、変更が可能である。
【符号の説明】
【０１８６】
１  生成装置
２  制御部
３  記憶部
４  記録媒体読取装置
５  入出力インタフェース
６  通信インタフェース
７  バス
８  記録媒体
９  入出力部
２０１  抽出部
２０２  変換部
２０３  生成部
２０４  充足値生成部
２０５  木構造生成部
２０６  否定標準形変換部
２０７  存在記号付論理式抽出部
２０８  同値クラス算出部
２０９  存在記号なし論理式変換部
【図１】
2013012082.tif 000003
【図２】
2013012082.tif 000004
【図３】
2013012082.tif 000005
【図４】
2013012082.tif 000006
【図５】
2013012082.tif 000007
【図６】
2013012082.tif 000008
【図７】
2013012082.tif 000009
【図８】
2013012082.tif 000010
【図９】
2013012082.tif 000011
【図１０】
2013012082.tif 000012
【図１１】
2013012082.tif 000013
【図１２】
2013012082.tif 000014
【図１３】
2013012082.tif 000015
【図１４】
2013012082.tif 000016
【図１５】
2013012082.tif 000017
【図１６】
2013012082.tif 000018
【図１７】
2013012082.tif 000019
【図１８】
2013012082.tif 000020
【図１９】
2013012082.tif 000021
【図２０】
2013012082.tif 000022
【図２１】
2013012082.tif 000023
【図２２】
2013012082.tif 000024
【図２３】
2013012082.tif 000025
【図２４】
2013012082.tif 000026
【図２５】
2013012082.tif 000027
【図２６】
2013012082.tif 000028