代码之家  ›  专栏  ›  技术社区  ›  ice1000

Agda的“重写”失败,出现一个提到变量“w”的错误

  •  4
  • ice1000  · 技术社区  · 7 年前

    我有这些定义(删除不相关的定义)

    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 = {!!}
    

    Agda表示:

    c*d!=w型
    检查类型时
    (c d w:)
    w d*c
    (a:)(x:c>0)(y:d>0)
    a÷wŸ¨x*>0 y–aÃd*c–y*>0 x–Ÿ)
    函数的生成形式良好

    1 回复  |  直到 7 年前
        1
  •  2
  •   gallais    7 年前

    这里的问题是当你重写 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 将有助于证明第二个引理。