Kernel/VM 探検隊@北陸 Part 8 で使用したスライドです。
モデル検査は形式手法の一種であり、システムやプログラムを Kripke 構造と呼ばれるグラフに変換し、与えられた仕様に反した状態に到達しないことを網羅的・自動的に検査する技術です。全自動でシステマティックに検査が可能である点では有望ですが、同時に、現実的なプログラムをモデル検査にかけようとすると状態数の爆発が問題となり、産業界への普及の障害の一つとなっていました。
この問題に対して、Clarke らによって 2000 年に提案された手法が CEGAR(CounterExample-Guided Abstraction Refinement)です。
https://doi.org/10.1007/10722167_15
CEGAR ではまず、プログラムの動作を変えないように変数の振る舞いを抽象化(abstraction)することで、検査対象となるグラフを単純化し状態数を削減します。このとき、抽象化したグラフで反例が検出できなければ、元となるグラフにも反例は存在しません。しかし逆は成り立たず、元となるグラフに反例が存在しないにも関わらず、抽象化したことによって新たに反例が生じることがあります。このような反例を偽反例(spurious counterexample)と呼びます。
そこで CEGAR では次の段階として、詳細化(refinement)を行います。具体的には、抽象化された側で見つかった(偽反例の可能性がある)反例に対して、元の問題の側に引き戻して考え、もし元のグラフとは両立し得ない場合は偽反例と判断します。その場合、偽反例の元となっている過剰な抽象化を特定し、抽象化を緩め、この手続を繰り返すことで、元の構造をより正確に反映したグラフを得ることができます。
今回の講演では、シンプルなログイン処理を模した具体例を用いて、CAGAR の抽象化 - 詳細化の処理の流れを図を使って解説しています。