さらに、プログラミングの公理とは何ですか? フィールドの非常に原子的な真実?
Contract Based Programming (コースのホームページ: http://www.daimi.au.dk/KBP2/ ) というコースを TA しました。ここで、コース(および私が受講した他のコース)から推測できること
言語のセマンティクスを形式的に (数学的に) 定義する必要があります。簡単なプログラミング言語を考えてみましょう。グローバル変数のみ、int、int 配列、算術、if-then-else、while、代入、および何もしないもの [これの「実装」として、主流の言語のサブセットをおそらく使用できます]。
実行状態は、ペア (変数名、変数の値) のリストになります。「{Q1} S1 {Q2}」を「ステートメント S1 を実行すると、実行状態 Q1 から状態 Q2 に移行する」と読みます。
1 つの公理は になります"if both {Q1} S1 {Q2} and {Q2} S2 {Q3}, then {Q1} S1; S2 {Q3}"
。つまり、ステートメント S1 で状態 Q1 から Q2 に移動し、ステートメント S2 で Q2 から Q3 に移動した場合、"S1; S2" (S1 の後に S2 が続く) で状態 Q1 から状態 Q3 に移動します。
別の公理は です"if {Q1 && e != 0} S1 {Q2} and {Q1 && e == 0} S2 {Q2}, then {Q1} if e then S1 else S2 {Q2}"
。
ここで、少し改良します。{} 内の Qn は、実際には状態そのものではなく、状態に関するステートメントになります。
M(out, A1, A2) が、ソートされた 2 つの配列をマージして結果を out に格納するステートメントであり、次の例で使用するすべての単語が形式的に (数学的に) 表現されているとします。次に"{sorted(A1) && sorted(A2)} A := M(A1, A2) {sorted(A) && permutationOf(A, A1 concatened with A2)}"
、M がマージ アルゴリズムを正しく実装しているという主張です。
上記の公理を使用して、これを証明しようとすることができます (他にもいくつかの公理が必要になる可能性があります。たとえば、ループが必要になる可能性があります)。
これが、プログラムが正しいことを証明することがどのように見えるかを少し示してくれることを願っています. そして、私を信じてください。一見単純なアルゴリズムであっても、それらが正しいことを証明するには多くの作業が必要です。私は知っています、私は多くの試みを読みました;-)
[これを読んだ場合:あなたのハンドインは問題ありませんでした。頭痛の種は他のすべてのハンドインです ;-)]