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: May 02 2025 at 03:31 UTC