Zulip Chat Archive

Stream: new members

Topic: pairs equal iff projections are?


Marcus Klaas (Dec 02 2018 at 12:50):

Can anyone give me a pointer on how prove this?

example {α β} {a c : α} {b d : β} (h: (a, b) = (c, d)) : a = c := sorry

Kevin Buzzard (Dec 02 2018 at 12:51):

example {α β} {a c : α} {b d : β} (h: (a, b) = (c, d)) : a = c :=
begin
  cases h,
  refl,
end

Patrick Massot (Dec 02 2018 at 12:54):

The state after cases is a bit weird. You can also directly provide the proof term (prod.mk.inj h).left

Kevin Buzzard (Dec 02 2018 at 12:54):

example {α β} {a c : α} {b d : β} (h: (a, b) = (c, d)) : a = c :=
(prod.mk.inj h).1

Marcus Klaas (Dec 02 2018 at 12:54):

Thanks so much!!

Kevin Buzzard (Dec 02 2018 at 12:55):

example {α β} :  {a c : α} {b d : β} (h: (a, b) = (c, d)), a = c
| a c b d rfl := rfl

Kevin Buzzard (Dec 02 2018 at 12:56):

So that's a tactic mode proof, a term mode proof, and a proof using the equation compiler.

Marcus Klaas (Dec 02 2018 at 12:58):

Haha, that's great :D - I'm not quite sure how the equation compiler does it tho ;p

Kevin Buzzard (Dec 02 2018 at 13:00):

(a, b) has type prod \alpha \beta, an inductive type, so you need tools to deal with terms of this type. When the inductive type prod is defined, Lean creates with it its recursor prod.rec, which is the universal way to define a map from prod \alpha \beta to anywhere. Lean then creates a bunch of other useful functions automatically, you can see what they are by typing #print prefix prod. There's usually something called X.mk.inj in there for an inductive type X, so that's what I was looking for. That's how I found the term proof. For the tactic mode proof, cases is a great tactic for any inductive type, it takes the type to pieces.

For the equation compiler proof, we make Lean do the work. I had to move things to the other side of the colon. The point is that I can tell Lean that without loss of generality h must be rfl. I still don't really understand how the equation compiler actually works, but I have sort-of got the hang of how to use it in practice. Your question is a great basic example of how to use its power.

Mario Carneiro (Dec 02 2018 at 13:02):

it uses prod.no_confusion under the hood, which is basically the same as prod.inj

Marcus Klaas (Dec 02 2018 at 13:03):

You folks are amazing. Thank you.

Kevin Buzzard (Dec 02 2018 at 13:04):

Just to be clear -- moving stuff to before or after the colon doesn't change the proposition, it's just a trick for controlling whether or not you have to give the inputs yourself in the "first line" of your proof.


Last updated: Dec 20 2023 at 11:08 UTC