You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Agda证明整除加法封闭性时约束求解失败求助

Agda中证明自然数整除加法封闭性(∣-plus)的约束求解失败问题

在使用Agda证明自然数整除的加法封闭性(∣-plus)时,遇到了约束求解失败的问题,以下是相关代码、错误信息及尝试过的解决思路:

初始代码

module div where

open import Data.Nat using (ℕ; zero; suc; _+_)
open import Data.Nat.Properties using (+-assoc)
open import Relation.Binary.PropositionalEquality
  using (_≡_; refl; cong; sym; trans)

data _∣_ : ℕ → ℕ → Set where
    0∣0 : zero ∣ zero
    m∣0 : ∀ {d} → suc d ∣ zero
    m∣n : ∀ {d m} → suc d ∣ m → suc d ∣ suc (m + d)

infix 4 _∣_

∣-refl : ∀ a → a ∣ a
∣-refl zero = 0∣0
∣-refl (suc a) = m∣n m∣0

+zero : ∀ m → m + zero ≡ m
+zero zero = refl
+zero (suc m) rewrite +zero m = refl

+n : ∀ {m n : ℕ} → m + suc n ≡ suc (m + n)
+n {zero} {n} = refl
+n {suc m} {n} = cong suc (+n)

d-suc : ∀ {m n : ℕ} → suc (m + suc n) ≡ suc (suc (m + n))
d-suc = cong suc (+n)


∣-plus : ∀ a b c → a ∣ b → a ∣ c → a ∣ b + c
∣-plus .zero .zero c 0∣0 r₂ = r₂
∣-plus .(suc _) .zero c m∣0 r₂ = r₂
∣-plus _ (suc w) .zero (m∣n r₁) m∣0 rewrite +zero w = m∣n r₁
∣-plus (suc d) .(suc (_ + _)) .(suc (_ + _)) (m∣n r₁) (m∣n r₂) = {!   !} 

错误信息

运行Agda后,最后一行出现如下约束求解失败错误:

Failed to solve the following constraints:
  _63 + _64 = m + d : ℕ (blocked on _63)
  _61 + _62 = m₁ + d : ℕ (blocked on _61)

尝试的修改与问题

修改模式匹配

我尝试将最后一行的模式匹配改为:

∣-plus (suc d) (suc (m₁ + d)) (suc (m₂ + d)) (m∣n r₁) (m∣n r₂) = ?

此时目标应为?0 : suc d ∣ suc (m₁ + d + suc (m₂ + d)),理论上可通过d-suc转换目标,但因约束错误无法获取m₁和m₂,无法证明等式suc (suc(m₁ + d + (m₂ + d))) ≡ suc (suc(m₁ + m₂ + d + d))。

简化证明逻辑

后续我简化了证明结构:

∣-plus : ∀ a b c → a ∣ b → a ∣ c → a ∣ b + c
∣-plus .zero .zero c 0∣0 r₂ = r₂
∣-plus .(suc _) .zero c m∣0 r₂ = r₂
∣-plus .(suc _) .(suc _) c (m∣n r₁) r₂ = ?

目标变为0? : suc d ∣ suc (m + d + c),虽可通过m∣n (∣-plus _ _ _ r₁ r₂)得到suc d ∣ suc (m + c + d),但缺少d和m的绑定,无法应用加法交换等式m + d + c = m + c + d。

添加交换引理

之后我添加了自定义的加法交换引理++ex:

open import Data.Nat.Properties using (+-assoc; +-comm; +-identityʳ)

++ex : ∀ {a b c : ℕ} → a + b + c ≡ a + c + b
++ex {zero} {b} {c} rewrite +-comm b c = refl
++ex {suc a} {b} {c} = cong suc (++ex {a} {b} {c})

∣-plus : ∀ a b c → a ∣ b → a ∣ c → a ∣ b + c
∣-plus .zero .zero c 0∣0 r₂ = r₂
∣-plus .(suc _) .zero c m∣0 r₂ = r₂
∣-plus (suc d) .(suc _) c (m∣n r₁) r₂ with m∣n (∣-plus _ _ _ r₁ r₂)
... | s rewrite ++ex {_} {c} {d} = {!  !}

但依旧无法获取m来应用该引理,请问该如何解决这个问题?


内容的提问来源于stack exchange,提问作者maplgebra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:45:05