-- Module: Mathlib.Topology.Metrizable.Uniformity
Goal:
X : Type u_2
inst : UniformSpace X
inst_1 : (𝓤 X).IsCountablyGenerated
Choose :
  ∃ (U : ℕ → SetRel X X),
    (∀ (n : ℕ), (U n).IsSymm) ∧ (∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m) ∧ (𝓤 X).HasAntitoneBasis U
Choose₁ Choose₂ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U), ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₃ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y),
      ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₄ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x),
      ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₅ Choose₆ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : Membership.mem (γ := Set ℝ≥0) (Ioo 0 1) (1 / 2)),
      ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₇ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : Membership.mem (γ := Set ℝ≥0) (Ioo 0 1) (1 / 2)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ)),
        ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₈ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : Membership.mem (γ := Set ℝ≥0) (Ioo 0 1) (1 / 2)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ))
        (hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n),
        ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₉ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : Membership.mem (γ := Set ℝ≥0) (Ioo 0 1) (1 / 2)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ))
        (hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n)
        (hd_le : ∀ (x y : X), (↑(d x y) : ℝ) ≤ 2 * dist x y),
        ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
Choose₁₀ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : (↑0 : ℝ) < (↑(1 / 2) : ℝ) ∧ (↑(1 / 2) : ℝ) < (↑1 : ℝ)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ))
        (hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n)
        (hd_le : ∀ (x y : X), (↑(d x y) : ℝ) ≤ 2 * dist x y),
        ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst
refine_1 :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : (↑0 : ℝ) < (↑(1 / 2) : ℝ) ∧ (↑(1 / 2) : ℝ) < (↑1 : ℝ)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ))
        (hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n)
        (hd_le : ∀ (x y : X), (↑(d x y) : ℝ) ≤ 2 * dist x y) (i : ℕ),
        True → ∃ (i' : ℕ), True ∧ U i' ⊆ {p : X × X | dist p.1 p.2 < (↑(1 / 2) : ℝ) ^ i}
refine_2 refine_2₁ :
  ∀ (U : ℕ → SetRel X X) (hU_symm : ∀ (n : ℕ), (U n).IsSymm) (hU_comp : ∀ ⦃m n : ℕ⦄, m < n → U n ○ (U n ○ U n) ⊆ U m)
    (hB : (𝓤 X).HasAntitoneBasis U),
    let d : X → X → ℝ≥0 := fun (x y : X) ↦
      if h : ∃ (n : ℕ), (x, y) ∉ U n then (1 / 2) ^ Nat.find (p := fun (n : ℕ) ↦ (x, y) ∉ U n) h else 0;
    ∀ (hd₀ : ∀ {x y : X}, d x y = 0 ↔ Inseparable x y) (hd_symm : ∀ (x y : X), d x y = d y x)
      (hr : (↑0 : ℝ) < (↑(1 / 2) : ℝ) ∧ (↑(1 / 2) : ℝ) < (↑1 : ℝ)),
      let I := PseudoMetricSpace.ofPreNNDist d ⋯ hd_symm;
      ∀ (hdist_le : ∀ (x y : X), dist x y ≤ (↑(d x y) : ℝ))
        (hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n)
        (hd_le : ∀ (x y : X), (↑(d x y) : ℝ) ≤ 2 * dist x y) (i' : ℕ),
        True → ∃ (i : ℕ), True ∧ {p : X × X | dist p.1 p.2 < (↑(1 / 2) : ℝ) ^ i} ⊆ U i'
⊢ ∃ (I : PseudoMetricSpace X), PseudoMetricSpace.toUniformSpace = inst

Tactic:
classical
  /- Choose a fast decreasing antitone basis `U : ℕ → SetRel X X` of the uniformity filter `𝓤 X`.
    Define `d x y : ℝ≥0` to be `(1 / 2) ^ n`, where `n` is the minimal index of `U n` that
    separates `x` and `y`: `(x, y) ∉ U n`, or `0` if `x` is not separated from `y`. This function
    satisfies the assumptions of `PseudoMetricSpace.ofPreNNDist` and
    `PseudoMetricSpace.le_two_mul_dist_ofPreNNDist`, hence the distance given by the former
    pseudometric space structure is Lipschitz equivalent to the `d`. Thus the uniformities generated
    by `d` and `dist` are equal. Since the former uniformity is equal to `𝓤 X`, the latter is equal
    to `𝓤 X` as well. -/
  obtain ⟨U, hU_symm, hU_comp, hB⟩ :
    ∃ U : ℕ → SetRel X X,
      (∀ n, (U n).IsSymm) ∧
        (∀ ⦃m n⦄, m < n → U n ○ (U n ○ U n) ⊆ U m) ∧ (𝓤 X).HasAntitoneBasis U := by
    rcases UniformSpace.has_seq_basis X with ⟨V, hB, hV_symm⟩
    rcases hB.subbasis_with_rel fun m =>
        hB.tendsto_smallSets.eventually
          (eventually_uniformity_iterate_comp_subset (hB.mem m) 2) with
      ⟨φ, -, hφ_comp, hφB⟩
    exact ⟨V ∘ φ, fun n => hV_symm _, hφ_comp, hφB⟩
  set d : X → X → ℝ≥0 := fun x y => if h : ∃ n, (x, y) ∉ U n then (1 / 2) ^ Nat.find h else 0
  have hd₀ : ∀ {x y}, d x y = 0 ↔ Inseparable x y := by
    intro x y
    refine Iff.trans ?_ hB.inseparable_iff_uniformity.symm
    simp only [d, true_imp_iff]
    split_ifs with h
    · simp [h, pow_eq_zero_iff']
    · simpa only [not_exists, Classical.not_not, eq_self_iff_true, true_iff] using h
  have hd_symm x y : d x y = d y x := by simp only [d, (U _).comm]
  have hr : (1 / 2 : ℝ≥0) ∈ Ioo (0 : ℝ≥0) 1 := ⟨half_pos one_pos, NNReal.half_lt_self one_ne_zero⟩
  letI I := PseudoMetricSpace.ofPreNNDist d (fun x => hd₀.2 rfl) hd_symm
  have hdist_le : ∀ x y, dist x y ≤ d x y := PseudoMetricSpace.dist_ofPreNNDist_le _ _ _
  have hle_d : ∀ {x y : X} {n : ℕ}, (1 / 2) ^ n ≤ d x y ↔ (x, y) ∉ U n := by
    intro x y n
    dsimp only [d]
    split_ifs with h
    · rw [(pow_right_strictAnti₀ hr.1 hr.2).le_iff_ge, Nat.find_le_iff]
      exact ⟨fun ⟨m, hmn, hm⟩ hn => hm (hB.antitone hmn hn), fun h => ⟨n, le_rfl, h⟩⟩
    · push Not at h
      simp only [h, not_true, (pow_pos hr.1 _).not_ge]
  have hd_le : ∀ x y, ↑(d x y) ≤ 2 * dist x y := by
    refine PseudoMetricSpace.le_two_mul_dist_ofPreNNDist _ _ _ fun x₁ x₂ x₃ x₄ => ?_
    by_cases H : ∃ n, (x₁, x₄) ∉ U n
    · refine (dif_pos H).trans_le ?_
      rw [← div_le_iff₀' zero_lt_two, ← mul_one_div (_ ^ _), ← pow_succ]
      simp only [le_max_iff, hle_d, ← not_and_or]
      rintro ⟨h₁₂, h₂₃, h₃₄⟩
      refine Nat.find_spec H (hU_comp (lt_add_one <| Nat.find H) ?_)
      exact ⟨x₂, h₁₂, x₃, h₂₃, h₃₄⟩
    · exact (dif_neg H).trans_le zero_le
  -- Porting note: without the next line, `uniformity_basis_dist_pow` ends up introducing some
  -- `Subtype.val` applications instead of `NNReal.toReal`.
  rw [mem_Ioo, ← NNReal.coe_lt_coe, ← NNReal.coe_lt_coe] at hr
  refine ⟨I, UniformSpace.ext <| (uniformity_basis_dist_pow hr.1 hr.2).ext hB.toHasBasis ?_ ?_⟩
  · refine fun n hn => ⟨n, hn, fun x hx => (hdist_le _ _).trans_lt ?_⟩
    rwa [← NNReal.coe_pow, NNReal.coe_lt_coe, ← not_le, hle_d, Classical.not_not]
  · refine fun n _ => ⟨n + 1, trivial, fun x hx => ?_⟩
    rw [mem_setOf_eq] at hx
    contrapose! hx
    refine le_trans ?_ ((div_le_iff₀' zero_lt_two).2 (hd_le x.1 x.2))
    rwa [← NNReal.coe_two, ← NNReal.coe_div, ← NNReal.coe_pow, NNReal.coe_le_coe, pow_succ,
      mul_one_div, div_le_iff₀ zero_lt_two, div_mul_cancel₀ _ two_ne_zero, hle_d]

Premises used: not_le, div_le_iff₀, div_mul_cancel₀, Set.mem_Ioo, NNReal.coe_div, Classical.not_not, pow_succ, Set.mem_setOf_eq, NNReal.coe_two, two_ne_zero, mul_one_div, NNReal.coe_pow, NNReal.coe_lt_coe, NNReal.coe_le_coe