ユニバーサルタイプは、実存タイプのサブタイプ、または特別な場合ですか?


20

Iは、普遍的に定量タイプかどうかを知りたい:T = ∀ X :{ ∈ X 、F :X → { T 、Fは} }、存在、定量化を、サブタイプ、又は特別なケースでありますタイプTのEを同じ署名で:TのE = ∃ X :{ ∈ X 、F :X → { T 、F } }Ta

Ta=∀X:{a∈X,f:X→{T,F}}
Te
Te=∃X:{a∈X,f:X→{T,F}}

私は「はい」と言うだろう:何かが「すべてのXのための」真の場合()、それはまた、「いくつかのXのために、」真でなければならない(∃ X)。それは、「は声明で∀」は同じ文のより制限されたバージョンだけでは「∃」∀ X 、P (X )?∀X∃X∀∃

∀X,P(X)⟹?∃X,P(X).

どこか間違ってる?

背景:なぜこれを求めているのですか?

「抽象[データ]型には実在型がある」理由と方法を理解するために、実在型を研究しています。この概念を理論だけで十分に理解することはできません。具体的な例も必要です。

残念ながら、ほとんどのプログラミング言語では実在型のサポートが限られているため、良いコード例を見つけるのは困難です。(たとえば、Haskellのforall、またはJavaの?ワイルドカード。)一方、普遍的に数量化された型は、「ジェネリック」を介して多くの最近の言語でサポートされています。

さらに悪いことに、ジェネリックも実在型と容易に混同されるようで、実在型と普遍型を区別するのがさらに難しくなります。この混乱がなぜこんなに簡単に起こるのか興味があります。この質問への答えはそれを説明するかもしれません:普遍的な型が実在型の特別な場合だけであるなら、Javaのような一般的な型List<T>がどちらの方法でも解釈できることは不思議ではありません。


1
普遍的と実存的の違いは何ですか?

数学的に言えば、あなたは正しいです:場合はforall x. P(x)、その後exists x. P(x)。型をチェックするときに型システムがこれを考慮するかどうか...私にはわかりません。興味深い質問には+1。

1
@deinan:もしP(x)は任意のために保有していないのx、確かに比べ、 ∀xP(x)は成り立ちません。あなたはおそらく意味することは何も存在しないときであるXで、∀x∈XP(x)が意味するものではありません∃x∈XP(X)の場合はX∅= 。

1
...そして、それらが集合表記せずに書き換えされている場合、彼らは異なって見えるだろうことに注意してください、:∀xx∈X⇒P(x)の対∃xx∈X&P(x)は、その∃xx∈X⇒P(X)Xからではない任意のxによって自明に満たされます。

1
いい質問です。Haskellでは、型の値(forall b。Show b => b)をa(forall b。b)をとる関数に渡すことができますが、その逆ではなく、期待される代替性を意味することは確かですサブタイプ関係。しかし、もちろん、あなたがタイプについて話すとき、あなたはあなたのセマンティクスのために心の中で、正式な形代数を持っている場合は特に、あなたが見ている型システムを言及する必要があります...

回答:


10

∀x:T,P(x)∃x:T,P(x)T

(∀x:T,P(x))⇒(∃x:T,P(x))TaTe

Ta=∀X.{a:X,f:X→bool}AA(M)M:XM1M2XA(M1)A(M2)Ta

Te=∃X.{a:X,f:X→bool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:N→bool}N

Haskellの誤解を招かないでくださいforall。その名前にもかかわらず、それは実存的な量指定子の形式です。

背景については、型とプログラミング言語を強くお勧めします(23型と24型は、それぞれ汎用型と存在型について説明しています)。研究記事を理解するのに役立つ背景を提供します。


1
1つのマイナーな、やや遅いb-Haskellのforallは、明示的な暗黙の数量化の元のコンテキストにおける実際の普遍的な数量詞です。このような定義の「内部」では、引数を操作するとき、多相型は事実上存在します。各型変数はある型にバインドされていますが、その型が何であるかはわかりません(また、知ることができません)。私の知る限り、Haskellの実装は、真の(生の、最上位の)存在型をサポートしていません。
— CAマッキャン

1
GHCがサポートする実在型は、「直接」または「間接的に」普遍的な量指定子を持つ型であり、「外部」から見て、反変位置にあります。これは、論理否定とほぼ同じ双対性を使用するため、トップレベルでそのような実存型を持つためには、CPSのようなエンコードを使用して二重に反変でなければなりません(これはUday Reddyが提供する等価性です)。直観主義の存在量化詞は、同様の理由で同様の不便さを示していることに注意してください。
— CAマッキャン

5

∀X.P(X)∃X.P(X)

∀X.(X×(X→Bool))X∃X.(X×(X→Bool))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

存在型について言及した記事は少し理論的です。さらに詳しいチュートリアル記事は、CardelliとWegnerの論文:型の理解、データの抽象化、およびポリモーフィズムです。プログラミング言語に関するほとんどの高度な教科書には、実存タイプについての議論もあります。調べるのに適した本は、ミッチェルのプログラミング言語の基礎です。

あなたは、ほとんどのプログラミング言語が明示的に存在型を持たないことは正しいです。ただし、多くは抽象型(または「パッケージ」や「モジュール」などの他の名前)を持っています。そのため、これらの値をファーストクラスのエンティティとして扱わなくても、実在型の値を表現できます。

∃X.P(X)∀Y.(∀X.P(X)→Y)→Y∀

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