Zulip Chat Archive
Stream: general
Topic: targetted definitional reduction
Kevin Buzzard (May 29 2018 at 11:36):
The history of this question is the following: I had a complicated goal which could be reduced using a definitional unfolding which for some reason wasn't happening -- "unfold" wouldn't work
Kevin Buzzard (May 29 2018 at 11:36):
I wanted to do the unfold manually with a rw so I asked the name of the theorem that {a := x, b := y}.a = x
Kevin Buzzard (May 29 2018 at 11:37):
and I was told that this theorem had no name
Kevin Buzzard (May 29 2018 at 11:37):
because it was true by refl
Kevin Buzzard (May 29 2018 at 11:37):
On the other hand, browsing through the library I see a bunch of things with names whose proof is rfl
Kevin Buzzard (May 29 2018 at 11:38):
All the other suggestions for what to do were not good for me.
Kevin Buzzard (May 29 2018 at 11:38):
"Change it yourself with show" -- yeah but this is a PITA because my structure is a very complicated structure with a very long name and it is being constructed using very long terms
Kevin Buzzard (May 29 2018 at 11:38):
and I know precisely how I want this precise term to unfold and I don't want to do anything else to the goal
Kevin Buzzard (May 29 2018 at 11:39):
If I change it myself with show then I have to work out what I want the goal to be using pencil and paper! It's 2018!
Kevin Buzzard (May 29 2018 at 11:39):
I _need_ to change it because rw is really fussy, it won't rw something defeq to what you want sometimes -- it sometimes needs help
Kevin Buzzard (May 29 2018 at 11:39):
and the line after my show line was a complicated rw
Kevin Buzzard (May 29 2018 at 11:40):
Here's what I want to do
Kevin Buzzard (May 29 2018 at 11:40):
I want to zoom in to the area I am interested in using conv
Kevin Buzzard (May 29 2018 at 11:40):
and I want to run dsimp or some such thing just on that one term
Kevin Buzzard (May 29 2018 at 11:40):
Is this possible?
Kevin Buzzard (May 29 2018 at 11:40):
I don't think so.
Kevin Buzzard (May 29 2018 at 11:40):
conv offers me exciting commands such as "to_lhs"
Kevin Buzzard (May 29 2018 at 11:41):
what about "to 3rd input of this function"?
Kevin Buzzard (May 29 2018 at 11:41):
Can conv do that?
Kevin Buzzard (May 29 2018 at 11:41):
Can I do dsimp in conv?
Kevin Buzzard (May 29 2018 at 11:41):
I use tactic mode precisely because I like the precise control I have over what is going on
Kevin Buzzard (May 29 2018 at 11:41):
but as I get older and wiser and understand more about what is happening, I want more precise tools
Kevin Buzzard (May 29 2018 at 11:42):
I can do dsimp in conv mode :-)
Kevin Buzzard (May 29 2018 at 11:42):
so my question becomes how to access the 3rd input to a function
Kevin Buzzard (May 29 2018 at 11:42):
goal is f x y = g z
Kevin Buzzard (May 29 2018 at 11:43):
and I want to run dsimp on y only
Kevin Buzzard (May 29 2018 at 11:43):
how do I do that?
Kevin Buzzard (May 29 2018 at 11:43):
Ok I just thought of a solution which again will work in many cases
Kevin Buzzard (May 29 2018 at 11:43):
just define exactly the rewrite I want, call it H, and rw H
Kevin Buzzard (May 29 2018 at 11:43):
This gets me back to the original problem though
Kevin Buzzard (May 29 2018 at 11:43):
I do not want to run dsimp in my head
Kevin Buzzard (May 29 2018 at 11:43):
I am too lazy
Kevin Buzzard (May 29 2018 at 11:44):
I am a big boy now
Mario Carneiro (May 29 2018 at 11:44):
what's wrong with dsimp
?
Kevin Buzzard (May 29 2018 at 11:44):
simplifies too much
Kevin Buzzard (May 29 2018 at 11:44):
that's the wrong question
Mario Carneiro (May 29 2018 at 11:44):
no, that's the standard solution
Kevin Buzzard (May 29 2018 at 11:44):
unless you are genuinely convinced that I really never want to run dsimp on just a subterm
Kevin Buzzard (May 29 2018 at 11:45):
Let me go back to my usage case
Mario Carneiro (May 29 2018 at 11:45):
you can use dsimp only
or other such tricks to limit the unnecessary simping
Chris Hughes (May 29 2018 at 15:35):
unfold structure.a
sometimes works for me in these situations.
Kevin Buzzard (May 29 2018 at 18:29):
In my usage case, dsimp doesn't do anything at all
Kevin Buzzard (May 29 2018 at 18:37):
the goal is (function x y z).F H -> Z`
Kevin Buzzard (May 29 2018 at 18:37):
and function x y z
creates a structure
Kevin Buzzard (May 29 2018 at 18:37):
by saying what all the bits and pieces are
Kevin Buzzard (May 29 2018 at 18:37):
including F
Kevin Buzzard (May 29 2018 at 18:37):
dsimp does nothing
Kevin Buzzard (May 29 2018 at 18:38):
I can't get conv to get to it
Kevin Buzzard (May 29 2018 at 18:38):
is it because it's a pi type?
Kevin Buzzard (May 29 2018 at 18:39):
In the end I copied the context, scrolled to the end of the proof, pasted it, changed X : y,
to (X : y)
about ten times and made them all variables, and then used #reduce
and then cut and pasted the answer back in the proof and wrote "show" in front of it, and then farted around with some pp.proof on to get it to work and I was done
Kevin Buzzard (May 29 2018 at 18:39):
That can't be the best way
Kevin Buzzard (May 29 2018 at 18:40):
that's not even true
Kevin Buzzard (May 29 2018 at 18:40):
#reduce didn't do it
Kevin Buzzard (May 29 2018 at 18:40):
no wait
Kevin Buzzard (May 29 2018 at 18:40):
it half did it
Kevin Buzzard (May 29 2018 at 18:40):
it did enough of it
Kevin Buzzard (May 29 2018 at 18:40):
it unfolded (function x y z).F into (some function of x y and z)
Kevin Buzzard (May 29 2018 at 18:41):
Why did this cause me such pain? What did I miss?
Kevin Buzzard (May 29 2018 at 18:50):
import analysis.topology.topological_space scheme set_option pp.proofs true theorem presheaves_iso (X : Type) [H : topological_space X] (F : presheaf_of_types X) : are_isomorphic_presheaves_of_types (presheaf_of_types_pullback_under_open_immersion F id (topological_space.open_immersion_id _)) F := begin constructor,tactic.swap, { constructor,tactic.swap, { intros U HU, have Hid := topological_space.open_immersion_id X, -- goal now show (presheaf_of_types_pullback_under_open_immersion F id Hid).F HU → F.F HU, --unfold presheaf_of_types_pullback_under_open_immersion, -- fails show (F.F ((Hid.fopens U).mp HU)) → F.F HU, -- obtained by "#reduce" calculation below show (F.F (_ : is_open (id '' U)) → F.F HU), -- obtained by more out-of-proof unravelling sorry },sorry, }, sorry end variables (X : Type) (H : topological_space X) (F : presheaf_of_types X) (U : set X) (HU : topological_space.is_open H U) (Hid : topological_space.open_immersion (@id X)) #reduce (presheaf_of_types_pullback_under_open_immersion F id Hid).F -- λ (U : X → Prop) (HU : topological_space.is_open H U), F.F ((Hid.fopens U).mp HU) #check (Hid.fopens U).mp -- is_open U → is_open (id '' U) #exit
Kevin Buzzard (May 29 2018 at 18:50):
What my code looks like
Kevin Buzzard (May 29 2018 at 18:58):
It doesn't run for people who don't have my repo because it needs scheme.lean but I hope it explicitly shows the problem. I don't know how to get Lean to unfold (presheaf_of_types_pullback_under_open_immersion F id Hid).F
, possibily because it's in a lambda, but it is defeq to something much simpler which I work out outside the proof after some copying of context (IRL the context was huge and I just did the unravelling using cut and paste)
Mario Carneiro (May 29 2018 at 18:59):
You should have a simp lemma for the value of .F
Mario Carneiro (May 29 2018 at 19:00):
alternatively, you can dsimp [function]
to unfold it
Kevin Buzzard (May 29 2018 at 22:37):
You should have a simp lemma for the value of
.F
Talking through pnat was very instructional. I realise that I have a very poor feeling about what should be a simp lemma. I made that structure though -- these lemmas aren't automatically added when I make the structure? What is added to the simp machine?
Kevin Buzzard (May 29 2018 at 22:37):
alternatively, you can
dsimp [function]
to unfold it
This is what I needed to know :-) Thanks!
Kevin Buzzard (May 29 2018 at 22:38):
Even though my function isn't a simp lemma :-)
Mario Carneiro (May 29 2018 at 22:38):
simp
will reduce terms that look like <a, b, c>.2
Mario Carneiro (May 29 2018 at 22:38):
where <>
is the builtin structure constructor and .2
is a builtin projection
Mario Carneiro (May 29 2018 at 22:39):
If there are any definitions shielding the redex from looking like that, simp won't find it
Kevin Buzzard (May 29 2018 at 22:39):
like (f x y z).F
Mario Carneiro (May 29 2018 at 22:39):
right
Last updated: Dec 20 2023 at 11:08 UTC