ラッセル型理論と型システムの関係


12

私は最近、例えばHaskellに見られるように、ラッセル型の理論と型システムの間に何らかの関係があることに気付きました。実際、Haskellの型の表記法の一部には、型理論の先駆者がいるようです。しかし、1908年のIMHO、ラッセルの動機はラッセルのパラドックスを避けることであり、それがコンピュータサイエンスの型システムにどのように関係しているかはわかりません。

ラッセルのパラドックスは、たとえば、特定の言語で適切な型システムがなかった場合など、心配しなければならない何らかの形ですか?

回答:


8

プログラミング言語の意味での「型理論」とラッセルの意味での「型理論」は密接に関連しています。実際、依存型型理論の現代の分野は数学の建設的な基盤を提供することを目的としています。 Coq、NuPRL、Agdaなどのプルーフアシスタントで数学が行われるため、これらのシステムで行われるプルーフは「形式化可能」であるだけでなく、実際に完全にフォーマルかつマシンチェックされます。システムは「高レベル」であり、したがって非公式の数学に似ていますが、すべてがチェックされているため、正確性に関してはるかに優れた保証があります。

こちらをご覧ください

通常のプログラミング言語の型はより制限される傾向がありますが、メタ理論は同じです。

ラッセルのパラドックスに似たものは、依存型理論の主要な問題です。特に、持っている

Type : Type

通常、矛盾につながります。宇宙をネストすることによるCoqおよび同様の作業

Type_0 : Type_1

しかし、デフォルトではCoqでは、これらの数値は暗黙的です。通常、プログラマーにとっては重要ではありません。

一部のシステム(Agda、Idris)では、コンパイルフラグを介してtype in typeルールが有効になっています。ロジックの一貫性が失われますが、多くの場合、探索的なプログラミング/検証が容易になります。

より主流の言語でさえ、ラッセルのパラドックスは時折現れます。たとえば、Haskellでは、不可逆性とオープン型のケースを組み合わせたラッセルのパラドックスのエンコードが可能であり、型レベルでも再帰なしで分岐項を作成できます。 Haskellは、例外は言うまでもなく、型と値の両方の再帰をサポートしているため、「一貫性がありません」(通常の方法でロジックとして解釈される場合)。


あなたの詳細な答えをありがとう-証明が及ぶ限り、C ++やJavaのような命令型言語のプログラムの正確さを証明するツールはまだありませんよね?私はこれらのいずれかに手を入れたいです...これは完全な接線であることに気付きます。CoqとAgdaについては知っていますが、C ++またはJavaで書かれたプログラムの正確性を証明する適切なツールではないようです。
フランク

3
いくつかのツールがあります。C用にいくつか、Java用に多く、Ada用に大量に。例:Why(Java、C、Ada)、Krakatoa(Java)、またはSPARK(非常に優れたツールを備えたAdaサブセット)を参照してください。ただし、C ++についてはそれほどではありません。YNot(Coq DSL)にも興味があるかもしれません。
フィリップJF

3

あなたはラッセルの動機について正しいです。彼のパラドックスは、無制限の理解公理が以下の効果を認める集合のすべての理論を苦しめている:命題関数は集合、すなわち機能を満たすすべてのエンティティの集合を決定する。理論の中や傷がカントールの素朴集合論とのフレーゲのシステムだったことを持っていなかったセットに基づいてGrundgesetze(特に:公理5)。

型は特別な種類のセットであると見なされるため、注意を払わないと、同様のパラドックスが型システムに忍び込む可能性があります。私は30年代にラムダ計算を定式化しようとした教会の初期の試みを思い出すことができますが、それは矛盾していることが判明しました(Kleene-Rosser Paradox)が、それはタイプによるものでもラッセルのパラドックスにも関係していませんでした。

更新:あなたの質問に対する実際の回答については、フィリップの回答をご覧ください。


1
ご回答有難うございます。ラッセルのパラドックスを避けるために、types-a-la-Russellに代わる方法がおそらくあります。これらの代替ソリューションのいずれかが、コンピューター言語に貢献するのに興味深いものを持っているでしょうか?ありふれた型は、コードの各部分間のコントラクトを明確に指定するのに非常に役立ち、その前でさえ、プログラムにセマンティクスを与えるのに非常に役立ちます。型以外のもので取得できる他のセマンティクスはありますか?(私はそれがどうなるかわからない:
フランク

1
はい、多くの代替手段(QuineのNF、ZFCなど)がありますが、基本的な危機とプログラミング言語との直接的なつながりはありません。マーティン・ロフの型理論をプログラミング言語として考えると、直観主義にまで遡る何らかのつながりがあるかもしれません。プログラミング言語のセマンティクスに関しては、Kripke(または可能性のある世界)セマンティクスを持つPDL(Propositional Dynamic Logic)などの基本的な言語がいくつかあります。しかし、型は私にとって非常に基本的なものなので、舞台裏にいるだけかもしれません:)
湖南省Rostomyan

1
しかし、型はちょっと残念です:あなたはそれらを望み、必要としますが、それらを指定する必要はありません(したがって、私見、HaskellやOcaml(私はこれらの言語が大好きです)のような言語で型推論システムを持っている理由です)。スペクトルのもう一方の端では、Pythonは非常に直感的であると感じており、その言語の型についてあまり心配する必要がないのは楽しい(そしてコーディング時間の点で効率的です)。たぶん、型推論は両方の世界で最高です-しかし、それはエンジニアが話していることです。私は数学がコンピューター科学に別の重要な概念(タイプなど)を提供できると空想していました:
フランク

1
私は静的な型(主にRubyの)せずに言語を使用@Frankすべての時間が私は嫌い、私はので、経験を嫌い回避ランタイムエラーを。だから、それは主に好みの問題のようです。強力な型推論により、両方の長所が得られることに同意します。これがおそらく、私がScalaをとても好きな理由です。
ラファエル

型を「自動的に」持たないと実行時エラーが発生することを確信していません。あなたが暗示しているように見えます:-) Pythonで問題が発生したことはありません。
フランク

3

Pythonについて言及しているため、質問は純粋に型理論的なものではありません。そこで、型についてより広い視野を与えようとします。タイプは人によって異なります。少なくとも5つの異なる(ただし関連する)型の概念を収集しました。

  1. 型システムは論理システムであり、理論を設定します。

  2. 型システムは、計算された各値に型を関連付けます。これらの値のフローを調べることにより、型システムは型エラーが発生しないことを証明または保証しようとします。

  3. タイプは、実数値、整数、ブール値など、さまざまなタイプのデータの1つを識別する分類であり、そのタイプの可能な値を決定します。そのタイプの値に対して実行できる操作。データの意味; そのタイプの値を保存する方法

  4. 抽象データ型を使用すると、高レベル言語でデータを抽象化できます。多くの場合、ADTはモジュールとして実装されます。モジュールのインターフェイスは、ADT操作に対応するプロシージャを宣言します。この情報隠蔽戦略により、クライアントプログラムに影響を与えることなく、モジュールの実装を変更できます。

  5. プログラミング言語の実装では、値のタイプを使用して、値に必要なストレージと値の操作のアルゴリズムを選択します。

引用はウィキペディアからですが、必要に応じてより良い参考資料を提供できます。

タイプ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定理証明器でそれらのプロパティを証明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.