如何用lean3证明(P ∧ Q) ∧ R ↔ P ∧ (Q ∧ R)
时间: 2024-10-17 22:09:32 浏览: 37
lean4:精益4编程语言和定理证明者
在Lean 3 中,我们使用依赖类型系统(dependent type system)来进行形式化推理,包括逻辑推理。为了证明 `(P ∧ Q) ∧ R ↔ P ∧ (Q ∧ R)` 这个命题,我们可以按照自然演绎法(natural deduction)的步骤来构造证明:
首先,我们需要导入适当的库并定义我们的谓词 `∧`(逻辑与),通常Lean会内建这个操作符。假设我们已经定义了 `and` 和 `iff`(等价于):
```lean
import tactic
open classical
abbreviation and := and₂
abbreviation iff := if_and_only_if
```
接下来,我们将尝试构建两个方向的证明:
**证明 (P ∧ Q) ∧ R → P ∧ (Q ∧ R)**
这一步,我们从左边的联言推出右边的联言:
1. 先假设 `(P ∧ Q) ∧ R`
2. 使用 `elim` 来消解 `and`,得到两个假设 `p : P` 和 `q : Q`,以及 `r : R`
3. 然后分别应用 `and.intro` 到 `p` 和 `q` 上,构造出 `p` 和 `q ∧ R`
4. 最后,使用 `and.intro` 结合 `p` 和 `q ∧ R`,得到 `P ∧ (Q ∧ R)`
**证明 P ∧ (Q ∧ R) → (P ∧ Q) ∧ R**
这是逆向的推理过程:
1. 假设 `P ∧ (Q ∧ R)`
2. 再次消解 `and` 得到 `p : P` 和 `qR : Q ∧ R`
3. 通过 `and.left` 和 `and.right` 分别抽取 `p` 和 `Q ∧ R` 的部分
4. 使用 `and.intro` 结合 `p` 和 `qR`,得到 `(P ∧ Q) ∧ R`
完成这两个证明后,你可以用 `exact` 或 `sorry`(留给 Lean 自动寻找证明路径)来表示每个方向的结束,并加上 `dec_trivial` 或 `refl` 来表明它们是明显的事实。
```lean
lemma my_proof : (P ∧ Q) ∧ R ↔ P ∧ (Q ∧ R) :=
begin
split; [intro h, exact h],
split; [intros h p qR, exact ⟨h.1, h.2.1⟩],
end
-- 或者如果你让Lean自动完成证明:
theorem my_proof :
(P ∧ Q) ∧ R ↔ P ∧ (Q ∧ R)
| sorry
by {
intros h,
cases h with hp hqR,
split;
[cases hp, exact hqR],
split;
[intros hp qR, cases hqR with hqp _,
exact ⟨hp, hqp⟩]
}
```
最后,记得添加相应的 `--` 行和相关问题来提问:
阅读全文