Lean直觉主义逻辑
外观
Lean直觉主义逻辑是Lean定理证明器中实现的一种构造性逻辑体系,与经典逻辑不同,它强调数学对象的构造性证明而非纯粹的真值判定。本条目将系统介绍其在Lean中的表现形式、语法规则及实际应用。
核心概念[编辑 | 编辑源代码]
直觉主义逻辑(又称构造性逻辑)拒绝使用排中律(),其核心原则包括:
- 证明即构造:命题为真当且仅当能提供具体证明
- 否定即构造性反驳:表示"若假设A成立则可导出矛盾"
- 存在量词承诺构造:要求必须给出具体实例
在Lean中,直觉主义逻辑是默认逻辑框架,经典逻辑需通过显式引入classical
库启用。
与经典逻辑的关键差异[编辑 | 编辑源代码]
特性 | 直觉主义逻辑 | 经典逻辑 |
---|---|---|
排中律 | 不成立 | 成立 |
双重否定律 | ||
存在量词解释 | 构造性存在 | 潜在存在 |
Lean语法实现[编辑 | 编辑源代码]
基本命题构造[编辑 | 编辑源代码]
-- 直觉主义命题示例
variables (P Q : Prop)
-- 直接证明:构造合取
example : P → Q → P ∧ Q :=
λ hp hq, ⟨hp, hq⟩
-- 不可构造的例子(无法通过编译)
example : P ∨ ¬P := sorry -- 需要经典逻辑
否定与矛盾处理[编辑 | 编辑源代码]
-- 否定通过矛盾定义
def not_intro {P : Prop} (h : P → false) : ¬P := h
-- 直觉主义反证法
example (P Q : Prop) (h1 : ¬Q → ¬P) (h2 : P) : Q :=
begin
intro hnq,
exact absurd h2 (h1 hnq) -- 使用absurd规则
end
存在量词构造[编辑 | 编辑源代码]
-- 构造性存在证明
example : ∃ n : ℕ, n > 0 :=
⟨1, nat.zero_lt_one⟩ -- 必须提供具体实例
-- 非构造性存在无法证明
example : (∃ x, P x) ∨ ¬∃ x, P x := sorry -- 需要经典逻辑
类型论视角[编辑 | 编辑源代码]
在Curry-Howard同构下,Lean的直觉主义逻辑对应类型系统:
具体对应关系:
- 蕴含 → 函数类型
- 合取 → 积类型
- 析取 → 和类型
- 真命题 → 单例类型
实际应用案例[编辑 | 编辑源代码]
算法正确性验证[编辑 | 编辑源代码]
构造性证明天然适合验证算法:
def binary_search (arr : array ℕ) (target : ℕ) : option ℕ :=
-- 实现省略
lemma binary_search_correct :
∀ arr target, is_sorted arr →
(∃ i, binary_search arr target = some i ↔ arr[i] = target) :=
begin
-- 构造性证明必须给出定位算法
apply array.binary_search_eq_some_iff -- 实际会调用构造性存在证明
end
程序提取[编辑 | 编辑源代码]
Lean允许从构造性证明中提取可执行代码:
-- 构造性存在证明产生可计算项
theorem sqrt_exists : ∀ x ≥ 0, ∃ y, y² = x :=
begin
-- 证明过程隐含牛顿迭代算法
end
-- 可提取为实际计算函数
#eval extract sqrt_exists 2 -- 输出1.4142...
与经典逻辑交互[编辑 | 编辑源代码]
在需要时可通过以下方式引入经典推理:
open classical
-- 现在可以使用排中律
example (P : Prop) : P ∨ ¬P :=
em P
-- 双重否定消除
example (P : Prop) (h : ¬¬P) : P :=
by_contradiction (λ hn, h hn)
学习建议[编辑 | 编辑源代码]
对于习惯经典逻辑的学习者,建议:
1. 练习将非构造性证明改写为构造性版本
2. 通过Curry-Howard同构理解命题的类型含义
3. 使用#print axioms
命令检查证明的非构造性部分
进阶主题[编辑 | 编辑源代码]
- Brouwer-Heyting-Kolmogorov解释:三值语义模型
- Kripke模型:直觉主义逻辑的可能世界语义
- 拓扑语义:将命题解释为开集
- 线性逻辑:进一步限制逻辑结构