# Zulip Chat Archive

## Stream: general

### Topic: Structure fields

#### Sebastien Gouezel (Nov 07 2018 at 15:22):

Is there a quick way to unfold something defined in a class? Let me be more specific. The product of metric spaces starts with

instance prod.metric_space_max [metric_space β] : metric_space (α × β) := { dist := λ x y, max (dist x.1 y.1) (dist x.2 y.2), ......}

Now, in a proof, I have `dist x y`

where `x`

and `y`

are in a product metric space, and I would like to unfold it to `max (dist x.1 y.1) (dist x.2 y.2)`

.

I can `change`

it, or use `show`

, or prove a lemma giving the formula for the distance (with `rfl`

) and then unfold this lemma. But I am wondering if I am missing something and if there is something I can just unfold, like `prod.metric_space_max._secret_access_to_dist_`

or something like that.

#### Johannes Hölzl (Nov 07 2018 at 15:51):

I don't think so. you can unfold `prod.metric_space_max`

, and then call `dsimp`

to unfold the projection. But this will not work in general. The best thing to do is to add the lemma as a `simp`

-rule (which we should have anyway)

#### Sebastian Ullrich (Nov 07 2018 at 16:13):

Does `simp [dist]`

not work? Or do you want to unfold only this specific `dist`

?

#### Sebastien Gouezel (Nov 07 2018 at 16:20):

No, simp does not work here:

lemma prod.dist_eq {α : Type u} {β : Type v} [metric_space α] [metric_space β] {x y : α × β} : dist x y = max (dist x.1 y.1) (dist x.2 y.2) := by simp

fails with

simplify tactic failed to simplify

I have proved the lemma using `rfl`

, and then used it explicitly later. This seems to be the canonical way to proceed. By the way, this is not the kind of thing I would want to unfold all the time, so I don't think it is a good simp lemma (but it is definitely useful to have it in explicit form like this)

#### Sebastian Ullrich (Nov 07 2018 at 16:23):

You have to pass the projection explicitly: `simp [dist]`

#### Sebastien Gouezel (Nov 07 2018 at 16:25):

Sorry, I should learn to read. Yes, `simp [dist]`

works. Can you explain why?

#### Sebastian Ullrich (Nov 07 2018 at 16:27):

`simp`

accepts not just rewrite lemmas but also function and projection names, which tell it to unfold usages of them

#### Sebastien Gouezel (Nov 07 2018 at 16:34):

OK, thanks (and this is very useful, I don't know why I never noticed this)

#### Kevin Buzzard (Nov 07 2018 at 16:41):

Oh nice trick Sebastian! I thought that the philosophy was to always prove these lemmas and give them names. Wait -- maybe that is the philosophy anyway.

#### Floris van Doorn (Nov 07 2018 at 16:45):

I also didn't know this. This is very useful!

Last updated: Aug 03 2023 at 10:10 UTC