29
数学的な証明を書き留めるのは、コンピューターコードを書くよりもフォールトプルーフなのはなぜですか?
バグなしでコンピュータプログラムを書き留めるよりも、間違いを犯さずに数学的な証明を書き留める方がはるかに簡単だと気づきました。 これは私の経験よりも広く行われているようです。ほとんどの人は、プログラミング中に常にソフトウェアのバグを作成します。また、コンパイラには、常に間違いを教えてくれます。私は一度に間違いのない大きなコンピュータープログラムを書いた人のことを聞いたことがなく、バグがないと完全に確信していました。(実際、バグのないプログラムはほとんどなく、多くの高度にデバッグされたプログラムですらあります)。 しかし、コンパイラーが間違いを犯したことをフィードバックすることなく、場合によっては他人からフィードバックを得ることなく、論文全体または数学的な証明の本を書くことができます。 はっきりさせてください。これは、人々が数学の証明で間違いを犯さないと言うことではありませんが、経験の浅い数学者にとっても、その間違いは通常それほど問題ではなく、あなたの間違い。 実際、これが当てはまらない場合、数学はほとんど不可能に思えます。 だから、これは私に質問をするようになりました:前者が後者よりもはるかに扱いやすいようにする、誤りのない数学的な証明を書くことと誤りのないコンピューターコードを書くこととで何がそんなに違いますか? プログラマーが怠makesになり、コードを厳密に書くために必要なことをできないようにするのは、人々がコンパイラーの「外部の神託」をミスに向けているという事実に過ぎないと言うことができます。この見方は、もし彼らがコンパイラーを持っていなければ、数学者と同じように完璧であることができるということを意味するでしょう。 あなたはこの説得力があると思うかもしれませんが、プログラミングと数学的な証明を書き留めた私の経験に基づいて、これは本当に説明ではないと直感的に思えます。2つの取り組みについては、根本的に異なるものがあるようです。 私の最初の考えは、違いがあるかもしれないが、数学者にとって、正しい証明はすべての論理的なステップが正しいことだけを必要とするということです。すべてのステップが正しい場合、証明全体が正しいです。一方、プログラムにバグがないためには、すべてのコード行が正しいだけでなく、プログラム内の他のすべてのコード行との関係も同様に機能する必要があります。 言い換えれば、ステップ場合の証明では、ステップでミスを作り、その後、正しいなりません台無しステップ今まで。ただし、コード行が正しく記述されている場合、行間違いは行の動作に影響するため、行を記述するときは常に他のすべての行との関係を考慮する必要があります。これを制限するためにカプセル化とそれらすべてを使用できますが、完全に削除することはできません。Y X X Y X XバツXXYYYバツXXバツXXYYYバツXXバツXX つまり、数学的証明のエラーをチェックする手順は、証明ステップの数が本質的に線形ですが、コンピューターコードのエラーをチェックする手順は、コードの行数が本質的に指数関数的です。 どう思いますか? 注:この質問には、さまざまな事実や視点を探求する多数の回答があります。回答する前に、それらすべてを読んで、追加する新しいものがある場合にのみ回答してください。冗長な回答、または事実と意見を裏付けない回答は削除される場合があります。