Zulip Chat Archive
Stream: new members
Topic: Proof by cases
Mark R. Tuttle (Jun 01 2024 at 14:42):
Is there an easier way to prove this example?
variable (a a' b b': Nat) (p: Prop)
theorem eq: a = a' ∧ b = b' → p := by sorry
theorem neq: a ≠ a' ∨ b ≠ b' → p := by sorry
example: p := by
by_cases h: a ≠ a' ∨ b ≠ b'
. apply (neq a a' b b' p)
simp [h]
. simp at h -- Use ← direction of De Morgan ¬(𝐴∧𝐵) ↔ ¬𝐴 ∨ ¬𝐵
apply (eq a a' b b' p)
simp [h]
I learned a lot from this example. I learned about by_cases
. I learned that the choice of h
is important (use the antecedent of neq
and not the antecedent of eq
) because the forward direction of De Morgan requires classical (see classical reasoning).
Anders Larsson (Jun 01 2024 at 15:04):
I could get rid of two the two simp [h]
rows.
variable (a a' b b': Nat) (p: Prop)
theorem eq: a = a' ∧ b = b' → p := by sorry
theorem neq: a ≠ a' ∨ b ≠ b' → p := by sorry
example: p := by
by_cases h: a ≠ a' ∨ b ≠ b'
. exact (neq a a' b b' p) h
. simp at h -- Use ← direction of De Morgan ¬(𝐴∧𝐵) ↔ ¬𝐴 ∨ ¬𝐵
exact (eq a a' b b' p) h
Filippo A. E. Nuccio (Jun 04 2024 at 13:56):
You can avoid by_cases
(which is probably not a great idea, since you learnt it ...)
import Mathlib
variable (a a' b b': Nat) (p: Prop)
theorem eq: a = a' ∧ b = b' → p := by sorry
theorem neq: a ≠ a' ∨ b ≠ b' → p := by sorry
example: p := by
apply neq a a' b b'
by_contra!
apply_rules [eq]
Filippo A. E. Nuccio (Jun 04 2024 at 17:56):
Actually that can be improved to
import Mathlib
variable (a a' b b': Nat) (p: Prop)
theorem eq: a = a' ∧ b = b' → p := by sorry
theorem neq: a ≠ a' ∨ b ≠ b' → p := by sorry
example: p := by
have : And _ _ := ⟨eq a a' b b' p, neq a a' b b' p⟩
tauto
Last updated: May 02 2025 at 03:31 UTC