【けいしきてきけんしょう】

形式的検証 とは?

最終更新:
💡 仕様に対する性質を、数学的に確かめる

仕様やモデル、プログラムについて、定めた性質が成立するかを数学的な方法で確かめる技法。モデル検査と定理証明、検証する範囲や前提の重要性を解説します。

📌 このページのポイント
形式的検証:決めた性質を数学で確かめる仕様・モデル・プログラムを記述例:二つの処理が共有資源を同時に使わないモデル検査状態・動きを探索定理証明論理から証明結果と検証範囲を確認前提・探索範囲・証明・反例モデルと実装の対応も、別途確認テストやレビューと組み合わせる
共有資源を同時に使わないという性質の説明例です。矢印は検証を進める流れで、二つの方法を順番に実施する意味ではありません。未記述の性質や実環境全体まで自動的に保証しません。
ひよこ ひよこ
形式的検証は、全品検査のようなもの?
ペンギン先生 ペンギン先生
そのたとえだけでは誤解しやすいよ。仕様やモデル、プログラムを厳密に記述し、決めた性質が成り立つかを数学的な方法で確かめる。すべての製品や実環境を動かして検査する、という意味ではないんだ。
ひよこ ひよこ
どんな性質を確かめる?
ペンギン先生 ペンギン先生
たとえば二つの処理が同時に共有資源を使わない、という性質がある。初期状態と、どんな動きが可能かも決める。確認したい性質や障害の条件を書き落とすと、それは検証の対象に入らないよ。
ひよこ ひよこ
モデル検査と定理証明は、何が違う?
ペンギン先生 ペンギン先生
モデル検査は、モデルで可能な状態や動きを探索して性質を調べ、違反する場合は反例を示せる。定理証明は、前提から性質が導けることを証明する。Rocqのような証明支援系は、組み立てた証明を機械で確認するよ。
ひよこ ひよこ
TLA+で設計を調べれば、実装も正しい?
ペンギン先生 ペンギン先生
TLA+は、並行処理や分散システムなどをモデル化する言語だ。モデルで性質が成立しても、実装がそのモデル通りかは別に確認する。Amazonの利用報告も、設計の検証だけで実行コードまで保証できるとはしていないよ。
ひよこ ひよこ
テストは、もう不要になる?
ペンギン先生 ペンギン先生
不要にはならない。形式的検証の結果は、対象・前提・調べた性質や探索範囲による。実装の不具合、外部との接続、運用や利用者の目的に合うかなども確認する。重要な性質を絞って検証し、テストやレビューと組み合わせるんだ。
もっと詳しく知りたい人へ

状態の数が多いと、どうなる?

並行する処理や値の組み合わせによって、探索する状態が非常に多くなることがあります。モデルの抽象化や探索範囲、適した方法を検討します。途中まで調べた結果を、全状態で性質が成立した結果と混同しません。

CoqとRocqは、別の証明ツール?

Rocq Proverは、以前Coq Proof Assistantと呼ばれていた証明支援系です。古い資料ではCoqという名前が使われます。ツール名だけでなく、資料の版や対応する機能を確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「形式的検証」って出てきたら「仕様に対する性質を、数学的な方法で確かめる手法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Formal Verification」 = 形式的検証
💬 ここでの形式的は、数学や論理に基づく厳密な記述を扱うという意味です。何に対してどの性質を検証したか、前提と範囲を示します。

参考資料

← 用語集にもどる