Zulip Chat Archive

Stream: general

Topic: problem using quot.exists_rep


Bernd Losert (Feb 19 2022 at 14:49):

I'm trying to get the following to work:

constants G α : Type*
constants r : G × α  G × α  Prop
constant q : quot r

def foo :  := let ⟨⟨b, x⟩, heq := quot.exists_rep q in 2

It complains saying

'Exists.dcases_on' can only eliminate into Prop

I'm not sure what to do here. Any tips?

Yaël Dillies (Feb 19 2022 at 14:52):

You should either use docs#quot.out or first define a map to G × α and then show it respects the quotient, so that it lifts to a map to quot r.

Bernd Losert (Feb 19 2022 at 14:54):

Let me try quot.out.

Bernd Losert (Feb 19 2022 at 14:57):

That works, but now I see another problem since I am trying to use this to make a has_scalar instance.

Bernd Losert (Feb 19 2022 at 15:00):

I guess I have to do it the longer way.

Yaël Dillies (Feb 19 2022 at 15:01):

Yeah, it will be cleaner. I guess you'll have to prove it respects the quotient at some point anyway.

Bernd Losert (Feb 19 2022 at 15:06):

Thanks.

Kevin Buzzard (Feb 19 2022 at 15:12):

@Bernd Losert the "mathematician's approach" of defining a function from a quotient by "lift arbitrarily to the bigger type and then apply another function" is not idiomatic Lean. The thing to use is quotient.lift and I just wrote something about this for my course. The reason the quotient.lift approach is better because of the punchline -- the very last line I wrote.

Bernd Losert (Feb 19 2022 at 15:37):

I see what you mean. In my work, the quotient is so obvious, it seems silly to check that it respects equivalance.

Bernd Losert (Feb 19 2022 at 15:39):

In the proof, I have to do a whole bunch of unfoldings (6 to be exact), in order to get back to the def defining the relation and then start simplying. Is there a tactic that will simplify things until it hits the definition of the relation?

Yaël Dillies (Feb 19 2022 at 15:41):

You can use change to give directly the form of what you need.

Bernd Losert (Feb 19 2022 at 15:43):

First time using change. Let's see if I can make it work.

Bernd Losert (Feb 19 2022 at 15:46):

Ah, it works pretty nicely. Cool. Thanks again.

Kevin Buzzard (Feb 19 2022 at 15:59):

My instinct is that you should be writing API to do this rather than using change. For example in the Lean code which went with the course notes I mentioned earlier I do things like this and this because rewriting is a lot less hassle than change especially when you don't want to write down terms in full.

Yaël Dillies (Feb 19 2022 at 16:01):

It's good to know that you can put underscores in a change expression.

Ruben Van de Velde (Feb 19 2022 at 16:02):

Kevin Buzzard said:

I just wrote something about this for my course.

Typo at the link: octonians

Bernd Losert (Feb 19 2022 at 16:21):

Yeah, if I see myself using the same sort of change repeatedly, I'll write a def to make it easier.


Last updated: Dec 20 2023 at 11:08 UTC