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

tactic: let f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (ne_of_mem_of_not_mem hs₀ hx₀).symm
state_before: 𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

tactic: have :=  exists_extension_of_le_sublinear f (gauge s) (fun c hc => gauge_smul_of_nonneg hc.le)
  (gauge_add_le hs₁ <| absorbent_nhds_zero <| hs₂.mem_nhds hs₀) ?_
state_before: 𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

tactic: obtain ⟨φ, hφ₁, hφ₂⟩ := this
state_before: case refine_2
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
this : ∃ g, (∀ (x : { x // x ∈ f.domain }), ↑g ↑x = ↑f x) ∧ ∀ (x : E), ↑g x ≤ gauge s x
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

case refine_1
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
⊢ ∀ (x : { x // x ∈ f.domain }), ↑f x ≤ gauge s ↑x

tactic: have hφ₃ : φ x₀ = 1 := by
  rw [← f.domain.coe_mk x₀ (Submodule.mem_span_singleton_self _), hφ₁,
    LinearPMap.mkSpanSingleton'_apply_self]
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

case refine_1
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
⊢ ∀ (x : { x // x ∈ f.domain }), ↑f x ≤ gauge s ↑x

tactic: have hφ₄ : ∀ x ∈ s, φ x < 1 := fun x hx =>
  (hφ₂ x).trans_lt (gauge_lt_one_of_mem_of_open hs₁ hs₀ hs₂ hx)
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

case refine_1
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
⊢ ∀ (x : { x // x ∈ f.domain }), ↑f x ≤ gauge s ↑x

tactic: rintro ⟨x, hx⟩
state_before: case refine_1
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
⊢ ∀ (x : { x // x ∈ f.domain }), ↑f x ≤ gauge s ↑x

tactic: obtain ⟨y, rfl⟩ := Submodule.mem_span_singleton.1 hx
state_before: case refine_1.mk
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
x : E
hx : x ∈ f.domain
⊢ ↑f { val := x, property := hx } ≤ gauge s ↑{ val := x, property := hx }

tactic: rw [LinearPMap.mkSpanSingleton'_apply]
state_before: case refine_1.mk.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
⊢ ↑f { val := y • x₀, property := hx } ≤ gauge s ↑{ val := y • x₀, property := hx }

tactic: simp only [mul_one, Algebra.id.smul_eq_mul, Submodule.coe_mk]
state_before: case refine_1.mk.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
⊢ y • 1 ≤ gauge s ↑{ val := y • x₀, property := hx }

tactic: obtain h | h := le_or_lt y 0
state_before: case refine_1.mk.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
⊢ y ≤ gauge s (y • x₀)

tactic: rw [← f.domain.coe_mk x₀ (Submodule.mem_span_singleton_self _), hφ₁,
  LinearPMap.mkSpanSingleton'_apply_self]
state_before: 𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
⊢ ↑φ x₀ = 1

tactic: refine' ⟨⟨φ, _⟩, hφ₃, hφ₄⟩
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
hφ₄ : ∀ (x : E), x ∈ s → ↑φ x < 1
⊢ ∃ f, ↑f x₀ = 1 ∧ ∀ (x : E), x ∈ s → ↑f x < 1

tactic: refine'
  φ.continuous_of_nonzero_on_open _ (hs₂.vadd (-x₀)) (Nonempty.vadd_set ⟨0, hs₀⟩)
    (vadd_set_subset_iff.mpr fun x hx => _)
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
hφ₄ : ∀ (x : E), x ∈ s → ↑φ x < 1
⊢ Continuous φ.toFun

tactic: change φ (-x₀ + x) ≠ 0
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
hφ₄ : ∀ (x : E), x ∈ s → ↑φ x < 1
x : E
hx : x ∈ s
⊢ -x₀ +ᵥ x ∈ fun x => ↑φ x = 0 → False

tactic: rw [map_add, map_neg]
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
hφ₄ : ∀ (x : E), x ∈ s → ↑φ x < 1
x : E
hx : x ∈ s
⊢ ↑φ (-x₀ + x) ≠ 0

tactic: specialize hφ₄ x hx
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
hφ₄ : ∀ (x : E), x ∈ s → ↑φ x < 1
x : E
hx : x ∈ s
⊢ -↑φ x₀ + ↑φ x ≠ 0

tactic: linarith
state_before: case refine_2.intro.intro
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
φ : E →ₗ[ℝ] ℝ
hφ₁ : ∀ (x : { x // x ∈ f.domain }), ↑φ ↑x = ↑f x
hφ₂ : ∀ (x : E), ↑φ x ≤ gauge s x
hφ₃ : ↑φ x₀ = 1
x : E
hx : x ∈ s
hφ₄ : ↑φ x < 1
⊢ -↑φ x₀ + ↑φ x ≠ 0

tactic: exact h.trans (gauge_nonneg _)
state_before: case refine_1.mk.intro.inl
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
h : y ≤ 0
⊢ y ≤ gauge s (y • x₀)

tactic: rw [gauge_smul_of_nonneg h.le, smul_eq_mul, le_mul_iff_one_le_right h]
state_before: case refine_1.mk.intro.inr
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
h : 0 < y
⊢ y ≤ gauge s (y • x₀)

tactic: exact
  one_le_gauge_of_not_mem (hs₁.starConvex hs₀)
    (absorbent_nhds_zero <| hs₂.mem_nhds hs₀).absorbs hx₀
state_before: case refine_1.mk.intro.inr
𝕜 : Type ?u.8
E : Type u_1
inst✝⁴ : TopologicalSpace E
inst✝³ : AddCommGroup E
inst✝² : TopologicalAddGroup E
inst✝¹ : Module ℝ E
inst✝ : ContinuousSMul ℝ E
s : Set E
hs₀ : 0 ∈ s
hs₁ : Convex ℝ s
hs₂ : IsOpen s
x₀ : E
hx₀ : ¬x₀ ∈ s
f : E →ₗ.[ℝ] ℝ := LinearPMap.mkSpanSingleton x₀ 1 (_ : x₀ ≠ 0)
y : ℝ
hx : y • x₀ ∈ f.domain
h : 0 < y
⊢ 1 ≤ gauge s x₀