[論文レビュー] On the Generation of Test Data for Prolog by Partial Evaluation
本稿では、部分評価(PE)を用いたPrologプログラムのテストデータ生成(TDG)のための新しい手法を提案する。論理プログラミングで一般的な失敗する導出を扱う課題を克服するため、Prologコードを失敗を明示的に表現する形に変換する。2段階のPEにより、テストケースとテストケースジェネレータの両方を生成する。まず、失敗パスを捕捉するように特殊化されたPrologインタプリタを用い、次に制約解決により具体的なテスト入力を得る。これにより、PEベースのTDGの利点が、宣言型言語にも拡張される。
In recent work, we have proposed an approach to Test Data Generation (TDG) of imperative bytecode by partial evaluation (PE) of CLP which consists in two phases: (1) the bytecode program is first transformed into an equivalent CLP program by means of interpretive compilation by PE, (2) a second PE is performed in order to supervise the generation of test-cases by execution of the CLP decompiled program. The main advantages of TDG by PE include flexibility to handle new coverage criteria, the possibility to obtain test-case generators and its simplicity to be implemented. The approach in principle can be directly applied for TDG of any imperative language. However, when one tries to apply it to a declarative language like Prolog, we have found as a main difficulty the generation of test-cases which cover the more complex control flow of Prolog. Essentially, the problem is that an intrinsic feature of PE is that it only computes non-failing derivations while in TDG for Prolog it is essential to generate test-cases associated to failing computations. Basically, we propose to transform the original Prolog program into an equivalent Prolog program with explicit failure by partially evaluating a Prolog interpreter which captures failing derivations w.r.t. the input program. Another issue that we discuss in the paper is that, while in the case of bytecode the underlying constraint domain only manipulates integers, in Prolog it should properly handle the symbolic data manipulated by the program. The resulting scheme is of interest for bringing the advantages which are inherent in TDG by PE to the field of logic programming.
研究の動機と目的
- 標準的な部分評価が内在的に無視する、失敗する導出をカバーするテストケースを生成する課題に対処すること。
- 元々命令型バイトコード向けに設計された、既存のPEベースのTDGフレームワークを、Prologのような宣言型言語へと拡張すること。
- PrologプログラムからCLP形式のテストケースジェネレータを自動合成し、再利用可能性とカバレッジの柔軟性を向上させること。
- 特に否定的統合(negated unifications)を含む、記号的データ構造と複雑な統合を、制約処理ルール(CHR)と多領域制約ソルバを統合することで効果的にモデル化・解決すること。
- 再帰的述語(例:sorted/1)を対象とした予備実験を通じて、本手法の実現可能性と有効性を評価し、制限付き再帰深さにおけるパスのカバレッジを確認すること。
提案手法
- 失敗する導出を追跡する部分評価済みPrologインタプリタを用い、元のPrologプログラムを失敗を明示的に表現する同等のバージョンに変換する。
- 2段階の部分評価プロセスを用いる:まず、バイトコードインタプリタを特殊化してPrologをCLPに逆アセンブルし、次にCLPプログラムのPEを監視することでテストケース生成を支援する。
- 否定的統合(例:\+ L=[] や \+ A#>0)から生じる不等価制約を管理するため、制約処理ルール(CHR)を統合する。
- ブールおよび数値などの多領域制約ソルバを活用し、負の条件を正の制約に変換して表現・解決することで、妥当性の検証を可能にする。
- ブロックカウントなどのカバレッジ基準を用いてパス列挙をガイドし、特定のプログラムパスをターゲットにするテストケースを保証する。
- PEフレームワーク内に記号実行の原則を適用し、パス条件を蓄積し、制約解決によりテスト入力を生成する。
実験結果
リサーチクエスチョン
- RQ1標準的なPEが無視する失敗する導出を含むPrologプログラムのテストケースを生成するために、部分評価をどのように適合させられるか?
- RQ2Prologにおける否定的統合と記号的データ構造は、PEベースのTDGフレームワーク内で効果的にモデル化・解決できるか?
- RQ3既存のPEベースのTDGアプローチ(バイトコード向け)を、Prologのような宣言型言語へどの程度一般化できるか?
- RQ4得られるテストケースジェネレータは、実行可能かつ再利用可能なCLPプログラムとして表現可能か?
- RQ5ブロックカウントのようなカバレッジ基準は、Prologにおける多様でパスカバレッジを持つテスト入力の生成をどの程度効果的にガイドするか?
主な発見
- 本手法は、再帰呼び出し数が3回までのすべてのパスをカバーする、`sorted/1`述語のテストケースを効果的に生成した。これはブロックカウント(2)基準によって裏付けられた。
- 合計7つの異なるテストケースが生成され、成功パスと失敗パスの両方を含んでおり、例として非順序リストの`[[0,1,2,0|_]],[],no/first-try`が含まれる。
- 本手法により、CLPベースのテストケースジェネレータの自動合成が可能となり、PEパイプラインを再実行せずに新しいテスト入力を生成できる。
- CHRと多領域制約ソルバの統合により、`\+ L=[]` や `\+ A#>0` といった否定的統合が、正の不等価制約に変換され、効果的に処理可能となった。
- 予備実験により、本手法は再帰的述語に対して実現可能かつスケーラブルであることが確認されたが、より大きなプログラムに対する評価は今後必要である。
- 本フレームワークはカット/0やフェイル/0といった高度なProlog機能をサポートしているが、完全統合および既存ツールとの実証的比較は継続中の作業である。
より良い研究を、今すぐ始めましょう
論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。