关于 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 什么是 ℓ
、A
、x
和 y
是。类似地,通过将 {z}
标记为隐式参数,您不需要将其显式传递给 lemma1c
,并且通常不需要在行 lemma1c {z} = ...
.[=19= 上匹配它]
我是 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 什么是 ℓ
、A
、x
和 y
是。类似地,通过将 {z}
标记为隐式参数,您不需要将其显式传递给 lemma1c
,并且通常不需要在行 lemma1c {z} = ...
.[=19= 上匹配它]