Agda类型错误

时间:2014-02-24 17:50:47

标签: agda

我是Agda的新手,我正在尝试定义类型的常量prod:     Z → (Z → ((Z → Set) → Set))

现在,我编写了以下Agda代码:

data Prod (X : Set) : ℕ → X where 
prod : ℕ → (ℕ → ((ℕ → X) → X))

当我打字检查时,agda会产生以下错误信息:

X != Set (_33 X_) of type Set 
when checking the definition of Prod 

非常感谢任何帮助

1 个答案:

答案 0 :(得分:4)

您的数据类型定义有两个问题。首先,所有数据类型都在Set(某种级别),您不能只是将数据类型声明为其他类型的元素。

data T : ℕ where

这个定义试图假设自然数的另一个元素,即T。这没有多大意义。唯一可以添加更多元素的“类型”是Set - 所有(小)类型的类型。 (我在掩饰Set s的无限层次这一事实,你现在不需要处理它。)

所以这没关系:

data T : Set where

您的定义的第二个问题是prod构造函数的类型并不反映它确实构造了Prod类型的东西。构造函数的要点是它们可以是您定义的类型的元素。

让我们来看看自然数的定义:

data ℕ : Set where
  zero : ℕ
  suc  : ℕ → ℕ

当我们写zero : ℕ时,我们说zero是一个自然数。如果我们这样做了怎么办:

data ℕ : Set where
  zero : String
  suc  : ℕ → ℕ

我们正在定义自然数,我们定义zeroString?因此,既然我们正在定义构造函数,那么我们给它的类型必须提到我们在最后一个位置定义的类型。 (这个提法也可以是间接的)。

Op₂ : Set → Set
Op₂ A = A → A → A

data Tree (A : Set) : Set where
  nil  :          Tree A
  node : A → Op₂ (Tree A)

您可以在冒号左侧添加参数,但不能在构造函数中更改它们。例如,这是无效的:

data T (A : Set) : Set where
  t : T ℕ

请注意,仅T是不够的 - 它不是一种类型,而是类似函数的类型(即Set → Set)。这个没关系:

data T (A : Set) : Set where
  t : T A

冒号右侧是 indices 。这些类似于参数,除了您可以在构造函数中选择值。例如,如果我们有一个以自然数索引的数据类型,例如:

data T : ℕ → Set where

您可以拥有以下构造函数:

data T : ℕ → Set where
  t₀ : T zero
  t₁ : T (suc zero)

如上所述,仅T不是一种类型。在这种情况下,它是一个函数ℕ → Set


无论如何,回到你的代码。如果您认为Prod包含一个ℕ → (ℕ → ((ℕ → X) → X))类型的函数,那么它应该是:

data Prod (X : Set) : ℕ → Set where
  prod : (ℕ → (ℕ → ((ℕ → X) → X))) → Prod X zero

但是,我不知道你对索引的意图是什么。