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

tactic: ext ⟨x, hx⟩
state_before: α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
⊢ range (inclusion h) = {x | ↑x ∈ s}

tactic: apply Iff.intro
state_before: case h.mk
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ range (inclusion h) ↔ { val := x, property := hx } ∈ {x | ↑x ∈ s}

tactic: . rw [mem_range]
  rintro ⟨a, ha⟩
  rw [inclusion, Subtype.mk.injEq] at ha
  rw [mem_setOf, Subtype.coe_mk, ← ha]
  exact Subtype.coe_prop _
state_before: case h.mk.mp
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ range (inclusion h) → { val := x, property := hx } ∈ {x | ↑x ∈ s}

case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ {x | ↑x ∈ s} → { val := x, property := hx } ∈ range (inclusion h)

tactic: . rw [mem_setOf, Subtype.coe_mk, mem_range]
  intro hx'
  use ⟨x, hx'⟩
  trivial
state_before: case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ {x | ↑x ∈ s} → { val := x, property := hx } ∈ range (inclusion h)

tactic: rw [mem_range]
state_before: case h.mk.mp
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ range (inclusion h) → { val := x, property := hx } ∈ {x | ↑x ∈ s}

tactic: rintro ⟨a, ha⟩
state_before: case h.mk.mp
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ (∃ y, inclusion h y = { val := x, property := hx }) → { val := x, property := hx } ∈ {x | ↑x ∈ s}

tactic: rw [inclusion, Subtype.mk.injEq] at ha
state_before: case h.mk.mp.intro
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
a : ↑s
ha : inclusion h a = { val := x, property := hx }
⊢ { val := x, property := hx } ∈ {x | ↑x ∈ s}

tactic: rw [mem_setOf, Subtype.coe_mk, ← ha]
state_before: case h.mk.mp.intro
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
a : ↑s
ha : ↑a = x
⊢ { val := x, property := hx } ∈ {x | ↑x ∈ s}

tactic: exact Subtype.coe_prop _
state_before: case h.mk.mp.intro
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
a : ↑s
ha : ↑a = x
⊢ ↑a ∈ s

tactic: rw [mem_setOf, Subtype.coe_mk, mem_range]
state_before: case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ { val := x, property := hx } ∈ {x | ↑x ∈ s} → { val := x, property := hx } ∈ range (inclusion h)

tactic: intro hx'
state_before: case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
⊢ x ∈ s → ∃ y, inclusion h y = { val := x, property := hx }

tactic: use ⟨x, hx'⟩
state_before: case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
hx' : x ∈ s
⊢ ∃ y, inclusion h y = { val := x, property := hx }

tactic: trivial
state_before: case h.mk.mpr
α : Type u_1
β : Type ?u.97081
γ : Type ?u.97084
ι : Sort ?u.97087
ι' : Sort ?u.97090
f : ι → α
s t : Set α
h : s ⊆ t
x : α
hx : x ∈ t
hx' : x ∈ s
⊢ inclusion h { val := x, property := hx' } = { val := x, property := hx }