在下面的数据类型,从agda获得第二个参数?
data _≡_ {A : Set} (x : A) : A → Set where
refl : x ≡ x
我想明白这一点,如:
如果
A
是Set
型的,是隐含的x
是第一个参数和A
类型,那么这将构建类型为A → Set
的数据。
请解释一下。我没有得到第二个x
,在构造函数refl
。
在下面的数据类型,从agda获得第二个参数?
data _≡_ {A : Set} (x : A) : A → Set where
refl : x ≡ x
我想明白这一点,如:
如果
A
是Set
型的,是隐含的x
是第一个参数和A
类型,那么这将构建类型为A → Set
的数据。
请解释一下。我没有得到第二个x
,在构造函数refl
。
关键这里的区别是参数(在这种情况下A
和x
)和指数(在A → Set
的A
)之间。
参数位于数据声明中冒号的左侧。他们在范围内的范围内,可能不会有所不同(因此他们的名字)。这是什么让你将数据写入宣言,如List
其中包含在这些List
元素的类型声明一劳永逸:
data List (A : Set) : Set where
nil : List A
cons : A → List A → List A
,而不是用∀ A →
提到它在每一个构造函数:
data List : Set → Set1 where
nil : ∀ A → List A
cons : ∀ A → A → List A → List A
的指数位于在数据声明冒号的右边。它们可以是由构造函数引入的新变量,也可以是与其他术语相同的约束。
如果用自然数的工作就可以了,例如,建立一个谓语,指出了一些不zero
就像这样:
open import Data.Nat
data NotZero : (n : ℕ) → Set where
indeed1 : NotZero (suc zero)
indeed2+ : ∀ p → NotZero (suc (suc p))
这里n
数据声明的类型签名提到的是指数。它受到不同构造函数的不同约束:indeed1
表示n
是1
而indeed2+
表示n
的形状为suc (suc p)
。
要回到你在你的问题引用的声明,我们可以在一个完全明确的等价形式重新制定它:
data Eq (A : Set) (x : A) : (y : A) → Set where
refl : Eq A x x
这里我们看到Eq
有两个参数(A
是一组与x
是一个元素A
)和一个索引y
这是我们要声称等于x
。 refl
指出,建立两个东西x
和y
相等的证明的唯一方法是如果它们完全相同;它将y
约束为x
。