Theorem: Set.range_subtype_map
File: Mathlib/Data/Set/Image.lean

tactic: ext ⟨x, hx⟩
state_before: α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
⊢ range (Subtype.map f h) = Subtype.val ⁻¹' (f '' {x | p x})

tactic: rw [mem_preimage, mem_range, mem_image, Subtype.exists, Subtype.coe_mk]
state_before: case h.mk
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ { val := x, property := hx } ∈ range (Subtype.map f h) ↔
    { val := x, property := hx } ∈ Subtype.val ⁻¹' (f '' {x | p x})

tactic: apply Iff.intro
state_before: case h.mk
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }) ↔
    ∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x

tactic: . rintro ⟨a, b, hab⟩
  rw [Subtype.map, Subtype.mk.injEq] at hab
  use a
  trivial
state_before: case h.mk.mp
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }) →
    ∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x

case h.mk.mpr
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x) →
    ∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: . rintro ⟨a, b, hab⟩
  use a
  use b
  rw [Subtype.map, Subtype.mk.injEq]
  exact hab
state_before: case h.mk.mpr
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x) →
    ∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: rintro ⟨a, b, hab⟩
state_before: case h.mk.mp
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }) →
    ∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x

tactic: rw [Subtype.map, Subtype.mk.injEq] at hab
state_before: case h.mk.mp.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : p a
hab : Subtype.map f h { val := a, property := b } = { val := x, property := hx }
⊢ ∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x

tactic: use a
state_before: case h.mk.mp.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : p a
hab : f ↑{ val := a, property := b } = x
⊢ ∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x

tactic: trivial
state_before: case h.mk.mp.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : p a
hab : f ↑{ val := a, property := b } = x
⊢ a ∈ {x | p x} ∧ f a = x

tactic: rintro ⟨a, b, hab⟩
state_before: case h.mk.mpr
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
⊢ (∃ x_1, x_1 ∈ {x | p x} ∧ f x_1 = x) →
    ∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: use a
state_before: case h.mk.mpr.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : a ∈ {x | p x}
hab : f a = x
⊢ ∃ a b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: use b
state_before: case h.mk.mpr.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : a ∈ {x | p x}
hab : f a = x
⊢ ∃ b, Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: rw [Subtype.map, Subtype.mk.injEq]
state_before: case h.mk.mpr.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : a ∈ {x | p x}
hab : f a = x
⊢ Subtype.map f h { val := a, property := b } = { val := x, property := hx }

tactic: exact hab
state_before: case h.mk.mpr.intro.intro
α : Type u_2
β : Type u_1
γ : Type ?u.88408
ι : Sort ?u.88411
ι' : Sort ?u.88414
f✝ : ι → α
s t : Set α
p : α → Prop
q : β → Prop
f : α → β
h : ∀ (x : α), p x → q (f x)
x : β
hx : q x
a : α
b : a ∈ {x | p x}
hab : f a = x
⊢ f ↑{ val := a, property := b } = x