本文将对基础命题逻辑概念及其在 Lean 4 编程语言与定理证明器中的形式化实现进行一次技术梳理。
无论你是希望将证明形式化的数学家,还是深入探索类型论的程序员,本指南都将从第一性原理出发重构逻辑体系。我们将从基本的逻辑常量开始,探索 Lean 4 如何利用柯里-霍华德同构(Curry-Howard Isomorphism)——即命题即类型(propositions are types)、*证明即程序(proofs are programs)*这一核心原则——优雅地对逻辑结构进行建模。
在定义逻辑联结词之前,我们需要先搭建一个基础环境。在 Lean 4 中,这通常通过两个特定命令来完成,以控制作用域和计算行为。
namespace Basic
noncomputable section
namespace Basic:此命令将我们的定义归入同一个命名空间,防止与 Lean 的内置标准库(Prelude)发生命名冲突。它允许我们出于教学目的,从零开始重新定义 True、False 和 And 等基础结构。noncomputable section:Lean 4 既是一个定理证明器,也是一门函数式编程语言。默认情况下,它会尝试为每个定义生成可执行的字节码。将某个部分标记为 noncomputable 会告诉编译器跳过这一步,这在形式逻辑中非常常见,因为在这里我们关心的是数学性质而非运行时执行。在本节中,我们将定义逻辑的基础元素,将标准数学符号映射为 Lean 4 代码。
最简单的命题就是普遍逻辑有效的命题。用编程术语来说, 的行为就像一个单元类型(Unit type)——它只有一个状态,且不携带任何额外数据。
定义:
inductive True : Prop where
| intro : True
因为它仅由单个构造器(intro)定义,所以“证明” True 的唯一方法就是提供这个确切的构造器。
示例:
-- 无条件证明 True
example : True := True.intro
-- 任意命题 'a' 都能平凡地推出 True
example {a : Prop} : a → True := fun _ => True.intro
True 是由证明的平凡存在所定义的,而 False 则是通过证明的完全缺失来定义的。它是一个空类型(Empty type 或 Void type)。
定义:
inductive False : Prop
因为 False 没有任何构造器,你永远无法凭空实例化它。它代表逻辑矛盾。
爆炸原理(Principle of Explosion / Ex Falso Quodlibet):
如果你发现自己手头持有一个 False 的证明,逻辑就会崩塌,你可以由此证明任何事情。Lean 使用递归器(recursor)False.elim 来处理这种情况。
-- 从假命题可以推出任意命题 'a'(⊥ → a)
def False.elim {a : Prop} (false_proof : False) : a :=
false_proof.rec
在 Lean 4 中,否定并不是一个原生的内置概念。相反,它是利用蕴涵和 False 以函数方式定义的。要证明命题 为假(记作 ),你必须展示一个函数:在该函数中,假设 成立会直接导出矛盾()。
定义:
def Not (a : Prop) : Prop := a → False
关键定理:
-- 证明否定:如果假设 'a' 能证明 False,那么 Not 'a' 为真。
theorem Not.intro {a : Prop} (h : a → False) : Not a :=
fun ha => h ha
-- 双重否定引入(a → ¬¬a)
theorem not_not_intro {a : Prop} (ha : a) : Not (Not a) :=
fun na => na ha -- 'na' 的类型为 (a → False),因此传入 'ha' 会产生 False。
-- 拒取式(Modus Tollens):如果 (a → b) 且 (¬b),则 (¬a)
theorem Not.imp {a b : Prop} (nb : Not b) (ab : a → b) : Not a :=
fun ha =>
have hb : b := ab ha
nb hb
由于 Lean 建立在类型论之上,逻辑蕴涵()在字面意义上就被当作函数来处理。要证明 蕴涵 ,你必须编写一个接受任意 的证明并返回 的证明的函数。
链式蕴涵示例: 如果你能把 转化为 ,并且能把 转化为 ,那么你就可以将一个从 的函数转化为一个从 的函数。
theorem imp_imp_imp {a b c d : Prop}
(ca : c → a) (bd : b → d) : (a → b) → (c → d) :=
fun ab => fun hc =>
have ha : a := ca hc
have hb : b := ab ha
bd hb
逻辑合取要求 和 同时为真,它在 Lean 中被建模为 structure(结构体)。用编程术语来说,这是一个积类型(Product type,即结构体或元组),同时持有两份独立的证据。
定义:
structure And (a b : Prop) : Prop where
intro ::
left : a
right : b
关键证明模式:
-- 引入规则:构造一个 And
example {a b : Prop} (ha : a) (hb : b) : And a b :=
And.intro ha hb
-- 对称性:a ∧ b → b ∧ a
theorem And.symm {a b : Prop} (h : And a b) : And b a :=
And.intro h.right h.left
逻辑析取要求两个命题中至少有一个为真。与 And 不同,Or 是一个归纳定义的和类型(Sum type,即带标签联合体),因为存在两种截然不同、二选一的方式来构造其证明。
定义:
inductive Or (a b : Prop) : Prop where
| inl (h : a) : Or a b
| inr (h : b) : Or a b
要证明 ,你可以将 的证明包装在 inl(左注入,inject-left)构造器中,或者将 的证明包装在 inr(右注入,inject-right)构造器中。
示例:
-- 对称性:a ∨ b → b ∨ a
theorem Or.symm {a b : Prop} (h : Or a b) : Or b a :=
match h with
| Or.inl ha => Or.inr ha
| Or.inr hb => Or.inl hb
双向蕴涵,即“当且仅当”(Iff),表示两个命题在逻辑上等价。它被定义为一个同时持有两个方向蕴涵关系的结构体。
定义:
structure Iff (a b : Prop) : Prop where
intro ::
mp : a → b
mpr : b → a
自反性示例:
-- 每个命题都与其自身等价(a ↔ a)
theorem Iff.refl {a : Prop} : Iff a a :=
Iff.intro (fun ha => ha) (fun ha => ha)
通过在 Lean 4 中从零开始重建命题逻辑,我们揭示了形式化系统的机械之美:
And 是结构体,Or 是枚举,True 是单元类型(unit),而 False 是空类型(void)。掌握这些基础构建块,将为你攻克更复杂的数学定理、谓词逻辑以及复杂软件系统的形式化验证铺平道路。
获取《卡乌埃的生活方式》精选离线版——一份全面优化 🍏 健康、💰 财富、❤️ 爱 与 🧘 意义 的实践指南。
当我发布关于美好生活的新随笔、读书笔记和实践指南时接收通知。绝无垃圾邮件——可随时退订。
有任何问题、见解或建议吗?欢迎在下方分享您的想法。评论功能由 GitHub Discussions 驱动(无广告、无垃圾信息)——点击下方的使用 GitHub 登录即可发表评论或互动(注册免费 GitHub 账号不到一分钟即可完成)。
最后更新于 2026年10月11日.
免责声明:本站所有内容仅供信息参考与教育用途,不构成任何医疗、心理、财务、投资、税务或法律建议。此处呈现的观点、整理与见解仅代表我个人,不代表我雇主的立场。书籍、演讲及文章摘要均为独立的教育性评论,其知识产权归原作者所有。本站可能使用 AI 工具辅助编辑、排版与归纳;尽管我们竭力确保准确无误,但仍可能存在疏漏。隐私政策:本站使用第三方服务提供可选的邮件通讯订阅(follow.it)、评论(giscus / GitHub Discussions)以及嵌入媒体(YouTube),这些服务可能会依据各自的隐私政策处理访客的 IP 地址和 Cookie。