variable (p q r : Prop)
-- commutativity of ∧ and ∨
example : p ∧ q ↔ q ∧ p :=
Iff.intro
(fun ⟨hp, hq⟩ => ⟨hq, hp⟩)
(fun ⟨hq, hp⟩ => ⟨hp, hq⟩)
example : p ∨ q ↔ q ∨ p :=
Iff.intro
(fun | Or.inl hp => Or.inr hp | Or.inr hq => Or.inl hq)
(fun | Or.inl hq => Or.inr hq | Or.inr hp => Or.inl hp)
-- associativity of ∧ and ∨
example : (p ∧ q) ∧ r ↔ p ∧ (q ∧ r) :=
Iff.intro
(fun ⟨⟨hp, hq⟩, hr⟩ => ⟨hp, ⟨hq, hr⟩⟩)
(fun ⟨hp, ⟨hq, hr⟩⟩ => ⟨⟨hp, hq⟩, hr⟩)
example : (p ∨ q) ∨ r ↔ p ∨ (q ∨ r) :=
Iff.intro
(fun | Or.inl (Or.inl hp) => Or.inl hp | Or.inl (Or.inr hq) => Or.inr (Or.inl hq) | Or.inr hr => Or.inr (Or.inr hr))
(fun | Or.inl hp => Or.inl (Or.inl hp) | Or.inr (Or.inl hq) => Or.inl (Or.inr hq) | Or.inr (Or.inr hr) => Or.inr hr)
-- distributivity
example : p ∧ (q ∨ r) ↔ (p ∧ q) ∨ (p ∧ r) :=
Iff.intro
(fun | ⟨hp, Or.inl hq⟩ => Or.inl ⟨hp, hq⟩ | ⟨hp, Or.inr hr⟩ => Or.inr ⟨hp, hr⟩)
(fun | Or.inl ⟨hp, hq⟩ => ⟨hp, Or.inl hq⟩ | Or.inr ⟨hp, hr⟩ => ⟨hp, Or.inr hr⟩)
example : p ∨ (q ∧ r) ↔ (p ∨ q) ∧ (p ∨ r) :=
Iff.intro
(fun | Or.inl hp => ⟨Or.inl hp, Or.inl hp⟩ | Or.inr ⟨hq, hr⟩ => ⟨Or.inr hq, Or.inr hr⟩)
(fun | ⟨Or.inl hp, _ ⟩ => Or.inl hp | ⟨Or.inr hq, Or.inr hr⟩ => Or.inr ⟨hq, hr⟩ | ⟨_, Or.inl hp⟩ => Or.inl hp)
-- other properties
example : (p → (q → r)) ↔ (p ∧ q → r) := Iff.intro
(fun h ⟨hp, hq⟩ => h hp hq) -- h : p → (q → r), hp : p, hq : q
(fun h hp hq => h ⟨hp, hq⟩)
example : ((p ∨ q) → r) ↔ (p → r) ∧ (q → r) :=
Iff.intro
(fun h => ⟨fun hp => h (Or.inl hp), fun hq => h (Or.inr hq)⟩)
(fun ⟨hp, hq⟩ hr => Or.elim hr hp hq)
example : ¬(p ∨ q) ↔ ¬p ∧ ¬q := Iff.intro
(fun h => ⟨fun hp => h (Or.inl hp), fun hq => h (Or.inr hq)⟩)
(fun ⟨hp, hq⟩ hr => Or.elim hr hp hq)
example : ¬p ∨ ¬q → ¬(p ∧ q) :=
fun h ⟨hp, hq⟩ => Or.elim h (fun hnp => hnp hp) (fun hnq => hnq hq)
example : ¬(p ∧ ¬p) :=
fun ⟨hp, hnp⟩ => hnp hp
example : p ∧ ¬q → ¬(p → q) :=
fun ⟨hp, hq⟩ h => hq (h hp)
example : ¬p → (p → q) :=
fun hnp hp => False.elim (hnp hp)
example : (¬p ∨ q) → (p → q) :=
fun h => Or.elim h (fun hnp hp => False.elim (hnp hp)) (fun hq _ => hq)
example : p ∨ False ↔ p := Iff.intro
(fun | Or.inl hp => hp | Or.inr h => False.elim h)
(fun hp => Or.inl hp)
example : p ∧ False ↔ False := Iff.intro
(fun | ⟨_, h⟩ => False.elim h)
(fun h => ⟨False.elim h, h⟩)
example : (p → q) → (¬q → ¬p) :=
fun hpq hnq hp => hnq (hpq hp)
open Classical
variable (p q r : Prop)
example : (p → q ∨ r) → ((p → q) ∨ (p → r)) :=
λ h => Or.elim (Classical.em q)
(λ hq => Or.inl (λ _ => hq))
(λ hnq => Or.inr (λ hp => Or.resolve_left (h hp) hnq))
example : ¬(p ∧ q) → ¬p ∨ ¬q :=
fun h => Or.elim (Classical.em p)
(λ hp => Or.inr (λ hq => h ⟨hp, hq⟩))
(λ hnp => Or.inl hnp)
example : ¬(p → q) → p ∧ ¬q :=
fun h => Or.elim (Classical.em p)
(λ hp => Or.elim (Classical.em q)
(λ hq => False.elim (h (λ _ => hq)))
(λ hnq => ⟨hp, hnq⟩))
(λ hnp => False.elim (h (λ hp => absurd hp hnp)))
example : (p → q) → (¬p ∨ q) :=
fun h => Or.elim (Classical.em p)
(λ hp => Or.inr (h hp))
(λ hnp => Or.inl hnp)
example : (¬q → ¬p) → (p → q) :=
fun h => Or.elim (Classical.em p)
(λ hp => Or.elim (Classical.em q)
(λ hq => λ _ => hq)
(λ hnq => False.elim (h hnq hp)))
(λ hnp => λ hp => False.elim (hnp hp))
example : p ∨ ¬p := em p
example : (((p → q) → p) → p) :=
fun h => Or.elim (Classical.em p)
(λ hp => hp)
(λ hnp => absurd (h (λ hp => absurd hp hnp)) hnp)
Comments
The platform will support lean highlight in next version.
Thank you for your work! Can’t wait for syntax highlight.
It is supported now!
Looks great man, thanks a lot.