反例誘導型抽象化洗練(CEGAR )は、記号モデル検査の手法です。[ 1 ] [ 2 ]また、モーダル論理タブロー計算アルゴリズムの効率を最適化するためにも適用されています。 [ 3 ]
プログラムのコンピュータ支援検証および分析では、計算モデルは多くの場合、状態から構成されます。しかし、小さなプログラムのモデルであっても、膨大な数の状態を持つ場合があります。これは状態爆発問題として知られています。[ 4 ] CEGAR は、この問題を 2 つの段階で解決します。1 つは、状態をグループ化してモデルを単純化する抽象化、もう 1 つは、元のモデルをよりよく近似するために抽象化の精度を高める改良です。
プログラムの望ましい特性が抽象モデルで満たされない場合、反例が生成されます。次に、CEGAR プロセスは、反例が偽物かどうか、つまり、反例が抽象化の精度が不十分なために反例が適用されるかどうかを確認します。この場合、プロセスは反例が抽象化の精度不足に起因すると結論付けます。そうでない場合、プロセスはプログラムにバグを見つけます。反例が偽物であることが判明すると、改良が実行されます。[ 5 ]反復手順は、バグが見つかった場合、または抽象化が元のモデルと同等になるまで改良された場合に終了します。
プログラムの正しさ、特に並行処理における時間の概念を含むプログラムの正しさを推論するために、状態遷移モデルが使用されます。特に、有限状態モデルは、自動検証において時相論理とともに使用できます。[ 6 ]したがって、抽象化の概念は、2 つのクリプキ構造間のマッピングに基づいています。具体的には、プログラムは制御フローオートマトン(CFA)で記述できます。[ 7 ]
クリプキ構造を定義するとして、 どこ
抽象化定義されるどこは、すべての状態をマッピングする抽象化マッピングです。州へ[ 5 ]
モデルの重要な特性を維持するために、抽象化マッピングは元のモデルの初期状態をマッピングします。その対応するものに対して抽象モデルにおいて。抽象化マッピングは、2つの状態間の遷移関係が保持されることも保証する。
各反復において、抽象モデルに対してモデル検査が実行されます。たとえば、限定モデル検査では、命題論理式が生成され、その後、SATソルバーによってブール充足可能性がチェックされます。[ 5 ]
反例が見つかった場合、それらが偽例、つまりモデルの抽象化不足から生じる不正確な例であるかどうかを検証します。偽例でない反例はプログラムの誤りを反映しており、プログラム検証プロセスを終了させ、プログラムが誤りであると結論付けるのに十分な場合があります。洗練プロセスの主な目的は、偽例を処理することです。抽象化の粒度を上げることで、偽例を排除します。
洗練プロセスにより、行き止まりの状態と悪い状態が同じ抽象状態に属さないことが保証されます。行き止まりの状態とは、到達可能な状態でありながら出力遷移がない状態であり、悪い状態とは、反例を引き起こす遷移が存在する状態です。[ 2 ]
様相論理はクリプキ意味論で解釈されることが多く、クリプキフレームはプログラム検証に関わる状態遷移システムの構造に似ているため、CEGAR技術は自動定理証明にも実装されている。[ 3 ]