形式的検証
検証(Verification)は製品が目的に適合しているかどうかをテストする観点の1つである。妥当性検証(Validation)はそれを補完する観点と言える。この両者を合わせて検証プロセス全体を V & V と呼ぶこともある。
Validation: 「我々は正しい製品を作っているか?」すなわち、その製品はユーザーが本当に必要とすることを行っているか?
Verification: 「我々は製品を正しく作っているか?」すなわち、その製品は仕様通りに作られているか?
検証プロセスには静的部分と動的部分がある。例えばソフトウェア製品なら、ソースコードの検査ができるし(静的)、特定のテスト条件で実行させることもできる(動的)。妥当性検証(Validation)は動的にしかできない。すなわち、製品を典型的局面で利用してみたり、一般的でない局面で利用してみたりする(すなわち、それはあらゆるユースケースに対して満足できる動作をするか、である)。
ソフトウェアの形式的検証のための論理推論はさらに以下のように分類される。
1970年代のより古典的手法では、まずコードを普通に書き、続いてのステップで正しいことを検証する。
依存型プログラミング(英語版)では、関数の型がその関数の仕様(の一部)を含み、コードの型チェックによって仕様に対する正しさが保証される。完全な依存型プログラミング言語は第一の手法を特殊ケースとしてサポートする。
それとは相補的な若干異なる手法としてプログラム導出がある。その場合、正しさを保持したステップを踏んで関数仕様から効率的コードを生成する。例として Bird-Meertens Formalism (BMF) があり、"correctness by construction" の別の形態と見ることもできる。