問題はかなり広範です。合理的なスペースでそれに答えるために、私は多くの単純化を行います。
用語について同意しましょう。プログラムは、仕様を暗示しているときに正しいです。このあいまいな記述は、プログラムとは何か、仕様とは何かを特定することにより、多くの点で正確にされています。たとえば、モデル検査では、プログラムはKripke構造であり、仕様は多くの場合LTL式です。または、プログラムはPowerPC命令のリストであり、仕様は、たとえば1次論理で記述されたHoare-Floydアサーションのセットである可能性があります。非常に多くの可能なバリエーションがあります。1つのケース(Kripke構造)では実際のプログラムを検証しないのに対し、2番目のケース(PowerPC命令のリスト)では検証すると結論付けたいと思います。ただし、両方のケースで実際に数学的モデルを見ていることに気付くことが重要であり、これはまったく問題ありません。(状況は、たとえば古典力学が現実の数学モデルである物理学に非常に似ています。)
ほとんどの形式化では、プログラムの構文とセマンティクスが区別されます。つまり、それがどのように表現され、何を意味するのか。プログラムのセマンティクスは、プログラム検証の観点から重要なものです。ただし、プログラム(の構文表現)に意味を割り当てる明確な方法を持つことはもちろん重要です。2つの一般的な方法は次のとおりです。
- (小さなステップ)操作上のセマンティクス:これは、インタープリターを作成してプログラミング言語を定義することに非常によく似ています。このためには、状態とは何かを言う必要があり、言語の各ステートメントの影響を受けます。(どの言語で通訳を書くのか疑問に思うかもしれませんが、そうではないふりをします。)
- 公理的意味論:ここで、各ステートメントタイプには公理スキーマが付属しています。そのため、大まかに言うと、そのタイプの特定のステートメントが使用されるたびに、特定の公理を使用できるようになります。たとえば、割り当てはスキーマ{ P [ x / e ] }が付属しますx:=e ; 特定の割り当て x := x + 1には公理 { x + 1 = 1 }が付きます{P[x/e]}x:=e{P}x:=x+1P = (x = 1 )でスキーマをインスタンス化する場合 { x = 1 }。{x+1=1}x:=x+1{x=1}P= (x = 1 )
(他にもあります。表示のセマンティクスを省略すると特に悪いと感じますが、この答えはすでに長いです。)マシンコードと操作上のセマンティクスは、ほとんどの人が「本物のプログラム」と呼ぶものにかなり近いです。DEC Alphaマシンコードのサブセットにたまたま動作セマンティクスを使用している独創的な論文を次に示します。
公理のようなより高いレベルのセマンティクスを使用するのはなぜですか?正確性の証明を実行するハードウェアに依存させたくない場合。アプローチは、いくつかの便利な高レベルセマンティクスに関してアルゴリズムの正確性を証明し、次に実際のマシンにより近い低レベルセマンティクスに関してセマンティクスが適切であることを証明することです。
要約すると、あなたの質問につながった3つの理由を考えることができます。
- あなたはプログラムを呼び出すために使用されているもののように見えない高レベルのセマンティクスのみを見て、低レベルのものがあるかどうか疑問に思います。答えはイエスです。
- モデルが現実に対応していることをどのように証明するのか不思議に思うでしょう。物理学のように、あなたはしません。より良いモデルを思いついて、現実と比較するだけです。
- 構文とセマンティクスの違い、およびプログラムに意味を割り当てるさまざまな方法を見たことはありません。以前の 2つの質問には、いくつかの書籍がリストされています。
この答えは、私が質問を理解した3つの異なる方法を特定しようとしているだけです。これらのポイントのいずれかに深く入り込むには、多くのスペースが必要です。