我只是在学习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)
我无法理解原因。请解释。感谢。
答案 0 :(得分:3)
问题在于依赖类型理论如何处理平等问题。通常,添加的定义是:
_+_ : Nat -> Nat -> Nat
zero + m = m -- (1)
(suc n) + m = suc (n + m) -- (2)
请注意,等式1表示左侧身份。当你有:
forall n -> 0 + n = n
Agda的类型检查器可以使用加法的等式(1)来验证等式是否成立。请记住,命题相等构造函数(refl
)的类型为
refl : x == x
因此,当您使用refl
作为左侧身份的证明时,Agda将尝试减少相等的两面(将它们标准化)并检查它们是否确实相等。使用加法的定义,左边的身份是立即的,通过等式(1)。
但是对于正确的身份,这并不符合定义。请注意,当我们有
时n + 0 == n
Agda的类型检查器不能使用加法方程式来检查这种等式是否确实成立。证明这种平等的唯一方法是使用归纳法(或者,如果你愿意,可以使用递归)。
希望这可以帮助你。