Agda类型错误

Agda类型错误,agda,Agda,我是Agda的新手,我正在尝试定义一个常量prod,类型为: Z→ (Z)→ ((Z)→ (套)→ 设置)的值。 现在,我已经编写了以下Agda代码: data Prod (X : Set) : ℕ → X where prod : ℕ → (ℕ → ((ℕ → X) → X)) 当我键入check it时,agda生成以下错误消息: X != Set (_33 X_) of type Set when checking the definition of Prod 非常感谢您的帮助您

我是Agda的新手,我正在尝试定义一个常量
prod
,类型为:
Z→ (Z)→ ((Z)→ (套)→ 设置)的值。

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

data Prod (X : Set) : ℕ → X where 
prod : ℕ → (ℕ → ((ℕ → X) → X))
当我键入check it时,agda生成以下错误消息:

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

非常感谢您的帮助

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

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

所以这没关系:

data T : Set where

定义的第二个问题是
prod
构造函数的类型没有反映出它真正构造了
prod
类型的东西。构造函数的要点是,它们可以是您正在定义的类型的元素

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

data ℕ : Set where
  zero : ℕ
  suc  : ℕ → ℕ
当我们写
zero时:ℕ,我们是说
是一个自然数。如果我们换成这个呢:

data ℕ : Set where
  zero : String
  suc  : ℕ → ℕ
我们定义的是自然数,我们定义
是一个
字符串
?因此,因为我们定义的是构造函数,所以我们给它的类型必须提到我们在最后一个位置定义的类型。(这一提及也可以是间接的)


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

data T (A : Set) : Set where
  t : T ℕ
请注意,
T
本身是不够的——它不是一个类型,而是一种从类型到类型的函数(即
Set)→ 设置
)。这个没问题:

data T (A : Set) : Set where
  t : T A
冒号右边是索引。这些类似于参数,只是您可以在构造函数中选择值。例如,如果我们有一个按自然数索引的数据类型,例如:

data T : ℕ → Set where
您可以使用如下构造函数:

data T : ℕ → Set where
  t₀ : T zero
  t₁ : T (suc zero)
很像上面提到的,
T
本身并不是一种类型。在这种情况下,它是一个函数
ℕ → 设置


无论如何,回到你的代码。如果您的意思是
Prod
包含一个
ℕ → (ℕ → ((ℕ → 十)→ 十) )
,则应为:

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

但是,我不知道您使用索引的目的是什么。

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

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

所以这没关系:

data T : Set where

定义的第二个问题是
prod
构造函数的类型没有反映出它真正构造了
prod
类型的东西。构造函数的要点是,它们可以是您正在定义的类型的元素

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

data ℕ : Set where
  zero : ℕ
  suc  : ℕ → ℕ
当我们写
zero时:ℕ,我们是说
是一个自然数。如果我们换成这个呢:

data ℕ : Set where
  zero : String
  suc  : ℕ → ℕ
我们定义的是自然数,我们定义
是一个
字符串
?因此,因为我们定义的是构造函数,所以我们给它的类型必须提到我们在最后一个位置定义的类型。(这一提及也可以是间接的)


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

data T (A : Set) : Set where
  t : T ℕ
请注意,
T
本身是不够的——它不是一个类型,而是一种从类型到类型的函数(即
Set)→ 设置
)。这个没问题:

data T (A : Set) : Set where
  t : T A
冒号右边是索引。这些类似于参数,只是您可以在构造函数中选择值。例如,如果我们有一个按自然数索引的数据类型,例如:

data T : ℕ → Set where
您可以使用如下构造函数:

data T : ℕ → Set where
  t₀ : T zero
  t₁ : T (suc zero)
很像上面提到的,
T
本身并不是一种类型。在这种情况下,它是一个函数
ℕ → 设置


无论如何,回到你的代码。如果您的意思是
Prod
包含一个
ℕ → (ℕ → ((ℕ → 十)→ 十) )
,则应为:

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

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

回到我的问题,我想定义某种缩写或一个表示这种类型的常量。现在我已经阅读了你的答案,我意识到一个新的数据类型不能完成这项工作。。因此,我想到了函数,并编写了以下代码,它是有效的:prod={X:Set}→ ℕ → (ℕ → ((ℕ → 十)→ 十) )但如果我想用它来定义,我不知道如何使用它lemmas@ymmagdi:因为类型是Agda中的第一类,所以可以使用函数获取和返回类型,所以这确实是可能的。请看
Op₂函数。至于如何使用它——好吧,如果不知道你想做什么,很难说;如果你陷入困境,请考虑问另一个问题(这比在评论中处理好),我来看看我能不能帮助。回到我的问题,我想定义一些缩写词或一个常量来引用这个类型。现在我已经阅读了你的答案,我意识到一个新的数据类型不能完成这项工作。。因此,我想到了函数,并编写了以下代码,它是有效的:prod={X:Set}→ ℕ → (ℕ → ((ℕ → 十)→ 十) )但是我不知道怎么做