agda学习笔记---证明加法交换律和结合律
agda学习笔记---证明加法交换律和结合律
真的一切推倒重来啊
总之所有的证明基于加法的定义
等式
begin
起始
==< 依据 >
...
结论
\qed
cong : x == y -> f x == f y
cong-app : \forall x f == g -> f x == g x
sym x== y -> y == x
import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl; cong; sym) open Eq.≡-Reasoning using (begin_; _≡⟨⟩_; step-≡; _∎) data ℕ : Set where zero : ℕ suc : ℕ → ℕ --add _+_ : ℕ → ℕ → ℕ zero + m = m suc n + m = suc (n + m) --multiply _*_ : ℕ → ℕ → ℕ zero * m = zero suc n * m = (n * m) + m --proof: +-assoc : ∀ (m n p : ℕ) → (m + n) + p ≡ m + (n + p) +-assoc zero n p = begin (zero + n) + p ≡⟨⟩ n + p ≡⟨⟩ zero + (n + p) ∎ +-assoc (suc m) n p = begin (suc m + n) + p ≡⟨⟩ suc (m + n) + p ≡⟨⟩ suc ((m + n) + p) ≡⟨ cong suc (+-assoc m n p) ⟩ suc (m + (n + p)) ≡⟨⟩ suc m + (n + p) ∎ +-identityr : ∀ (m : ℕ) → m + zero ≡ m +-identityr zero = refl +-identityr (suc m) = begin suc m + zero ≡⟨⟩ suc (m + zero) ≡⟨ cong suc (+-identityr m) ⟩ suc m ∎ +-suc : ∀ (n m : ℕ) → n + suc m ≡ suc (n + m) +-suc zero m = begin zero + suc m ≡⟨⟩ suc m ≡⟨⟩ suc (zero + m) ∎ +-suc (suc n) m = begin suc n + suc m ≡⟨⟩ suc (n + suc m) ≡⟨ cong suc (+-suc n m) ⟩ suc (suc (n + m)) ≡⟨⟩ suc (suc n + m) ∎ +-comm : ∀ (n m : ℕ) → n + m ≡ m + n +-comm m zero = begin m + zero ≡⟨ +-identityr m ⟩ m ≡⟨⟩ zero + m ∎ +-comm m (suc n) = begin m + suc n ≡⟨ +-suc m n ⟩ suc (m + n) ≡⟨ cong suc (+-comm m n) ⟩ suc (n + m) ≡⟨⟩ suc n + m ∎
这是对加法交换律和结合率的证明
证明交换率的时候需要先证明两个引理:
① : 0 是加法的右幺元
②: m + suc n = suc (m + n)
小练习
--practice +-swap : ∀ (m n p : ℕ) → (m + n) + p ≡ n + (m + p) +-swap zero n p = refl +-swap (suc m) n p = begin ((suc m + n) + p) ≡⟨⟩ suc (m + n) + p ≡⟨⟩ suc ((m + n) + p) ≡⟨ cong suc (+-swap m n p) ⟩ suc (n + (m + p)) ≡⟨ cong suc (+-comm n (m + p)) ⟩ suc ((m + p) + n) ≡⟨⟩ suc (m + p) + n ≡⟨ +-comm (suc (m + p)) n ⟩ n + suc (m + p) ≡⟨⟩ n + (suc m + p) ∎
agda真的严格的半死
只要不是定义就必须要写依据
rewrite
+-swap' : ∀ (m n p : ℕ) → (m + n) + p ≡ n + (m + p) +-swap' zero n p = refl +-swap' (suc m) n p rewrite +-swap' m n p | +-comm n (m + p) | +-comm n (suc (m + p)) = refl
用 rewrite 来改写!
rewrite 后面的用 | 隔开, 证明顺序从左到右
crtl + c ctrl + l : load
ctrl + c ctrl + c :填入变量
ctrl + c ctrl + , :显示goal
ctrl +c ctrl + a : 自动填充
有点酷啊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?