回答:
(または、ときどき見かけるΠ)はタイプであることを覚えておくと役立ちます。一般化している→。だからと言って、完璧な理にかなっている間(λ X :A 。M )N、それを言っても意味がありません(∀ X :A 。M )N理由∀ 。。。単なるタイプです。あなたは言わないだろう(A → B )Nの becauesを→それがあります、それ自体は、コンピューティングのためではありませんこのように適用できるラムダ項を分類します。
これも私をつまずかせたものでしたが、これが構築の計算方法です(他の依存型システムも同様に定義されています)。
あなたが書いた2つのプログラムの意図は大きく異なり、最初のプログラムは型が間違っています。それは言っても意味がありませんなぜなら∀手段であればその種類によって、両方の引数が必要です∀ X :A 。Bは適切に型付けされるため、B :∗が必要です。しかし、λ X 。xはそれだけで今までのフォームの種類を割り当てることができ、タイプではありません∀ X :Aを。B、決して∗。一方、二つ目は、ほとんどである(私はあなたが返すためのものだと思いませんxは関数であり、2つの使用タイプ与えられている)∀秒。
実存型と普遍型はかなり異なることに注意してください。それは建設的なロジックではなく、古典論理で、建設的なロジックでと∃彼らは古典論理であるほど関連していません。
は、タイプ Aのオブジェクトを受け取り、タイプ B (x )のオブジェクトを返すプログラムのタイプです。ここで重要なことは、タイプ B (x )は xに依存し、すべての xで同じではないということです。xが何であるかによって異なります。1つの入力 xに対して、整数を出力する場合があります。別のものについては、実数を出力するかもしれません。さらに別の例として、実数に関数を出力する場合があります。B (x )の場合 によって変化しない場合は、AからBまでの関数のタイプであるA → Bを代わりに使用できます。
は、(建設的な)選言の依存バージョンです。あなたは建設的論理和を考えることができます A ∨ B 2種類の Aと Bの互いに素組合として Aと B。 ∃ X :A 。B (x )は、 x :Aで インデックス付けされた型 B (x )のコレクションの素結合です。タイプ B (バンの値に応じて変化し、X :Aは、 それ依存タイプなります。場合と比較 Bは依存しません X :A: ∃ X :A 。B。私たちは、同じのコピー取っている Bのそれぞれについて、 X :A。これは A × Bと同型です。
これで、依存する積および合計タイプが必要な理由を尋ねることができますか?彼らは私たちにもっと表現力を与えるからです。これで、型を完全に無視して、型なしの型理論/関数型プログラミングを作成できます。しかし、これはそもそも型を持つことの利点を取り除きます。たとえば、すべてのプログラムが常に終了するかどうかはわかりません(強力な正規化)。Lambda Cubeおよび Dependent Typeを参照してください。依存型をよく理解するには、Martin-Lofの型理論で依存型を導入および削除するためのルールを調べることが良い方法だと思います。
依存型の主なポイントは次のとおりです。さまざまな理由(たとえば、バグの回避、自動終了の証明など)のために、適切な型付け理論の中にとどまりたいと考えています。私たちは型なしのラムダ計算のようなものに行きたくありません。そこではあなたが述べたような表現をすることができ、より強力なものを作ることができます。依存型は、優れた型理論の中にとどまりながら、より多くのものを表現できるように発明されたと言えます。