以下引理应该是微不足道的:将加号和自然符号组合起来与使用自然的加号构造函数相同。
module sign where
open import Data.Nat
open import Data.Integer using (_◃_; +_)
open import Data.Sign renaming (+ to s+)
open import Relation.Binary.PropositionalEquality
lemma : ∀ y → s+ ◃ y ≡ + y
lemma y = refl
但是lemma
未能用以下方法进行检查:
s+ ◃ y != + y of type Data.Integer.ℤ
when checking that the expression refl has type s+ ◃ y ≡ + y
我正在使用lib-0.7
,根据this link,◃
定义为:
_◃_ : Sign → ℕ → ℤ
_ ◃ ℕ.zero = + ℕ.zero
Sign.+ ◃ n = + n
Sign.- ◃ ℕ.suc n = -[1+ n ]
所以我希望s+ ◃ y
遵循第二个模式规则,评估为+ y
并进行类型检查才能成功。
什么是错?
答案 0 :(得分:3)
问题是第一个等式也可以用于s+ ◃ y
。只有在您知道y
不为零之后,才会应用第二个等式。
解决方案很简单:
lemma : ∀ y → s+ ◃ y ≡ + y
lemma zero = refl
lemma (suc _) = refl