Lean 经典逻辑
Lean是一种交互式定理证明器,广泛用于形式化数学和编程语言理论。经典逻辑是Lean中逻辑推理的基础之一,它与直觉逻辑不同,允许使用排中律和双重否定等经典推理规则。本文将带你逐步了解Lean中的经典逻辑,并通过代码示例和实际案例帮助你掌握这一概念。
什么是经典逻辑?
经典逻辑是一种基于排中律的逻辑系统,即对于任何命题 P
,P ∨ ¬P
总是成立。这意味着在经典逻辑中,我们可以假设一个命题要么为真,要么为假,没有中间状态。这与直觉逻辑不同,后者不承认排中律的普遍有效性。
在Lean中,经典逻辑通过引入额外的公理或规则来实现,例如 classical.em
(排中律)和 classical.by_contradiction
(反证法)。
经典逻辑的基本规则
排中律(Law of Excluded Middle)
排中律是经典逻辑的核心规则之一,它表明对于任何命题 P
,P ∨ ¬P
总是成立。在Lean中,我们可以通过 classical.em
来使用排中律。
example (P : Prop) : P ∨ ¬P :=
classical.em P
在这个例子中,classical.em P
返回 P ∨ ¬P
,无论 P
是什么命题。
反证法(Proof by Contradiction)
反证法是经典逻辑中常用的推理方法。它假设命题 P
为假,然后推导出矛盾,从而证明 P
为真。在Lean中,我们可以使用 classical.by_contradiction
来实现反证法。
example (P : Prop) : P :=
classical.by_contradiction
(assume h : ¬P,
show false, from sorry) -- 这里需要填充具体的矛盾推导
在这个例子中,我们假设 ¬P
为真,然后推导出矛盾,从而证明 P
为真。
经典逻辑的实际应用
案例1:证明双重否定
在经典逻辑中,双重否定等价于原命题,即 ¬¬P ↔ P
。我们可以使用排中律来证明这一点。
example (P : Prop) : ¬¬P ↔ P :=
iff.intro
(assume h : ¬¬P,
show P, from classical.by_contradiction (assume h₁ : ¬P, h h₁))
(assume h : P,
show ¬¬P, from assume h₁ : ¬P, h₁ h)
在这个例子中,我们首先假设 ¬¬P
为真,然后通过反证法证明 P
为真。接着,我们假设 P
为真,并证明 ¬¬P
也为真。
案例2:证明德摩根定律
德摩根定律是经典逻辑中的重要定律之一,它描述了逻辑与和逻辑或之间的关系。我们可以使用经典逻辑来证明德摩根定律。
example (P Q : Prop) : ¬(P ∧ Q) ↔ ¬P ∨ ¬Q :=
iff.intro
(assume h : ¬(P ∧ Q),
show ¬P ∨ ¬Q, from classical.em P >>= (λ p, classical.em Q >>= (λ q, or.inl (λ hp, h ⟨hp, q⟩) <|> or.inr (λ hq, h ⟨p, hq⟩))))
(assume h : ¬P ∨ ¬Q,
show ¬(P ∧ Q), from assume h₁ : P ∧ Q, h.elim (λ hp, hp h₁.1) (λ hq, hq h₁.2))
在这个例子中,我们首先假设 ¬(P ∧ Q)
为真,然后通过排中律和反证法证明 ¬P ∨ ¬Q
为真。接着,我们假设 ¬P ∨ ¬Q
为真,并证明 ¬(P ∧ Q)
也为真。
总结
经典逻辑是Lean中逻辑推理的基础之一,它通过排中律和反证法等规则来实现。本文介绍了经典逻辑的基本概念,并通过代码示例和实际案例展示了如何在Lean中使用经典逻辑进行推理。
如果你对经典逻辑的更多应用感兴趣,可以尝试证明其他经典逻辑定律,如分配律、结合律等。
附加资源与练习
- 练习1:尝试在Lean中证明
P → ¬¬P
。 - 练习2:使用经典逻辑证明
(P → Q) ↔ (¬Q → ¬P)
(逆否命题)。 - 附加资源:阅读Lean官方文档中关于经典逻辑的部分,了解更多高级用法和技巧。
通过不断练习和探索,你将能够熟练掌握Lean中的经典逻辑,并在形式化证明中灵活运用。