# Zulip Chat Archive

## Stream: new members

### Topic: Unfolding function coercion

#### Jean-Philippe Burelle (Oct 09 2020 at 12:38):

I've been scratching my head over this simple problem :

If I define a structure and give it a coercion to functions, like this :

```
structure my_fun :=
(f : ℝ → ℝ )
instance : has_coe_to_fun (my_fun) :=
⟨_, λ fct, fct.f ⟩
```

and then define an instance

```
def square : my_fun :={
f := λ u, u*u,
}
```

I don't know what the right way to unfold these definitions is in a proof. In the interactive prover, when I try to prove this lemma :

```
lemma test : square 1 = 1 :=
begin
end
```

I can use `unfold_coes`

to turn `⇑square 1`

into `square.f 1`

, but I don't know how to unfold this function. If I try `unfold square.f`

I get `square.f does not have equational lemmas nor is a projection`

.

I have found that if I use `rw square`

, after unfolding the function coercion, the goal becomes `⇑{f := λ (u : ℝ), u * u} 1 = 1`

, which I also don't know how to unfold, but `simp`

will complete the goal. Even more confusingly, if I don't unfold the function coercion and directly use rw square on `⇑square 1`

, the goal becomes identical `⇑{f := λ (u : ℝ), u * u} 1 = 1`

, but now `simp`

doesn't close it!

#### Chris Hughes (Oct 09 2020 at 12:40):

Have you tried `unfold my_fun.f`

?

#### Chris Hughes (Oct 09 2020 at 12:40):

Actually `unfold square my_fun.f`

#### Jean-Philippe Burelle (Oct 09 2020 at 12:43):

Thank you! This works, and `unfold my_fun.f square`

does the same thing. I would have thought `square.f`

was short for `my_fun.f square`

but apparently not.

#### Chris Hughes (Oct 09 2020 at 12:44):

It is short for `my_fun.f square`

, but you can only unfold declarations, and `my_fun.f square`

is not a declaration, but both `square`

and `my_Fun.f`

are

#### Chris Hughes (Oct 09 2020 at 12:47):

I see where you misunderstood `unfold my_fun.f square`

is like `unfold my_fun.f, unfold square`

.

#### Chris Hughes (Oct 09 2020 at 12:48):

`my_fun.f`

and `Square`

are two separate arguments,

#### Jean-Philippe Burelle (Oct 09 2020 at 12:57):

How should I think of the expression `square.f`

? Its type is `ℝ → ℝ`

but `unfold`

gives an error.

#### Reid Barton (Oct 09 2020 at 13:02):

I'm not sure what to add to what Chris already wrote. `unfold`

doesn't take an expression, it takes a list of constants.

Last updated: Dec 20 2023 at 11:08 UTC