Agda 的 `rewrite` 失败并出现错误提及变量 "w"
Agda's `rewrite` fails with an error mentioning variable "w"
我有这些定义(不相关的已删除)
open import Agda.Builtin.Nat renaming (Nat to ℕ)
infix 3 _>0
data _>0 : ℕ → Set where
intro : ∀ n → suc n >0
infix 4 _*>0_
_*>0_ : ∀ {a b} → a >0 → b >0 → a * b >0
intro n *>0 intro m = intro (m + n * suc m)
infix 5 _÷_⟨_⟩
data ℚ : Set where
_÷_⟨_⟩ : (a b : ℕ) → b >0 → ℚ
我想证明这是真的:
open import Agda.Builtin.Equality
div-mul-comm : ∀ a c d → (x : c >0) → (y : d >0) →
a ÷ c * d ⟨ x *>0 y ⟩ ≡ a ÷ d * c ⟨ y *>0 x ⟩
div-mul-comm a c d x y = ?
但是无论我怎么尝试都无法证明这一点,而且错误信息很奇怪。
这是我试过的:
postulate nat-multiply-comm : ∀ a b → a * b ≡ b * a
div-mul-comm a c d x y
rewrite nat-multiply-comm c d = {!!}
阿格达说:
c * d != w of type ℕ
when checking that the type
(c d w : ℕ) →
w ≡ d * c →
(a : ℕ) (x : c >0) (y : d >0) →
a ÷ w ⟨ x *>0 y ⟩ ≡ a ÷ d * c ⟨ y *>0 x ⟩
of the generated with function is well-formed
这里的问题是,当你将c * d
重写为d * c
时,你还需要将c * d >0
的证明x *>0 y
修补成[=的证明16=].
我个人会介绍两个中间引理:
>0-irrelevant : ∀ a → (p q : a >0) → p ≡ q
这允许您根据需要交换 a >0
的证明。并且
div-subst : ∀ a b c → b ≡ c → (p : b >0) (q : c >0) →
a ÷ b ⟨ p ⟩ ≡ a ÷ c ⟨ q ⟩
它允许您用相等的值替换 ℚ
的第二个组件,并用另一个 q : c >0
替换现在过时的证明 p : b >0
。 >0-irrelevant
将有助于证明第二个引理。
我有这些定义(不相关的已删除)
open import Agda.Builtin.Nat renaming (Nat to ℕ)
infix 3 _>0
data _>0 : ℕ → Set where
intro : ∀ n → suc n >0
infix 4 _*>0_
_*>0_ : ∀ {a b} → a >0 → b >0 → a * b >0
intro n *>0 intro m = intro (m + n * suc m)
infix 5 _÷_⟨_⟩
data ℚ : Set where
_÷_⟨_⟩ : (a b : ℕ) → b >0 → ℚ
我想证明这是真的:
open import Agda.Builtin.Equality
div-mul-comm : ∀ a c d → (x : c >0) → (y : d >0) →
a ÷ c * d ⟨ x *>0 y ⟩ ≡ a ÷ d * c ⟨ y *>0 x ⟩
div-mul-comm a c d x y = ?
但是无论我怎么尝试都无法证明这一点,而且错误信息很奇怪。
这是我试过的:
postulate nat-multiply-comm : ∀ a b → a * b ≡ b * a
div-mul-comm a c d x y
rewrite nat-multiply-comm c d = {!!}
阿格达说:
c * d != w of type ℕ
when checking that the type
(c d w : ℕ) →
w ≡ d * c →
(a : ℕ) (x : c >0) (y : d >0) →
a ÷ w ⟨ x *>0 y ⟩ ≡ a ÷ d * c ⟨ y *>0 x ⟩
of the generated with function is well-formed
这里的问题是,当你将c * d
重写为d * c
时,你还需要将c * d >0
的证明x *>0 y
修补成[=的证明16=].
我个人会介绍两个中间引理:
>0-irrelevant : ∀ a → (p q : a >0) → p ≡ q
这允许您根据需要交换 a >0
的证明。并且
div-subst : ∀ a b c → b ≡ c → (p : b >0) (q : c >0) →
a ÷ b ⟨ p ⟩ ≡ a ÷ c ⟨ q ⟩
它允许您用相等的值替换 ℚ
的第二个组件,并用另一个 q : c >0
替换现在过时的证明 p : b >0
。 >0-irrelevant
将有助于证明第二个引理。