型パラメーターと型インデックスの使用の違いと結果は何ですか?


7

Coqのような型理論では、次のようにパラメーターで型を定義できます。

Inductive ListP (Element : Type) : Type
  := NilP  : ListP Element
   | ConsP : Element -> ListP Element -> ListP Element.

または、次のように、インデックスを使用してタイプを定義することもできます。

Inductive ListI : Type -> Type
  := NilI  : forall t, ListI t
   | ConsI : forall t, t -> ListI t -> ListI t.

私の質問は:

  • これらは根本的に異なっているか、根本的に同じですか?
  • どちらを使用することの結果は何ですか?
  • どちらを使用するのが望ましいのですか?

回答:


6

ListP tListI t同型です。これらのコンストラクタはまったく同じです。

<prompt>Coq < 12 || 0 < </prompt>Check (NilP, NilI). 
(NilP, NilI)
     : (forall t : Type, ListP t) *
       (forall t : Type, ListI t)

<prompt>Coq < 13 || 0 < </prompt>Check (ConsP, ConsI). 
(ConsP, ConsI)
     : (forall t : Type, t -> ListP t -> ListP t) *
       (forall t : Type, t -> ListI t -> ListI t)

ただし、Coqは異なる誘導原理を生成します。

<prompt>Coq < 14 || 0 < </prompt>Check (ListP_ind, ListI_ind). 
(ListP_ind, ListI_ind)
     : (forall (t : Type) (P : ListP t -> Prop),
        P (NilP t) ->
        (forall (t0 : t) (l : ListP t), P l -> P (ConsP t t0 l)) ->
        forall l : ListP t, P l) *
       (forall P : forall T : Type, ListI T -> Prop,
        (forall t : Type, P t (NilI t)) ->
        (forall (t : Type) (t0 : t) (l : ListI t),
         P t l -> P t (ConsI t t0 l)) ->
        forall (T : Type) (l : ListI T), P T l)

の誘導原理はListI、要素タイプ(P : forall T, ListI T -> Prop)でプロパティをパラメーター化する必要がありますが、の誘導原理はListP任意のタイプtP : ListP t -> Prop)でインスタンス化できます。これはCoqのフロントエンドの弱点であり、非均一な再帰型については賢くありません。手動で(それがされていることを与えられた驚くべきことではない型チェッカーはそれを受け入れ、同じ誘導原理定義することができますListP_ind間の明白な同型によって変換さListPとをListI)。

パラメトリックフォームListPはシンプルで、箱から出してすぐに使用できます。ListIフォームは、再帰呼び出しのパラメータは、元のない不均一な再帰に一般化することができます。例については、ポリモーフィズムと帰納的データ型を参照してください。


3
それは理にかなっている。したがって、経験則では、インデックスは何にでも使用でき、パラメータはすべてのコンストラクタの終了時に同じ値が使用される場合にのみ使用できますが、誘導がより簡単になるため、パラメータが好ましいです。
Warbo 2014年

4

また、次の点、特にコメントは非常に便利です。

http://homotopytypetheory.org/2011/04/10/just-kidding-understanding-identity-elimination-in-homotopy-type-theory/

その理由は、IDタイプAMNがAとMによって「パラメーター化」され、Nによって「インデックス化」されるためです。この用語は、「帰納的に定義されたタイプのファミリー」(ファミリーの引数がパラメーターと呼ばれる)の違いを表しています。および「帰納的に定義されたタイプのファミリー」(引数はインデックスと呼ばれます)。パラメータは「mu」の前に来ます(パラメータの選択ごとに、帰納的なタイプがあります)。インデックスは「ループ内」にあります。タイプのファミリー全体を同時に定義するので、ファミリーの異なるインスタンスが相互に参照できます。結果として、パラメーターは不均一に発生する可能性があります(たとえば、コンストラクターの結果の型)。一方、パラメーターは一度に固定されます。

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