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

如何显式证明PLFA中inv-z≤n的m≡zero?

PLFA中inv-z≤n的显式证明解析

要搞清楚m ≡ zero的推导逻辑,得先回到PLFA里自然数小于等于关系_≤_的定义:

data _≤_ : ℕ → ℕ → Set where
  z≤n : ∀ {n : ℕ} → zero ≤ n
  s≤s : ∀ {m n : ℕ} → m ≤ n → suc m ≤ suc n

显式分情况证明

我们可以通过模式匹配分情况写出完整的推导步骤,把“为什么m必须是zero”的逻辑展现出来:

open import Relation.Binary.PropositionalEquality using (_≡_; refl; begin_; _≡⟨⟩_; _∎)
open import Data.Nat using (ℕ; zero; suc; _≤_)

inv-z≤n : ∀ {m : ℕ} → m ≤ zero → m ≡ zero
-- 情况1:m是zero时,前提是zero ≤ zero,直接用refl证明相等
inv-z≤n {zero} z≤n =
  begin
    zero
  ≡⟨ refl ⟩
    zero
  ∎
-- 情况2:m是suc k时,不存在suc k ≤ zero的构造子,用空模式消去不可能的情况
inv-z≤n {suc k} ()

推导逻辑说明

给定前提m ≤ zero,只有两种可能的m:

  • 当m = zero:此时前提就是zero ≤ zero,正好匹配z≤n构造子,zero ≡ zero的证明就是refl,这是最直接的等式;
  • 当m = suc k:根据_≤_的构造规则,只有s≤s能构造出以suc开头的左边,但s≤s要求右边也是suc n,而zero不是任何suc n,所以这种情况不存在对应的前提构造子,用空模式()直接消去即可,不需要额外证明。

如果非要用你期望的单分支等式推理形式,也可以利用模式匹配后m被约束为zero的上下文信息,显式写出:

inv-z≤n {m} z≤n =
  begin
    m
  ≡⟨ refl ⟩ -- 此时上下文里m已经被推断为zero,refl即证明m≡zero
    zero
  ∎

这里的关键是:当你匹配到z≤n时,Agda的类型检查器已经能推断出m必须是zero,所以refl本质上就是在说zero ≡ zero。

内容的提问来源于stack exchange,提问作者Werner Germán Busch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:57:22