【发布时间】:2019-08-14 23:57:51
【问题描述】:
我正在通过这本书学习 Idris:https://idris-hackers.github.io/software-foundations/pdf/sf-idris-2018.pdf
在进入简化证明部分时,我有点遇到障碍(是的,一开始就是正确的)。我正在处理的一小段代码是:
namespace Numbers
data Nat : Type where
Zero : Numbers.Nat
Successor : Numbers.Nat -> Numbers.Nat
plus : Numbers.Nat -> Numbers.Nat -> Numbers.Nat
plus Zero b = b
plus (Successor a) b = Successor(plus a b)
这些更简单的证明可以正常工作:
One : Numbers.Nat
One = Successor Zero
Two : Numbers.Nat
Two = Successor One
Three : Numbers.Nat
Three = Successor Two
proofOnePlusZero : plus One Zero = One
proofOnePlusZero = Refl
proofOnePlusZero' : plus Zero One = One
proofOnePlusZero' = Refl
但是,当我尝试复制更复杂的证明时,我得到了一个错误
-- works
plus_Z_n : (n : Numbers.Nat) -> plus Zero n = n
plus_Z_n n = Refl
-- breaks / errors
plus_Z_n' : (n : Numbers.Nat) -> plus n Zero = n
plus_Z_n' n = Refl
这是错误
When checking right hand side of plus_Z_n' with expected type
plus n One = Successor n
Type mismatch between
Successor n = Successor n (Type of Refl)
and
plus n (Successor Zero) = Successor n (Expected type)
Specifically:
Type mismatch between
Successor n
and
plus n (Successor Zero)
这是预期的行为 - 但建议是能够理解原因。我很茫然,正在寻找提示或如何考虑这一点。
【问题讨论】: