∀ {ρ : Type} {σ : String.Slice → Type}
  [inst : (s : String.Slice) → Std.Iterator (σ s) Id (String.Slice.Pattern.SearchStep s)] {pat : ρ}
  [inst_1 : String.Slice.Pattern.ToForwardSearcher pat σ] {s : String.Slice} (currPos : s.Pos)
  (searcher searcher' : Std.Iter (String.Slice.Pattern.SearchStep s)) (startPos endPos : s.Pos),
  searcher.IsPlausibleStep (Std.IterStep.yield searcher' (String.Slice.Pattern.SearchStep.matched startPos endPos)) →
    match { internalState := String.Slice.SplitIterator.operating currPos searcher },
      Std.IterStep.yield { internalState := String.Slice.SplitIterator.operating endPos searcher' }
        (s.subslice! currPos startPos) with
    | { internalState := String.Slice.SplitIterator.operating currPos s_1 },
      Std.IterStep.yield { internalState := String.Slice.SplitIterator.operating currPos_1 s' } out =>
      s'.IsPlausibleSuccessorOf s_1
    | { internalState := String.Slice.SplitIterator.operating currPos s_1 },
      Std.IterStep.yield { internalState := String.Slice.SplitIterator.atEnd } out => True
    | { internalState := String.Slice.SplitIterator.operating currPos s_1 },
      Std.IterStep.skip { internalState := String.Slice.SplitIterator.operating currPos_1 s' } =>
      s'.IsPlausibleSuccessorOf s_1
    | { internalState := String.Slice.SplitIterator.operating currPos s },
      Std.IterStep.skip { internalState := String.Slice.SplitIterator.atEnd } => False
    | { internalState := String.Slice.SplitIterator.operating currPos s }, Std.IterStep.done => True
    | { internalState := String.Slice.SplitIterator.atEnd }, Std.IterStep.yield it out => False
    | { internalState := String.Slice.SplitIterator.atEnd }, Std.IterStep.skip it => False
    | { internalState := String.Slice.SplitIterator.atEnd }, Std.IterStep.done => True