-- Mathlib/Topology/Order/Basic.lean
theorem countable_image_lt_image_Ioi [OrderTopology α] [LinearOrder β] (f : β → α)
    [SecondCountableTopology α] : Set.Countable {x | ∃ z, f x < z ∧ ∀ y, x < y → z ≤ f y}

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this✝ : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
this : ∀ x ∈ s, ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Tactic:
choose! z hz using this

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
hlt : u < v
⊢ (Disjoint on fun x => Ioo x (z (invFunOn f s x))) (f u) (f v)

Tactic:
apply disjoint_iff_forall_ne.2

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
hlt : u < v
⊢ ∀ ⦃a : α⦄,
    a ∈ (fun x => Ioo x (z (invFunOn f s x))) (f u) → ∀ ⦃b : α⦄, b ∈ (fun x => Ioo x (z (invFunOn f s x))) (f v) → a ≠ b

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
⊢ (Disjoint on fun x => Ioo x (z (invFunOn f s x))) (f u) (f v)

Tactic:
have hlt : u < v := hle.lt_of_ne (ne_of_apply_ne _ huv)

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
hlt : u < v
⊢ (Disjoint on fun x => Ioo x (z (invFunOn f s x))) (f u) (f v)

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Tactic:
let s := {x | ∃ z, f x < z ∧ ∀ y, x < y → z ≤ f y}

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Tactic:
have : ∀ x, x ∈ s → ∃ z, f x < z ∧ ∀ y, x < y → z ≤ f y := fun x hx ↦ hx

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this✝ : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
this : ∀ x ∈ s, ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y
⊢ {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}.Countable

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
hlt : u < v
a : α
ha : a ∈ (fun x => Ioo x (z (invFunOn f s x))) (f u)
hb : a ∈ (fun x => Ioo x (z (invFunOn f s x))) (f v)
⊢ False

Tactic:
simp only [I.leftInvOn_invFunOn us, I.leftInvOn_invFunOn vs] at ha hb

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
u : β
us : u ∈ s
v : β
vs : v ∈ s
huv : f u ≠ f v
hle : u ≤ v
hlt : u < v
a : α
ha : a ∈ Ioo (f u) (z u)
hb : a ∈ Ioo (f v) (z v)
⊢ False

Proof state:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
A : (f '' s).PairwiseDisjoint fun x => Ioo x (z (invFunOn f s x))
⊢ (f '' s).Countable

Tactic:
apply Set.PairwiseDisjoint.countable_of_Ioo A

Result:
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
I : InjOn f s
A : (f '' s).PairwiseDisjoint fun x => Ioo x (z (invFunOn f s x))
⊢ ∀ x ∈ f '' s, x < z (invFunOn f s x)

Proof state:
case H
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
⊢ StrictMonoOn f s

Tactic:
intro x hx y _ hxy

Result:
case H
α : Type u
β : Type v
inst✝⁴ : TopologicalSpace α
inst✝³ : LinearOrder α
inst✝² : OrderTopology α
inst✝¹ : LinearOrder β
f : β → α
inst✝ : SecondCountableTopology α
a✝ : Nontrivial β
this : Nonempty α
s : Set β := {x | ∃ z, f x < z ∧ ∀ (y : β), x < y → z ≤ f y}
z : β → α
hz : ∀ x ∈ s, f x < z x ∧ ∀ (y : β), x < y → z x ≤ f y
x : β
hx : x ∈ s
y : β
x✝ : y ∈ s
hxy : x < y
⊢ f x < f y