回答:
プログラミング言語の意味での「型理論」とラッセルの意味での「型理論」は密接に関連しています。実際、依存型型理論の現代の分野は数学の建設的な基盤を提供することを目的としています。 Coq、NuPRL、Agdaなどのプルーフアシスタントで数学が行われるため、これらのシステムで行われるプルーフは「形式化可能」であるだけでなく、実際に完全にフォーマルかつマシンチェックされます。システムは「高レベル」であり、したがって非公式の数学に似ていますが、すべてがチェックされているため、正確性に関してはるかに優れた保証があります。
こちらをご覧ください
通常のプログラミング言語の型はより制限される傾向がありますが、メタ理論は同じです。
ラッセルのパラドックスに似たものは、依存型理論の主要な問題です。特に、持っている
Type : Type
通常、矛盾につながります。宇宙をネストすることによるCoqおよび同様の作業
Type_0 : Type_1
しかし、デフォルトではCoqでは、これらの数値は暗黙的です。通常、プログラマーにとっては重要ではありません。
一部のシステム(Agda、Idris)では、コンパイルフラグを介してtype in typeルールが有効になっています。ロジックの一貫性が失われますが、多くの場合、探索的なプログラミング/検証が容易になります。
より主流の言語でさえ、ラッセルのパラドックスは時折現れます。たとえば、Haskellでは、不可逆性とオープン型のケースを組み合わせたラッセルのパラドックスのエンコードが可能であり、型レベルでも再帰なしで分岐項を作成できます。 Haskellは、例外は言うまでもなく、型と値の両方の再帰をサポートしているため、「一貫性がありません」(通常の方法でロジックとして解釈される場合)。
あなたはラッセルの動機について正しいです。彼のパラドックスは、無制限の理解公理が以下の効果を認める集合のすべての理論を苦しめている:命題関数は集合、すなわち機能を満たすすべてのエンティティの集合を決定する。理論の中や傷がカントールの素朴集合論とのフレーゲのシステムだったことを持っていなかったセットに基づいてGrundgesetze(特に:公理5)。
型は特別な種類のセットであると見なされるため、注意を払わないと、同様のパラドックスが型システムに忍び込む可能性があります。私は30年代にラムダ計算を定式化しようとした教会の初期の試みを思い出すことができますが、それは矛盾していることが判明しました(Kleene-Rosser Paradox)が、それはタイプによるものでもラッセルのパラドックスにも関係していませんでした。
更新:あなたの質問に対する実際の回答については、フィリップの回答をご覧ください。
Pythonについて言及しているため、質問は純粋に型理論的なものではありません。そこで、型についてより広い視野を与えようとします。タイプは人によって異なります。少なくとも5つの異なる(ただし関連する)型の概念を収集しました。
型システムは論理システムであり、理論を設定します。
型システムは、計算された各値に型を関連付けます。これらの値のフローを調べることにより、型システムは型エラーが発生しないことを証明または保証しようとします。
タイプは、実数値、整数、ブール値など、さまざまなタイプのデータの1つを識別する分類であり、そのタイプの可能な値を決定します。そのタイプの値に対して実行できる操作。データの意味; そのタイプの値を保存する方法
抽象データ型を使用すると、高レベル言語でデータを抽象化できます。多くの場合、ADTはモジュールとして実装されます。モジュールのインターフェイスは、ADT操作に対応するプロシージャを宣言します。この情報隠蔽戦略により、クライアントプログラムに影響を与えることなく、モジュールの実装を変更できます。
プログラミング言語の実装では、値のタイプを使用して、値に必要なストレージと値の操作のアルゴリズムを選択します。
引用はウィキペディアからですが、必要に応じてより良い参考資料を提供できます。
タイプ1はラッセルの作品から生まれましたが、今日では単にパラドックスから保護されているだけではありません。ホモトピー型理論の型付き言語は、数学を形式的で機械が理解できる言語でエンコードする新しい方法であり、人間が基礎を理解する新しい方法です数学の。(「古い」方法は公理集合論を使用したエンコードです)。
タイプ2〜5は、いくつかの異なるニーズからプログラミングで発生しました。バグを回避するため、データソフトウェア設計者とプログラマーが作業するデータを分類するため、大規模システムを設計するため、プログラミング言語を効率的に実装するためです。
C / C ++、Ada、Java、Pythonの型システムは、ラッセルの仕事やバグを避けたいという欲求から生まれたものではありません。さまざまな種類のデータを記述し(「姓は文字列であり数字ではない」など)、ソフトウェア設計をモジュール化し、データの低レベル表現を最適に選択する必要性から生まれました。これらの言語には、タイプ1もタイプ2もありません。Javaは、型システムを使用してプログラムの正確性を証明するのではなく、言語(ポインター演算なし)およびランタイムシステム(仮想マシン、バイトコード検証)を慎重に設計することにより、バグからの相対的な安全性を保証します。Javaの型システムは、論理システムでも集合論でもありません。
ただし、Agdaプログラミング言語の型システムは、ラッセルの型システムの最新版です(後の研究またはPer Martin-Lofおよびその他の数学者に基づく)。Agdaの型システムは、プログラムの数学的プロパティとそれらのプロパティの証明を表現するように設計されています。これは論理システムであり、集合論です。
ここには白黒の区別はありません。多くの言語がその間に収まります。たとえば、Haskell言語の型システムは、ラッセルの作品にルーツを持ち、単純化されたAgdaのシステムと見なすことができますが、数学的観点からは、論理システムまたは集合理論として見た場合、一貫性がありません(自己矛盾)。
ただし、Haskellプログラムをバグから保護するための理論的な手段として、かなりうまく機能します。型を使用して特定のプロパティとその証明をエンコードすることもできますが、すべてのプロパティをエンコードできるわけではありません。
Scalaの型システムは、ラッセルの仕事とAgdaの完全な証明言語からさらに離れていますが、それでもルーセルの仕事にルーツがあります。
型システムがそのために設計されていない工業用言語の特性を証明することに関しては、多くのアプローチとシステムがあります。
興味深いが異なるアプローチについては、CoqおよびMicrosoft Boogieの研究プロジェクトを参照してください。Coqは、型理論に依存して、Coqプログラムから命令型プログラムを生成します。Boogieは、プロパティを備えた命令型プログラムの注釈に依存し、Coqとはまったく異なるアプローチを使用してZ3定理証明器でそれらのプロパティを証明します。