Agda中的参数化归纳类型

时间:2012-01-22 17:04:25

标签: gadt agda

我只是在阅读Dependent Types at Work。在参数化类型的介绍中,作者在本声明中提到了

data List (A : Set) : Set where
  []   : List A
  _::_ : A → List A → List A

List的类型为Set → SetA成为两个构造函数的隐式参数,即。

[]   : {A : Set} → List A
_::_ : {A : Set} → A → List A → List A

好吧,我试着稍微改写一下

data List : Set → Set where
  []   : {A : Set} → List A
  _::_ : {A : Set} → A → List A → List A

遗憾地无法工作(我正在尝试学习Agda两天左右,但是从我收集的内容开始,因为构造函数在Set₀上进行了参数化,所以List A必须在Set₁)。

确实,接受以下内容

data List : Set₀ → Set₁ where
  []   : {A : Set₀} → List A
  _::_ : {A : Set₀} → A → List A → List A

然而,我不再能够使用{A : Set} → ... → List (List A)(这是完全可以理解的)。

所以我的问题是:List (A : Set) : SetList : Set → Set之间的实际差异是什么?

感谢您的时间!

1 个答案:

答案 0 :(得分:14)

我冒昧地重命名数据类型。第一个是 Set上的索引将被称为ListI,第二个ListP, 将Set作为参数:

data ListI : Set → Set₁ where
  []  : {A : Set} → ListI A
  _∷_ : {A : Set} → A → ListI A → ListI A

data ListP (A : Set) : Set where
  []  : ListP A
  _∷_ : A → ListP A → ListP A

在数据类型中,参数在冒号之前,参数在之后 冒号被称为指标。构造函数可以在同一个中使用 方式,您可以应用隐式集:

nilI : {A : Set} → ListI A
nilI {A} = [] {A}

nilP : {A : Set} → ListP A
nilP {A} = [] {A}

模式匹配时会出现差异。对于索引版本,我们有:

null : {A : Set} → ListI A → Bool
null ([]  {A})     = true
null (_∷_ {A} _ _) = false

ListP

无法做到这一点
-- does not work
null′ : {A : Set} → ListP A → Bool
null′ ([]  {A})     = true
null′ (_∷_ {A} _ _) = false

错误消息是

The constructor [] expects 0 arguments, but has been given 1
when checking that the pattern [] {A} has type ListP A

ListP也可以使用虚拟模块定义,如ListD

module Dummy (A : Set) where
  data ListD : Set where
    []  : ListD
    _∷_ : A → ListD → ListD

open Dummy public

也许有点令人惊讶,ListD等于ListP。我们无法模仿 匹配Dummy的参数:

-- does not work
null″ : {A : Set} → ListD A → Bool
null″ ([]  {A})     = true
null″ (_∷_ {A} _ _) = false

这会给出与ListP相同的错误消息。

ListP是参数化数据类型的一个示例,它更简单 比ListI,这是一个归纳家庭:它“取决于” 虽然在这个例子中以一种微不足道的方式表达了。

参数化数据类型在the wiki上定义, 和 here 是一个小介绍。

归纳家族并未真正定义,但在the wiki中详细阐述 与一些似乎需要归纳的典型例子 家族:

data Term (Γ : Ctx) : Type → Set where
  var : Var Γ τ → Term Γ τ
  app : Term Γ (σ → τ) → Term Γ σ → Term Γ τ
  lam : Term (Γ , σ) τ → Term Γ (σ → τ)

忽略Type索引,不能简化这个版本 由于Dummy构造函数而以lam - 模式方式编写。

另一个好的参考是Inductive Families 作者:Peter Dybjer,1997年。

快乐的Agda编码!