. intro h
  rw [del_star_curried, bind_eq_bind, hq', some_bind] at h
  have ⟨r', hr'⟩ := Option.isSome_iff_exists.mp $
    del_star_curried_isSome_iff_constrRun_isSome.mp h
  refine' .intro (.step _ _ r' rfl) ⟨q', hq', _⟩
  simp [toNFA]; assumption
  simp [bind_eq_bind]; assumption
case some.mp
α qs : Type
M : DFA α qs
w : Word { x // x ∈ M.Z }
q : { x // x ∈ M.Q }
x : { x // x ∈ M.Z }
xs : List { x // x ∈ M.Z }
q' : { x // x ∈ M.Q }
hq' : M.δ (q, x) = some q'
⊢ Option.isSome (del_star_curried M (x :: xs) q) = true →
    ∃ x_1 z,
      ∃ (H : z ∈ M.δ (q, x)),
        (do
            let r' ← constrRun xs z
            some (NFA.Run.step q ⋯ r' ⋯)) =
          some x_1

case some.mpr
α qs : Type
M : DFA α qs
w : Word { x // x ∈ M.Z }
q : { x // x ∈ M.Q }
x : { x // x ∈ M.Z }
xs : List { x // x ∈ M.Z }
q' : { x // x ∈ M.Q }
hq' : M.δ (q, x) = some q'
⊢ (∃ x_1 z,
      ∃ (H : z ∈ M.δ (q, x)),
        (do
            let r' ← constrRun xs z
            some (NFA.Run.step q ⋯ r' ⋯)) =
          some x_1) →
    Option.isSome (del_star_curried M (x :: xs) q) = true
case some.mpr
α qs : Type
M : DFA α qs
w : Word { x // x ∈ M.Z }
q : { x // x ∈ M.Q }
x : { x // x ∈ M.Z }
xs : List { x // x ∈ M.Z }
q' : { x // x ∈ M.Q }
hq' : M.δ (q, x) = some q'
⊢ (∃ x_1 z,
      ∃ (H : z ∈ M.δ (q, x)),
        (do
            let r' ← constrRun xs z
            some (NFA.Run.step q ⋯ r' ⋯)) =
          some x_1) →
    Option.isSome (del_star_curried M (x :: xs) q) = true