Zulip Chat Archive
Stream: new members
Topic: lean4 structure equality
Arien Malec (Oct 24 2022 at 21:09):
What's the Lean4 approach for this proof (or even one direction of it?)
structure Foo where
mk :: (bar : Nat)
theorem eq_ext (a b: Foo) : a = b ↔ a.bar = b.bar := sorry
Arien Malec (Oct 24 2022 at 22:11):
should probably note that I've tried what I would consider the usual; rfl
, various flavors of trying to destructure, rw
etc.
Julian Berman (Oct 24 2022 at 22:16):
Possibly there's a clevererer way to do it (which I can't check because I can't update mathlib4 yet :/), but here's a simplistic way that seems to work:
structure Foo where
mk :: (bar : Nat)
theorem eq_ext (a b: Foo) : a = b ↔ a.bar = b.bar :=
⟨λ h => by rw [h],
λ h => by cases a; cases b; simp [h]⟩
seems to do it here at least.
Mario Carneiro (Oct 24 2022 at 22:18):
With the ext
tactic you get it for free:
import Std.Tactic.Ext
@[ext] structure Foo where
mk :: (bar : Nat)
theorem eq_ext : ∀ (a b: Foo), a = b ↔ a.bar = b.bar := Foo.ext_iff
Arien Malec (Oct 24 2022 at 22:28):
Julian Berman said:
Possibly there's a clevererer way to do it (which I can't check because I can't update mathlib4 yet :/), but here's a simplistic way that seems to work:
structure Foo where mk :: (bar : Nat) theorem eq_ext (a b: Foo) : a = b ↔ a.bar = b.bar := ⟨λ h => by rw [h], λ h => by cases a; cases b; simp [h]⟩
seems to do it here at least.
OK, I get the mp
direction, which seems obvious in retrospect. The mpr
direction seems like magic.
I go from
case mpr.mk.mk
bar✝¹bar✝: Nat
h: { bar := bar✝¹ }.bar = { bar := bar✝ }.bar
⊢ { bar := bar✝¹ } = { bar := bar✝ }
to :tada: via simp [h]
but it doesn't feel like there's anything to apply simp
to that isn't already in the premise...
Mario Carneiro (Oct 24 2022 at 22:37):
Here's another way to write the proof:
theorem eq_ext (a b: Foo) : a = b ↔ a.bar = b.bar :=
⟨λ h => by rw [h],
λ h => by
match a, b, h with
| ⟨a_bar⟩, ⟨b_bar⟩, (h : a_bar = b_bar) =>
rw [h]⟩
Mario Carneiro (Oct 24 2022 at 22:38):
The point is that after the two cases
, h
, which has the type ⟨a_bar⟩.bar = ⟨b_bar⟩.bar
, is definitionally equal to h : a_bar = b_bar
and so we can use the same proof as the first half - we're just applying the mk
function to both sides to get equal values.
Last updated: Dec 20 2023 at 11:08 UTC