关于 Agda 中的平等

About equality in Agda

我是 Agda 新手。我有以下要证明的代码。现在我对 lemma1c 有疑问。 因为它要我证明当 z = a 时,z 将等于 c。我有 a = c 和 c = c,以及 trans 函数。所以我试着写

lemma1c = trans {z = a}, {a = c}

但我想得到 z is not in scope 错误。我该如何解决?


postulate
  A : Set
  a : A
  b : A
  c : A
  p : a ≡ b
  q : b ≡ c
  trans : ∀ {ℓ}{A : Set ℓ}{x y z : A} → x ≡ y → y ≡ z → x ≡ z
  trans refl refl = refl

  lemma0 : c ≡ c
  lemma0 = refl
  -- Goal: c ≡ c, refl: x ≡ x
  lemma1a : a ≡ c
  lemma1a rewrite p = q

  lemma1c : ∀ {z : A} → z ≡ a → z ≡ c
  lemma1c {z} = trans {} {lemma1a}

您必须使用显式参数(不带括号)调用 trans 函数,这导致以下定义:

lemma1c : ∀ {z : A} → z ≡ a → z ≡ c
lemma1c z≡a = trans z≡a lemma1a

您也可以像在前面的引理中那样使用 rewrite

lemma1d : ∀ {z : A} → z ≡ a → z ≡ c
lemma1d z≡a rewrite lemma1a = z≡a

花括号用于标记隐式参数。也就是说,通常 Agda 可以从上下文中计算出的参数——比如,通过将依赖类型的 x ≡ y 传递给 trans,你已经告诉 Agda 什么是 Axy 是。类似地,通过将​​ {z} 标记为隐式参数,您不需要将其显式传递给 lemma1c,并且通常不需要在行 lemma1c {z} = ....[=19= 上匹配它]