用語の定義
型としての命題は、自然演繹法と単純型付けラムダ計算 (STLC) の間に存在する同形性について具体的に述べています。これが意味することは、STLC でプログラミングしている場合、プログラムをロジックの命題に変換できるということです。
たとえば、これらは同等です。
(a -> b) -> a -> b
P implies Q
P
therefore Q
1 つ目は関数の型シグネチャで、2 つ目は論理命題です。「Clojure の仕様は Wadler の命題と同等ですか?」あなたが求めているのは、「Clojure の仕様をロジックのステートメントに変換できますか?」ということです。または、同形のため、「clojure 仕様を STLC に変換できますか?」
同等性の欠如
仕様により、すべての Clojure述語を使用できます。これにより、仕様は信じられないほど柔軟になりますが、仕様が命題ではないことを確認するための鍵でもあります。
STLC をロジックとして機能させる重要な機能の 1 つは、すべての用語が削減される、つまり、STLC 内のすべてのプログラムが終了することです。Clojure にはこのプロパティがありません。決して終了しない Clojure プログラムを作成するのは簡単です。「非終了」は論理の矛盾に相当するため、プログラミング言語が一貫したロジックであるためには、この終了プロパティが必要です。スペックは Clojure の任意の関数を使用できるため、終了せず、したがって STLC に変換できないスペックを作成できます。したがって、Clojure の仕様は Wadler の命題と同等ではありません。
何が違い、何が似ている?
Clojure specのドキュメントにあるように、spec は型システムではありません。仕様は証明に関係ありませんが、型は証明に関係します。型は、私たちが書くことができるプログラムを、「正しく動く」ことが静的に証明できるものに制限します。型システムにはさまざまなレベルのパワーと表現力がありますが、サウンド型システムはコードに関する特定の特性を証明します。
仕様は、コードに関するプロパティを証明するものではありませんが、代わりに、コードが機能するという確信と、機能しない場合の可視性を提供しようとします。スペックは静的に実行することはできません。基本的にはランタイム値とそれらの間の関係に関するものです。
しかし、これらの違いがあっても、型と Clojure の仕様は同様の実用的な目的を果たします。どちらもコードの信頼性を高め、セマンティクスを関数定義にエンコードすることを可能にし、どちらもテスト生成を支援し、防止するのに役立ちます。バグがコードに忍び込むのを防ぎます。