类型参数和指数之间的区别?

时间:2014-07-06 20:55:17

标签: coq agda dependent-type type-theory idris

我是依赖类型的新手,我对这两者之间的区别感到困惑。似乎人们通常会说某个类型是由另一个类型参数化,而由某个值索引。但是,依赖类型语言中的类型和术语之间没有区别吗?参数和指数之间的区别是否基本?你能告诉我在编程和定理证明中它们的含义不同的例子吗?

2 个答案:

答案 0 :(得分:38)

当您看到一系列类型时,您可能想知道它所拥有的每个参数是参数还是 indices


参数仅表示该类型在某种程度上是通用的,并且对于所提供的参数,其行为参数化

这意味着,例如,类型List T将具有相同的形状,无论您考虑哪个Tnilcons t0 nil,{{1} cons t1 (cons t2 nil)的选择只会影响Tt0t1可插入的值。


另一方面,

指数可能会影响您在该类型中找到哪些居民!这就是为什么我们说 index 是一个类型的家族,也就是说,每个索引都会告诉你正在查看哪一种类型(在类型族中)(在这个意义上,参数是一个退化的情况,其中所有索引都指向同一组“形状”。)

例如,类型系列t2或有限的大小Fin n包含非常不同的结构,具体取决于您选择的n

索引n索引为空集。 索引0索引具有一个元素的集合。

从这个意义上说,对指数价值的了解可能带有重要信息!通常,您可以通过查看索引来了解可能使用或未使用的构造函数。这就是依赖类型语言中的模式匹配可以消除不可行模式,并从触发模式中提取信息。


这就是为什么在定义归纳族时,通常可以定义整个类型的参数,但是你必须为每个构造函数指定索引(因为你可以为每个构造函数指定它所遵循的索引)在)。

例如,我可以定义:

1

此处,F (T : Type) : ℕ → Type C1 : F T 0 C2 : F T 1 C3 : F T 0 是参数,而T0是索引。当您收到1类型的x时,查看F T n的内容将不会显示T的任何内容。但是看x会告诉你:

  • nx时,C1必须为C3n
  • 0x时,C2必须为n
  • 1必须是从矛盾中伪造的,否则

同样,如果您收到类型为x的{​​{1}},则表示您只需要对yF T 0进行模式匹配。

答案 1 :(得分:1)

这是一个按某种值划分的类型的例子:

open import Data.Nat

infixr 4 _∷_

data ≤List (n : ℕ) : Set where
  []  : ≤List n
  _∷_ : {m : ℕ} -> m ≤ n -> ≤List n -> ≤List n

1≤3 : 1 ≤ 3
1≤3 = s≤s z≤n

3≤3 : 3 ≤ 3
3≤3 = s≤s (s≤s (s≤s z≤n))

example : ≤List 3
example = 3≤3 ∷ 1≤3 ∷ []

这是一种列表,每个元素都小于或等于n。一般的直觉是:如果某个类型的每个居民都拥有某个属性,那么您可以将其抽象为参数。还有一个机械规则:“如果每个构造函数在第一个索引位置(在结果类型中)具有相同的变量,则第一个索引可以转换为新参数。” 这个引用来自*,你应该读它。