从哪里获得agda的第二个参数?

时间:2016-02-12 11:44:33

标签: agda

在以下数据类型中,

data _≡_ {A : Set} (x : A) : A → Set  where
  refl : x ≡ x

我试图理解这个:

  

如果A的类型为Set且隐式且x是第一个参数且类型为A,那么这将构造类型{{1}的数据}}

请解释一下。我没有从构造函数A → Set中获得第二个x的位置。

1 个答案:

答案 0 :(得分:4)

这里的关键区别在于参数(在这种情况下为Ax)和 indices A in A → Set)。

参数位于数据声明中冒号的左侧。它们属于该类型的范围,并且可能不会变化(因此它们的名称)。这使您可以编写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表示n1indeed2+表示n的形状为suc (suc p)

回到你在问题中引用的声明,我们可以用完全明确的等效形式重新表述:

data Eq (A : Set) (x : A) : (y : A) → Set where
  refl : Eq A x x

我们在此处看到Eq有两个参数(A是一个集合,xA的元素)和一个索引y我们声称等于x的东西。 refl指出构建两个xy两个事物相同的证据的唯一方法是它们是否完全相同;它将y限制为x