l m₁ : List Char
c : Char
m₂ r : List Char
⊢ (if { byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c } = { byteIdx := utf8Len l } then
      { byteIdx := utf8Len m₁ + csize c }
    else
      {
        byteIdx :=
          (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
                ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
            utf8Len l }) =
    { byteIdx := utf8Len m₁ }
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ Substring.prev
      { str := { data := l ++ (m₁ ++ c :: m₂) ++ r }, startPos := { byteIdx := utf8Len l },
        stopPos := { byteIdx := utf8Len l + utf8Len (m₁ ++ c :: m₂) } }
      { byteIdx := utf8Len m₁ + csize c } =
    { byteIdx := utf8Len m₁ }
simp [Substring.prev]
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }

case a
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ { byteIdx := utf8Len l }.byteIdx ≠ ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c }).byteIdx
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ (if { byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c } = { byteIdx := utf8Len l } then
      { byteIdx := utf8Len m₁ + csize c }
    else
      {
        byteIdx :=
          (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
                ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
            utf8Len l }) =
    { byteIdx := utf8Len m₁ }
rw [if_neg (mt Pos.ext_iff.1 <| Ne.symm ?a)]
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }

case a
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ { byteIdx := utf8Len l }.byteIdx ≠ ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c }).byteIdx
case a => simpa [Nat.add_comm] using @ne_add_csize_add_self (utf8Len l) (utf8Len m₁) c
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ m₁ ++ c :: (m₂ ++ r) } { byteIdx := utf8Len (l ++ m₁) + csize c } =
    { byteIdx := utf8Len (l ++ m₁) }
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
have := prev_of_valid (l ++ m₁) c (m₂ ++ r)
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) } { byteIdx := utf8Len l + (utf8Len m₁ + csize c) } =
    { byteIdx := utf8Len l + utf8Len m₁ }
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              { byteIdx := utf8Len l + (utf8Len m₁ + csize c) }).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ m₁ ++ c :: (m₂ ++ r) } { byteIdx := utf8Len (l ++ m₁) + csize c } =
    { byteIdx := utf8Len (l ++ m₁) }
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c })).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
simp [Pos.add_eq, Nat.add_assoc] at this ⊢
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) } { byteIdx := utf8Len l + (utf8Len m₁ + csize c) } =
    { byteIdx := utf8Len l + utf8Len m₁ }
⊢ { byteIdx := { byteIdx := utf8Len l + utf8Len m₁ }.byteIdx - utf8Len l } = { byteIdx := utf8Len m₁ }
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) } { byteIdx := utf8Len l + (utf8Len m₁ + csize c) } =
    { byteIdx := utf8Len l + utf8Len m₁ }
⊢ {
      byteIdx :=
        (String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) }
              { byteIdx := utf8Len l + (utf8Len m₁ + csize c) }).byteIdx -
          utf8Len l } =
    { byteIdx := utf8Len m₁ }
rw [this]
no goals
l m₁ : List Char
c : Char
m₂ r : List Char
this :
  String.prev { data := l ++ (m₁ ++ c :: (m₂ ++ r)) } { byteIdx := utf8Len l + (utf8Len m₁ + csize c) } =
    { byteIdx := utf8Len l + utf8Len m₁ }
⊢ { byteIdx := { byteIdx := utf8Len l + utf8Len m₁ }.byteIdx - utf8Len l } = { byteIdx := utf8Len m₁ }
simp [Nat.add_sub_cancel_left]
no goals
l m₁ : List Char
c : Char
m₂ r : List Char
⊢ { byteIdx := utf8Len l }.byteIdx ≠ ({ byteIdx := utf8Len l } + { byteIdx := utf8Len m₁ + csize c }).byteIdx
simpa [Nat.add_comm] using @ne_add_csize_add_self (utf8Len l) (utf8Len m₁) c