Zulip Chat Archive

Stream: new members

Topic: subtype question


Anca Ciobanu (May 31 2019 at 11:44):

example (X : Type) (P : X  Prop) (x y : X) (hx : P x) (hy : P y)
  (H : (x, hx : {x : X // P x}) = y, hy ) : x = y := sorry

How do you prove this? I tried induction H and I seemed to lose my hypothesis.

Kevin Buzzard (May 31 2019 at 11:46):

ha ha! Induction H seems to leave you in an unprovable state! What's going on there?

Kevin Buzzard (May 31 2019 at 11:47):

ha ha, revert H, simp works :D

Kevin Buzzard (May 31 2019 at 11:47):

This should be trivial

Kevin Buzzard (May 31 2019 at 11:50):

I am totally confused

Kevin Buzzard (May 31 2019 at 11:51):

set_option trace.simplify.rewrite true
example (X : Type) (P : X  Prop) (x y : X) (hx : P x) (hy : P y)
  (H : (x, hx : {x : X // P x}) = y, hy ) : x = y :=
begin
  revert H,
  simp,
  /-
  0. [simplify.rewrite] [imp_self]: x = y → x = y ==> true
  -/
end

Kevin Buzzard (May 31 2019 at 11:51):

simp won't tell me how it did it!

Chris Hughes (May 31 2019 at 11:52):

It uses subtype.mk.inj_eq

Chris Hughes (May 31 2019 at 11:52):

I think

Kevin Buzzard (May 31 2019 at 11:55):

? This says <x,hx>=<y,hy> = (x = y) so now I have to jump through some hoops to make this. Anca is in tehe middle of a tactic proof and has H : <x,hx>=<y,hy> and we just want x=y.

Mario Carneiro (May 31 2019 at 11:58):

cases

Kevin Buzzard (May 31 2019 at 11:59):

cases H doesn't work!

Kevin Buzzard (May 31 2019 at 11:59):

This is why we asked.

Mario Carneiro (May 31 2019 at 11:59):

you sure?

Kevin Buzzard (May 31 2019 at 11:59):

example (X : Type) (P : X  Prop) (x y : X) (hx : P x) (hy : P y)
  (H : (x, hx : {x : X // P x}) = y, hy ) : x = y :=
begin
  cases H,
  /-
  cases tactic failed, unexpected failure when introducing auxiliary equatilies
  -/

end

Kevin Buzzard (May 31 2019 at 11:59):

What is an equatily?

Mario Carneiro (May 31 2019 at 11:59):

woah that's a new one

Mario Carneiro (May 31 2019 at 12:00):

I think you found the bug

Mario Carneiro (May 31 2019 at 12:01):

injection should work

Mario Carneiro (May 31 2019 at 12:04):

the term proof is subtype.no_confusion H id or subtype.mk.inj H

Mario Carneiro (May 31 2019 at 12:07):

you can also simp at H

Xindi Ai (May 31 2019 at 13:59):

(I am new to Lean so please excuse my style)
I ran into a similar problem before and what I roughly did was

def mysubtype (X : Type) (P : X → Prop) : Type := {x : X // P x}

def myfun (X : Type) (P : X → Prop): mysubtype X P → X
|⟨x, hx⟩ := x

lemma mylemma (X : Type) (P : X → Prop) (x : X) (hx : P x): myfun X P ⟨x, hx⟩ = x := rfl

example (X : Type) (P : X → Prop) (x y : X) (hx : P x) (hy : P y)
  (H : (⟨x, hx⟩ : mysubtype X P) = ⟨y, hy⟩ ) : x = y :=
congr_arg (myfun X P) H

Seems to be a bit of a detour though.

Kevin Buzzard (May 31 2019 at 14:02):

Seems to be a bit of a detour though.

Yes! That was the annoying thing. I was showing an undergraduate how to use Lean and then this came up, and all of a sudden the whole thing looked far more complicated than it should have been.

Floris van Doorn (May 31 2019 at 19:10):

injection H is probably the best way to so this. Another possibility is congr_arg subtype.val H

Jesse Michael Han (May 31 2019 at 19:16):

laziest solution:

example (X : Type) (P : X  Prop) (x y : X) (hx : P x) (hy : P y)
  (H : (x, hx : {x : X // P x}) = y, hy ) : x = y :=
begin
  library_search
  -- exact subtype.mk.inj H
end

Last updated: Dec 20 2023 at 11:08 UTC