Zulip Chat Archive
Stream: new members
Topic: Proof of not_not_em
newptcai (Jul 06 2023 at 03:00):
I saw the following code in Lean
theorem not_not_em (a : Prop) : ¬¬(a ∨ ¬a) :=
fun h => h (Or.inr (h ∘ Or.inl))
I am confused how can h ∘ Or.inl produce ¬a, which is expected here.
Niels Voss (Jul 06 2023 at 05:30):
¬a means the same as a -> False. h has type ¬(a ∨ ¬a), which means (a ∨ ¬a) -> False.
h ∘ Or.inl is a function which takes in a proof that a is true, applies Or.inl to get a proof that a ∨ ¬a is true, and then uses h to get a proof of False.
Here's a less concise version of the proof:
theorem not_not_em (a : Prop) : ¬¬(a ∨ ¬a) :=
fun h : a ∨ ¬a → False =>
have h₁ : a → False := λ ha => h (Or.inl ha) -- This is the same as `h ∘ Or.inl`
have h₂ : a ∨ ¬a := Or.inr h₁
show False from h h₂
Last updated: May 02 2025 at 03:31 UTC