Theorem: geometric_hahn_banach_open_open
File: Mathlib/Analysis/NormedSpace/HahnBanach/Separation.lean

tactic: obtain rfl | ⟨a₀, ha₀⟩ := s.eq_empty_or_nonempty
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s t : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s t
⊢ ∃ f u, (∀ (a : E), a ∈ s → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: obtain rfl | ⟨b₀, hb₀⟩ := t.eq_empty_or_nonempty
state_before: case inr.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s t : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s t
a₀ : E
ha₀ : a₀ ∈ s
⊢ ∃ f u, (∀ (a : E), a ∈ s → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: obtain ⟨f, s, hf₁, hf₂⟩ := geometric_hahn_banach_open hs₁ hs₂ ht₁ disj
state_before: case inr.intro.inr.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s t : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s t
a₀ : E
ha₀ : a₀ ∈ s
b₀ : E
hb₀ : b₀ ∈ t
⊢ ∃ f u, (∀ (a : E), a ∈ s → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: have hf : IsOpenMap f := by
  refine' f.isOpenMap_of_ne_zero _
  rintro rfl
  simp_rw [ContinuousLinearMap.zero_apply] at hf₁ hf₂
  exact (hf₁ _ ha₀).not_le (hf₂ _ hb₀)
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
⊢ ∃ f u, (∀ (a : E), a ∈ s✝ → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: refine' ⟨f, s, hf₁, image_subset_iff.1 (_ : f '' t ⊆ Ioi s)⟩
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
hf : IsOpenMap ↑f
⊢ ∃ f u, (∀ (a : E), a ∈ s✝ → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: rw [← interior_Ici]
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
hf : IsOpenMap ↑f
⊢ ↑f '' t ⊆ Ioi s

tactic: refine' interior_maximal (image_subset_iff.2 hf₂) (f.isOpenMap_of_ne_zero _ _ ht₃)
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
hf : IsOpenMap ↑f
⊢ ↑f '' t ⊆ interior (Ici s)

tactic: rintro rfl
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
hf : IsOpenMap ↑f
⊢ f ≠ 0

tactic: simp_rw [ContinuousLinearMap.zero_apply] at hf₁ hf₂
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑0 a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑0 b
hf : IsOpenMap ↑0
⊢ False

tactic: exact (hf₁ _ ha₀).not_le (hf₂ _ hb₀)
state_before: case inr.intro.inr.intro.intro.intro.intro
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → 0 < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ 0
hf : IsOpenMap ↑0
⊢ False

tactic: exact ⟨0, -1, by simp, fun b _hb => by norm_num⟩
state_before: case inl
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
t : Set E
x y : E
ht₁ : Convex ℝ t
ht₃ : IsOpen t
hs₁ : Convex ℝ ∅
hs₂ : IsOpen ∅
disj : Disjoint ∅ t
⊢ ∃ f u, (∀ (a : E), a ∈ ∅ → ↑f a < u) ∧ ∀ (b : E), b ∈ t → u < ↑f b

tactic: simp
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
t : Set E
x y : E
ht₁ : Convex ℝ t
ht₃ : IsOpen t
hs₁ : Convex ℝ ∅
hs₂ : IsOpen ∅
disj : Disjoint ∅ t
⊢ ∀ (a : E), a ∈ ∅ → ↑0 a < -1

tactic: norm_num
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
t : Set E
x y : E
ht₁ : Convex ℝ t
ht₃ : IsOpen t
hs₁ : Convex ℝ ∅
hs₂ : IsOpen ∅
disj : Disjoint ∅ t
b : E
_hb : b ∈ t
⊢ -1 < ↑0 b

tactic: exact ⟨0, 1, fun a _ha => by norm_num, by simp⟩
state_before: case inr.intro.inl
𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
a₀ : E
ha₀ : a₀ ∈ s
ht₁ : Convex ℝ ∅
ht₃ : IsOpen ∅
disj : Disjoint s ∅
⊢ ∃ f u, (∀ (a : E), a ∈ s → ↑f a < u) ∧ ∀ (b : E), b ∈ ∅ → u < ↑f b

tactic: norm_num
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
a₀ : E
ha₀ : a₀ ∈ s
ht₁ : Convex ℝ ∅
ht₃ : IsOpen ∅
disj : Disjoint s ∅
a : E
_ha : a ∈ s
⊢ ↑0 a < 1

tactic: simp
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
x y : E
hs₁ : Convex ℝ s
hs₂ : IsOpen s
a₀ : E
ha₀ : a₀ ∈ s
ht₁ : Convex ℝ ∅
ht₃ : IsOpen ∅
disj : Disjoint s ∅
⊢ ∀ (b : E), b ∈ ∅ → 1 < ↑0 b

tactic: refine' f.isOpenMap_of_ne_zero _
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
⊢ IsOpenMap ↑f

tactic: rintro rfl
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
f : E →L[ℝ] ℝ
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑f a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑f b
⊢ f ≠ 0

tactic: simp_rw [ContinuousLinearMap.zero_apply] at hf₁ hf₂
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → ↑0 a < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ ↑0 b
⊢ False

tactic: exact (hf₁ _ ha₀).not_le (hf₂ _ hb₀)
state_before: 𝕜 : Type ?u.69030
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s✝ t : Set E
x y : E
hs₁ : Convex ℝ s✝
hs₂ : IsOpen s✝
ht₁ : Convex ℝ t
ht₃ : IsOpen t
disj : Disjoint s✝ t
a₀ : E
ha₀ : a₀ ∈ s✝
b₀ : E
hb₀ : b₀ ∈ t
s : ℝ
hf₁ : ∀ (a : E), a ∈ s✝ → 0 < s
hf₂ : ∀ (b : E), b ∈ t → s ≤ 0
⊢ False