lean/Example.lean
2025-01-30 18:37:49 +01:00

160 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

variable (p q r : Prop)
-- commutativity of ∧ and
example : p ∧ q ↔ q ∧ p := by
apply Iff.intro
· intro pandq
apply And.intro
· apply And.right pandq
· apply And.left pandq
· intro qandp
apply And.intro
· apply And.right qandp
· apply And.left qandp
example : p q ↔ q p := by
apply Iff.intro
· intro porq
cases porq with
| inl p => exact Or.inr p
| inr q => exact Or.inl q
· intro qorp
cases qorp with
| inl q => exact Or.inr q
| inr p => exact Or.inl p
-- associativity of ∧ and
example : (p ∧ q) ∧ r ↔ p ∧ (q ∧ r) := by
apply Iff.intro
· intro pqandr
apply And.intro
· exact And.left (And.left pqandr)
· apply And.intro
· exact And.right (And.left pqandr)
· exact And.right pqandr
· intro pandqr
apply And.intro
· apply And.intro
· exact And.left pandqr
· exact And.left (And.right pandqr)
· exact And.right (And.right pandqr)
example : (p q) r ↔ p (q r) := by
apply Iff.intro
· intro pqorr
cases pqorr with
| inr r => apply Or.inr (Or.inr r)
| inl porq => cases porq with
| inl p => apply Or.inl p
| inr q => apply Or.inr (Or.inl q)
· intro porqr
cases porqr with
| inl p => apply Or.inl (Or.inl p)
| inr qorr => cases qorr with
| inr r => apply Or.inr r
| inl q => apply Or.inl (Or.inr q)
-- distributivity
example : p ∧ (q r) ↔ (p ∧ q) (p ∧ r) := by
apply Iff.intro
· intro pandqorr
cases pandqorr with
| intro p qor => cases qor with
| inl q => apply Or.inl (And.intro p q)
| inr r => apply Or.inr (And.intro p r)
· intro pandqorpandr
cases pandqorpandr with
| inl pandq => apply And.intro (And.left pandq) (Or.inl (And.right pandq))
| inr pandr => apply And.intro (And.left pandr) (Or.inr (And.right pandr))
example : p (q ∧ r) ↔ (p q) ∧ (p r) := by
apply Iff.intro
· intro porqandr
cases porqandr with
| inl p => apply And.intro (Or.inl p) (Or.inl p)
| inr qandr => apply And.intro (Or.inr (And.left qandr)) (Or.inr (And.right qandr))
· intro porqandporr
cases And.left porqandporr with
| inl p => apply Or.inl p
| inr q => cases And.right porqandporr with
| inl p => apply Or.inl p
| inr r => apply Or.inr (And.intro q r)
-- other properties
example : (p → (q → r)) ↔ (p ∧ q → r) := by
apply Iff.intro
· intro ptoqtor
intro pandq
exact ptoqtor (And.left pandq) (And.right pandq)
· intro pandqtor
intro p
intro q
exact pandqtor (And.intro p q)
example : ((p q) → r) ↔ (p → r) ∧ (q → r) := by
apply Iff.intro
· intro porqtor
apply And.intro
· intro p
exact porqtor (Or.inl p)
· intro q
exact porqtor (Or.inr q)
· intro ptorandqtor
intro porq
cases porq with
| inl p => exact (And.left ptorandqtor) p
| inr q => exact (And.right ptorandqtor) q
example : ¬(p q) ↔ ¬p ∧ ¬q := by
apply Iff.intro
· intro nporq
apply And.intro
· intro p
exact nporq (Or.inl p)
· intro q
exact nporq (Or.inr q)
· intro npandnq
intro porq
cases porq with
| inl p => exact (And.left npandnq) p
| inr q => exact (And.right npandnq) q
example : ¬p ¬q → ¬(p ∧ q) := by
intro npornq
cases npornq with
| inl np => intro pandq; exact np (And.left pandq)
| inr nq => intro pandq; exact nq (And.right pandq)
example : ¬(p ∧ ¬p) := by
intro pandnp
exact (And.right pandnp) (And.left pandnp)
example : p ∧ ¬q → ¬(p → q) :=
λ ⟨p,nq⟩ ptoq => nq (ptoq p)
example : ¬p → (p → q) :=
λ np p => absurd p np
example : (¬p q) → (p → q)
| (Or.inl np), p => absurd p np
| (Or.inr q), _ => q
example : p False ↔ p := by
apply Iff.intro
· intro porf
apply Or.elim porf id False.elim
· intro p
apply Or.inl p
example : p ∧ False ↔ False := by
apply Iff.intro
· intro ⟨p,f⟩
exact f
· intro f
apply False.elim f
example : (p → q) → (¬q → ¬p) :=
λ ptoq nq p => absurd (ptoq p) nq