/-- If `s` is a closed set, `v` is a partial refinement, and `i` is an index such that
`i ∉ v.carrier`, then there exists a partial refinement that is strictly greater than `v`. -/
theorem exists_gt (v : PartialRefinement u s) (hs : IsClosed s) (i : ι) (hi : i ∉ v.carrier) :
    ∃ v' : PartialRefinement u s, v < v' := by
  have I : (s ∩ ⋂ (j) (_ : j ≠ i), (v j)ᶜ) ⊆ v i := by
    simp only [subset_def, mem_inter_iff, mem_iInter, and_imp]
    intro x hxs H
    rcases mem_iUnion.1 (v.subset_iUnion hxs) with ⟨j, hj⟩
    exact (em (j = i)).elim (fun h => h ▸ hj) fun h => (H j h hj).elim
  have C : IsClosed (s ∩ ⋂ (j) (_ : j ≠ i), (v j)ᶜ) :=
    IsClosed.inter hs (isClosed_biInter fun _ _ => isClosed_compl_iff.2 <| v.isOpen _)
  rcases normal_exists_closure_subset C (v.isOpen i) I with ⟨vi, ovi, hvi, cvi⟩
  refine' ⟨⟨update v i vi, insert i v.carrier, _, _, _, _⟩, _, _⟩
  · intro j
    rcases eq_or_ne j i with (rfl| hne) <;> simp [*, v.isOpen]
  · refine' fun x hx => mem_iUnion.2 _
    rcases em (∃ (j : _) (_ : j ≠ i), x ∈ v j) with (⟨j, hji, hj⟩ | h)
    · use j
      rwa [update_noteq hji]
    · push_neg at h
      use i
      rw [update_same]
      exact hvi ⟨hx, mem_biInter h⟩
  · rintro j (rfl | hj)
    · rwa [update_same, ← v.apply_eq hi]
    · rw [update_noteq (ne_of_mem_of_not_mem hj hi)]
      exact v.closure_subset hj
  · intro j hj
    rw [mem_insert_iff, not_or] at hj
    rw [update_noteq hj.1, v.apply_eq hj.2]
  · refine' ⟨subset_insert _ _, fun j hj => _⟩
    exact (update_noteq (ne_of_mem_of_not_mem hj hi) _ _).symm
  · 

Proof state:
case intro.intro.intro.refine'_6
ι : Type u_1
X : Type u_2
inst✝¹ : TopologicalSpace X
inst✝ : NormalSpace X
u : ι → Set X
s : Set X
v : PartialRefinement u s
hs : IsClosed s
i : ι
hi : i ∉ v.carrier
I : s ∩ ⋂ j, ⋂ (_ : j ≠ i), (toFun v j)ᶜ ⊆ toFun v i
C : IsClosed (s ∩ ⋂ j, ⋂ (_ : j ≠ i), (toFun v j)ᶜ)
vi : Set X
ovi : IsOpen vi
hvi : s ∩ ⋂ j, ⋂ (_ : j ≠ i), (toFun v j)ᶜ ⊆ vi
cvi : closure vi ⊆ toFun v i
⊢ ¬({ toFun := update v.toFun i vi, carrier := insert i v.carrier,
            isOpen := (_ : ∀ (j : ι), IsOpen (update v.toFun i vi j)),
            subset_iUnion := (_ : ∀ x ∈ s, x ∈ ⋃ i_1, update v.toFun i vi i_1),
            closure_subset := (_ : ∀ {j : ι}, j ∈ insert i v.carrier → closure (update v.toFun i vi j) ⊆ u j),
            apply_eq := (_ : ∀ {j : ι}, j ∉ insert i v.carrier → update v.toFun i vi j = u j) }.carrier ⊆
        v.carrier ∧
      ∀
        i_1 ∈
          { toFun := update v.toFun i vi, carrier := insert i v.carrier,
              isOpen := (_ : ∀ (j : ι), IsOpen (update v.toFun i vi j)),
              subset_iUnion := (_ : ∀ x ∈ s, x ∈ ⋃ i_2, update v.toFun i vi i_2),
              closure_subset := (_ : ∀ {j : ι}, j ∈ insert i v.carrier → closure (update v.toFun i vi j) ⊆ u j),
              apply_eq := (_ : ∀ {j : ι}, j ∉ insert i v.carrier → update v.toFun i vi j = u j) }.carrier,
        toFun
            { toFun := update v.toFun i vi, carrier := insert i v.carrier,
              isOpen := (_ : ∀ (j : ι), IsOpen (update v.toFun i vi j)),
              subset_iUnion := (_ : ∀ x ∈ s, x ∈ ⋃ i_2, update v.toFun i vi i_2),
              closure_subset := (_ : ∀ {j : ι}, j ∈ insert i v.carrier → closure (update v.toFun i vi j) ⊆ u j),
              apply_eq := (_ : ∀ {j : ι}, j ∉ insert i v.carrier → update v.toFun i vi j = u j) }
            i_1 =
          toFun v i_1)

Next tactic:
exact fun hle => hi (hle.1 <| mem_insert _ _)