この質問に答えるには、「証明可能」とは何かを定義する必要があります。Ricky が指摘したように、型システムを備えた言語は、プログラムをコンパイルするたびに実行される組み込みの証明システムを備えた言語です。これらの証明システムはほとんどの場合、悲しいことに無力です — String
vsのような質問にInt
答え、「リストはソートされていますか?」のような質問を避けます。—しかし、それらは証明システムです。
残念なことに、証明の目標が高度になればなるほど、証明をチェックできるシステムで作業することが難しくなります。これは、チューリング マシン上で決定不能なクラスの問題の規模を考えると、すぐに決定不能にエスカレートします。確かに、ソート アルゴリズムの正確性を証明するなどの基本的なことは理論的には実行できますが、それ以上のことは非常に薄い氷の上を踏むことになります。
ソート アルゴリズムの正しさのような単純なことを証明する場合でも、比較的高度な証明システムが必要です。(注: 型システムが言語に組み込まれた証明システムであることは既に確立しているので、私はもっと力強く手を振るのではなく、型理論の観点から物事について話します)リストの並べ替えの完全な正当性の証明には、何らかの形式の依存型が必要です。そうしないと、型レベルで相対値を参照する方法がありません。これは、決定不可能であることが示されている型理論の領域にすぐに侵入し始めます。したがって、リストの並べ替えアルゴリズムの正しさを証明できるかもしれませんが、それを行う唯一の方法は、検証できない証明を表現できるシステムを使用することです。個人的には、
先ほど触れた使いやすさの面もあります。型システムが洗練されればされるほど、使い心地は悪くなります。これは厳格なルールではありませんが、ほとんどの場合、当てはまると思います。また、他の正式なシステムと同様に、最初に実装を作成するよりも、証明を表現する方が手間がかかる (そしてエラーが発生しやすい) ことがよくあります。
以上を踏まえて、Scala の型システム (Haskell の型システムと同様) がチューリング完全であることは注目に値します。つまり、理論的にはそれを使用して、コードに関する決定可能なプロパティを証明することができます。そのような証明に適している方法。Java よりも Haskell の方が優れた言語であることはほぼ間違いありません (Haskell の型レベル プログラミングは Prolog に似ているのに対し、Scala の型レベル プログラミングは SML に似ているため)。Scala や Haskell の型システムをこのように使用することはお勧めしませんが (アルゴリズムの正しさの正式な証明)、このオプションは理論的には利用可能です。
全体として、「現実の世界」で正式なシステムを見たことがない理由は、正式な証明システムがプラグマティズムの無慈悲な専制政治に屈服したという事実に由来すると思います。前述したように、正当性の証明を作成するには非常に多くの労力が費やされるため、ほとんど価値がありません。業界はずっと前に、あらゆる種類の分析的な正式な推論プロセスを経るよりもアドホックなテストを作成する方が簡単であると判断しました.