Agda的`rewrite`失败,错误提到变量“w”

时间:2017-11-21 03:44:17

标签: agda

我有这些定义(删除了无效的定义)

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   当检查类型
时   (c d w:ℕ)→
  w≡d* c→
  (a:ℕ)(x:c> 0)(y:d> 0)→
  a÷w⟨x*> 0y⟩≡a÷d *c⟨y*> 0 x⟩
  生成函数的结构良好

1 个答案:

答案 0 :(得分:2)

此处的问题是,当您将c * d重写为d * c时,您还需要将x *>0 y的证明c * d >0修补为d * c >0的证据}。

我个人会介绍两个中间引理:

>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 ⟩

允许您使用相等的值替换的第二个组件,并将现在过时的证明p : b >0替换为另一个q : c >0>0-irrelevant将有助于证明这第二个引理。