普遍的/既存の定量化?


11

タイプの普遍的かつ実存的な定量化の目的を理解するのに苦労しています。私は、構造の計算に基づいておもちゃの言語を書いて遊んでいます。理解を深めるために、モルトとヘンクについて読んでいます。

CoCにラムダとフォーラルの両方の抽象化がある理由がわかりません。

(∀ X :A 。B )

(λバツ:あ。B)
(∀バツ:あ。B)

ラムダは、型が手動で渡されるシステムではすべてを包括しているようです。つまり、次のこと

(∀バツ:∗。λa:バツ。a)

と置き換えることができます

(λバツ:∗。λa:バツ。a)

使用されているタイプに最初に適用された場合。

何が欠けていますか?参考になる記事、ブログ、記事はありますか?

ありがとう。

回答:


12

(または、ときどき見かけるΠ)はタイプであることを覚えておくと役立ちます。一般化している→。だからと言って、完璧な理にかなっている間(λ X :A 。M )N、それを言っても意味がありません(∀ X :A 。M )N理由∀ 。。。単なるタイプです。あなたは言わないだろう(A → B )Nの becauesを→それがあります、それ自体は、コンピューティングのためではありません∀Π→(λバツ:あ。M) N(∀バツ:あ。M) N∀。。。(あ→B) N→このように適用できるラムダ項を分類します。

これも私をつまずかせたものでしたが、これが構築の計算方法です(他の依存型システムも同様に定義されています)。

あなたが書いた2つのプログラムの意図は大きく異なり、最初のプログラムは型が間違っています。それは言っても意味がありませんなぜなら∀手段であればその種類によって、両方の引数が必要です∀ X :A 。Bは適切に型付けされるため、B :∗が必要です。しかし、λ X 。xはそれだけで今までのフォームの種類を割り当てることができ、タイプではありません∀ X :Aを。B、決して∗∀バツ:あ。 λバツ。 バツ∀∀バツ:あ。BB:∗λバツ。バツ∀バツ:あ。B∗。一方、二つ目は、ほとんどである(私はあなたが返すためのものだと思いませんxは関数であり、2つの使用タイプ与えられている)∀秒。aバツ∀


はい、返品つもりでした。a
— oconnor0

@ oconnor0それは理にかなっています:)
— Daniel

ではない正確に。私はまだ少し混乱しています。私はそれについてもっと考えなければならないかもしれません。i dを実装しようとしたので両方のサンプルプログラムをxではなくaを返すように変更しました。:)aバツ私d
— oconnor0

あるレベルでは、用語とタイプを同じものにしたかったのだと思います。あなたの答えとcs.stackexchange.com/questions/49531/の間に…どこが間違っているのかわかります。私はこれを強力な正規化システムで実行したいと考えています。
— oconnor0

5

実存型と普遍型はかなり異なることに注意してください。それは建設的なロジックではなく、古典論理で、建設的なロジックでと∃彼らは古典論理であるほど関連していません。∀∃

は、タイプ Aのオブジェクトを受け取り、タイプ B (x )のオブジェクトを返すプログラムのタイプです。ここで重要なことは、タイプ B (x )は xに依存し、すべての xで同じではないということです。xが何であるかによって異なります。1つの入力 xに対して、整数を出力する場合があります。別のものについては、実数を出力するかもしれません。さらに別の例として、実数に関数を出力する場合があります。B (x )の場合∀バツ:あ。B(バツ)あB(バツ)B(バツ) バツバツバツバツB(バツ)によって変化しない場合は、AからBまでの関数のタイプであるA → Bを代わりに使用できます。バツあ→BあB

は、(建設的な)選言の依存バージョンです。あなたは建設的論理和を考えることができます A ∨ B 2種類の Aと Bの互いに素組合として Aと B。 ∃ X :A 。B (x )は、 x :Aで インデックス付けされた型 B (x )のコレクションの素結合です。タイプ B (∃バツ:あ。B(バツ)あ∨BあBあB∃バツ:あ。B(バツ)B(バツ)バツ:あバンの値に応じて変化し、X :Aは、 それ依存タイプなります。場合と比較 Bは依存しません X :A: ∃ X :A 。B。私たちは、同じのコピー取っている Bのそれぞれについて、 X :A。これは A × Bと同型です。B(バツ)バツ:あBバツ:あ∃バツ:あ。BBバツ:ああ×B

これで、依存する積および合計タイプが必要な理由を尋ねることができますか?彼らは私たちにもっと表現力を与えるからです。これで、型を完全に無視して、型なしの型理論/関数型プログラミングを作成できます。しかし、これはそもそも型を持つことの利点を取り除きます。たとえば、すべてのプログラムが常に終了するかどうかはわかりません(強力な正規化)。Lambda Cubeおよび Dependent Typeを参照してください。依存型をよく理解するには、Martin-Lofの型理論で依存型を導入および削除するためのルールを調べることが良い方法だと思います。

依存型の主なポイントは次のとおりです。さまざまな理由(たとえば、バグの回避、自動終了の証明など)のために、適切な型付け理論の中にとどまりたいと考えています。私たちは型なしのラムダ計算のようなものに行きたくありません。そこではあなたが述べたような表現をすることができ、より強力なものを作ることができます。依存型は、優れた型理論の中にとどまりながら、より多くのものを表現できるように発明されたと言えます。


1
「∃x:AB(x)∃x:AB(x)は(構成)選言の依存バージョンです。」平均?
— oconnor0 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.