Theorem: Set.infsep_eq_iInf
File: Mathlib/Topology/MetricSpace/Infsep.lean

tactic: split_ifs with hs
state_before: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
⊢ s.infsep = if s.Nontrivial then ⨅ d, uncurry dist ↑d else 0
state_after: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
⊢ s.infsep = ⨅ d, uncurry dist ↑d

case neg
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : ¬s.Nontrivial
⊢ s.infsep = 0

tactic: have hb : BddBelow (uncurry dist '' s.offDiag) := by
  refine ⟨0, fun d h => ?_⟩
  simp_rw [mem_image, Prod.exists, uncurry_apply_pair] at h
  rcases h with ⟨_, _, _, rfl⟩
  exact dist_nonneg
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
⊢ s.infsep = ⨅ d, uncurry dist ↑d
state_after: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
hb : BddBelow (uncurry dist '' s.offDiag)
⊢ s.infsep = ⨅ d, uncurry dist ↑d

tactic: refine eq_of_forall_le_iff fun _ => ?_
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
hb : BddBelow (uncurry dist '' s.offDiag)
⊢ s.infsep = ⨅ d, uncurry dist ↑d
state_after: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
hb : BddBelow (uncurry dist '' s.offDiag)
x✝ : ℝ
⊢ x✝ ≤ s.infsep ↔ x✝ ≤ ⨅ d, uncurry dist ↑d

tactic: simp_rw [hs.le_infsep_iff, le_ciInf_set_iff (offDiag_nonempty.mpr hs) hb, imp_forall_iff,
  mem_offDiag, Prod.forall, uncurry_apply_pair, and_imp]
state_before: case pos
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
hb : BddBelow (uncurry dist '' s.offDiag)
x✝ : ℝ
⊢ x✝ ≤ s.infsep ↔ x✝ ≤ ⨅ d, uncurry dist ↑d
state_after: no goals

tactic: refine ⟨0, fun d h => ?_⟩
state_before: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
⊢ BddBelow (uncurry dist '' s.offDiag)
state_after: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
d : ℝ
h : d ∈ uncurry dist '' s.offDiag
⊢ 0 ≤ d

tactic: simp_rw [mem_image, Prod.exists, uncurry_apply_pair] at h
state_before: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
d : ℝ
h : d ∈ uncurry dist '' s.offDiag
⊢ 0 ≤ d
state_after: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
d : ℝ
h : ∃ a b, (a, b) ∈ s.offDiag ∧ dist a b = d
⊢ 0 ≤ d

tactic: rcases h with ⟨_, _, _, rfl⟩
state_before: α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
d : ℝ
h : ∃ a b, (a, b) ∈ s.offDiag ∧ dist a b = d
⊢ 0 ≤ d
state_after: case intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
w✝¹ w✝ : α
left✝ : (w✝¹, w✝) ∈ s.offDiag
⊢ 0 ≤ dist w✝¹ w✝

tactic: exact dist_nonneg
state_before: case intro.intro.intro
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : s.Nontrivial
w✝¹ w✝ : α
left✝ : (w✝¹, w✝) ∈ s.offDiag
⊢ 0 ≤ dist w✝¹ w✝
state_after: no goals

tactic: exact (not_nontrivial_iff.mp hs).infsep_zero
state_before: case neg
α : Type u_1
β : Type u_2
inst✝¹ : PseudoMetricSpace α
x y z : α
s t : Set α
inst✝ : Decidable s.Nontrivial
hs : ¬s.Nontrivial
⊢ s.infsep = 0
state_after: no goals