为什么 "Addition" 上的左身份是微不足道的证明,而右身份却不是?
Why Left Identity over "Addition" is trivial proof but Right Identity is not?
我只是在学习 Agda,但我不明白当我试图通过加法证明恒等式时,我发现左恒等式是微不足道的证明。
left+identity : ∀ n -> (zero + n) ≡ n
left+identity n = refl
但正确的身份却不是这样。
right+identity : ∀ n -> (n + zero) ≡ n
right+identity zero = refl
right+identity (suc n) = cong suc (right+identity n)
我无法理解其中的原因。请解释。谢谢
问题是依赖类型理论如何处理平等。通常,加法的定义是:
_+_ : Nat -> Nat -> Nat
zero + m = m -- (1)
(suc n) + m = suc (n + m) -- (2)
请注意,等式一表示左身份。当你有:
forall n -> 0 + n = n
Agda 的类型检查器可以使用等式 (1) 的加法来验证等式是否成立。请记住,命题等式构造函数 (refl
) 的类型为
refl : x == x
因此,当您使用 refl
作为左恒等式的证明时,Agda 将尝试减少相等的两边(将它们归一化)并检查它们是否确实相等。使用加法的定义,左恒等式是立即的,由等式(1)
但是对于正确的身份,这在定义上并不成立。请注意,当我们有
n + 0 == n
Agda 的类型检查器不能使用加法方程来检查这个等式是否成立。证明这种等式的唯一方法是使用归纳法(或者,如果您愿意,可以使用递归)。
希望对您有所帮助。
我只是在学习 Agda,但我不明白当我试图通过加法证明恒等式时,我发现左恒等式是微不足道的证明。
left+identity : ∀ n -> (zero + n) ≡ n
left+identity n = refl
但正确的身份却不是这样。
right+identity : ∀ n -> (n + zero) ≡ n
right+identity zero = refl
right+identity (suc n) = cong suc (right+identity n)
我无法理解其中的原因。请解释。谢谢
问题是依赖类型理论如何处理平等。通常,加法的定义是:
_+_ : Nat -> Nat -> Nat
zero + m = m -- (1)
(suc n) + m = suc (n + m) -- (2)
请注意,等式一表示左身份。当你有:
forall n -> 0 + n = n
Agda 的类型检查器可以使用等式 (1) 的加法来验证等式是否成立。请记住,命题等式构造函数 (refl
) 的类型为
refl : x == x
因此,当您使用 refl
作为左恒等式的证明时,Agda 将尝试减少相等的两边(将它们归一化)并检查它们是否确实相等。使用加法的定义,左恒等式是立即的,由等式(1)
但是对于正确的身份,这在定义上并不成立。请注意,当我们有
n + 0 == n
Agda 的类型检查器不能使用加法方程来检查这个等式是否成立。证明这种等式的唯一方法是使用归纳法(或者,如果您愿意,可以使用递归)。
希望对您有所帮助。