Documentation

Init.Data.String.Lemmas.Basic

Basic lemmas about strings #

This file contains lemmas that could be in Init.Data.String.Basic but are not because they are not needed to define basic string operations.

@[simp]
@[simp]
theorem String.singleton_append_inj {c : Char} {s : String} {d : Char} {t : String} :
singleton c ++ s = singleton d ++ t ↔ c = d ∧ s = t
@[simp]
theorem String.push_inj {s : String} {c : Char} {t : String} {d : Char} :
s.push c = t.push d ↔ s = t ∧ c = d
@[simp]
theorem String.append_eq_empty_iff {s t : String} :
s ++ t = "" ↔ s = "" ∧ t = ""
@[simp]
theorem String.append_eq_left_iff {s t : String} :
s ++ t = s ↔ t = ""
@[simp]
theorem String.append_eq_right_iff {s t : String} :
s ++ t = t ↔ s = ""
@[simp]
theorem String.empty_eq_iff {s : String} :
"" = s ↔ s = ""
@[simp]
theorem String.push_ne_empty {s : String} {c : Char} :
s.push c ≠ ""
@[simp]
theorem String.ofList_cons {c : Char} {l : List Char} :
@[simp]
theorem String.Slice.Pos.copy_inj {s : Slice} {p₁ p₂ : s.Pos} :
p₁.copy = p₂.copy ↔ p₁ = p₂
@[simp]
theorem String.Pos.startPos_le {s : String} (p : s.Pos) :
@[simp]
@[simp]
theorem String.Pos.byte_toSlice {s : String} {p : s.Pos} {h : p.toSlice ≠ s.toSlice.endPos} :
p.toSlice.byte h = p.byte ⋯
theorem String.Pos.byte_eq_byte_toSlice {s : String} {p : s.Pos} {h : p ≠ s.endPos} :
p.byte h = p.toSlice.byte ⋯
theorem String.Slice.toByteArray_copy_slice {s : Slice} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} :
theorem String.toByteArray_copy_slice {s : String} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} :
theorem String.Slice.ext {s t : Slice} (h : s.str = t.str) (hsi : s.startInclusive.cast h = t.startInclusive) (hee : s.endExclusive.cast h = t.endExclusive) :
s = t
@[simp]
theorem String.Slice.sliceTo_sliceFrom {s : Slice} {pos : s.Pos} {pos' : (s.sliceFrom pos).Pos} :
(s.sliceFrom pos).sliceTo pos' = s.slice pos (Pos.ofSliceFrom pos') ⋯
@[simp]
theorem String.Slice.sliceFrom_sliceTo {s : Slice} {pos : s.Pos} {pos' : (s.sliceTo pos).Pos} :
(s.sliceTo pos).sliceFrom pos' = s.slice (Pos.ofSliceTo pos') pos ⋯
@[simp]
theorem String.Slice.sliceFrom_sliceFrom {s : Slice} {pos : s.Pos} {pos' : (s.sliceFrom pos).Pos} :
@[simp]
theorem String.Slice.sliceTo_sliceTo {s : Slice} {pos : s.Pos} {pos' : (s.sliceTo pos).Pos} :
(s.sliceTo pos).sliceTo pos' = s.sliceTo (Pos.ofSliceTo pos')
@[simp]
theorem String.Slice.sliceFrom_slice {s : Slice} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} {p : (s.slice p₁ p₂ h).Pos} :
(s.slice p₁ p₂ h).sliceFrom p = s.slice (Pos.ofSlice p) p₂ ⋯
@[simp]
theorem String.Slice.sliceTo_slice {s : Slice} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} {p : (s.slice p₁ p₂ h).Pos} :
(s.slice p₁ p₂ h).sliceTo p = s.slice p₁ (Pos.ofSlice p) ⋯
@[simp]
theorem String.sliceTo_sliceFrom {s : String} {pos : s.Pos} {pos' : (s.sliceFrom pos).Pos} :
(s.sliceFrom pos).sliceTo pos' = s.slice pos (Pos.ofSliceFrom pos') ⋯
@[simp]
theorem String.sliceFrom_sliceTo {s : String} {pos : s.Pos} {pos' : (s.sliceTo pos).Pos} :
(s.sliceTo pos).sliceFrom pos' = s.slice (Pos.ofSliceTo pos') pos ⋯
@[simp]
theorem String.sliceFrom_sliceFrom {s : String} {pos : s.Pos} {pos' : (s.sliceFrom pos).Pos} :
@[simp]
theorem String.sliceTo_sliceTo {s : String} {pos : s.Pos} {pos' : (s.sliceTo pos).Pos} :
(s.sliceTo pos).sliceTo pos' = s.sliceTo (Pos.ofSliceTo pos')
@[simp]
theorem String.sliceFrom_slice {s : String} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} {p : (s.slice p₁ p₂ h).Pos} :
(s.slice p₁ p₂ h).sliceFrom p = s.slice (Pos.ofSlice p) p₂ ⋯
@[simp]
theorem String.sliceTo_slice {s : String} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} {p : (s.slice p₁ p₂ h).Pos} :
(s.slice p₁ p₂ h).sliceTo p = s.slice p₁ (Pos.ofSlice p) ⋯
@[simp]
@[simp]
theorem String.Slice.sliceTo_eq_self_iff {s : Slice} {p : s.Pos} :
s.sliceTo p = s ↔ p = s.endPos
@[simp]
theorem String.Slice.slice_startPos {s : Slice} {p : s.Pos} :
s.slice s.startPos p ⋯ = s.sliceTo p
@[simp]
theorem String.Slice.slice_eq_self_iff {s : Slice} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} :
s.slice p₁ p₂ h = s ↔ p₁ = s.startPos ∧ p₂ = s.endPos
@[simp]
theorem String.Slice.slice_endPos {s : Slice} {p : s.Pos} :
s.slice p s.endPos ⋯ = s.sliceFrom p
@[simp]
@[simp]
theorem String.slice_startPos {s : String} {p : s.Pos} :
s.slice s.startPos p ⋯ = s.sliceTo p
@[simp]
theorem String.slice_endPos {s : String} {p : s.Pos} :
s.slice p s.endPos ⋯ = s.sliceFrom p
@[simp]
theorem String.slice_eq_toSlice_iff {s : String} {p₁ p₂ : s.Pos} {h : p₁ ≤ p₂} :
s.slice p₁ p₂ h = s.toSlice ↔ p₁ = s.startPos ∧ p₂ = s.endPos
theorem String.Slice.copy_eq_copy_slice {s : Slice} {pos₁ pos₂ : s.Pos} {h : pos₁ ≤ pos₂} :
s.copy = (s.sliceTo pos₁).copy ++ (s.slice pos₁ pos₂ h).copy ++ (s.sliceFrom pos₂).copy
theorem String.pos!_eq_pos {s : String} {p : Pos.Raw} (h : Pos.Raw.IsValid s p) :
s.pos! p = s.pos p h
@[simp]
theorem String.Slice.copy_pos {s : Slice} {p : Pos.Raw} {h : Pos.Raw.IsValidForSlice s p} :
(s.pos p h).copy = s.copy.pos p ⋯
@[simp]
theorem String.Slice.cast_pos {s t : Slice} {p : Pos.Raw} {h : Pos.Raw.IsValidForSlice s p} {h' : s.copy = t.copy} {h'' : Pos.Raw.IsValidForSlice t p} :
(s.pos p h).cast h' = t.pos p h''
@[simp]
theorem String.cast_pos {s t : String} {p : Pos.Raw} {h : Pos.Raw.IsValid s p} {h' : s = t} :
(s.pos p h).cast h' = t.pos p ⋯
@[simp]
theorem String.Pos.get_ofToSlice {s : String} {p : s.toSlice.Pos} {h : ofToSlice p ≠ s.endPos} :
(ofToSlice p).get h = p.get ⋯
@[simp]
theorem String.push_empty {c : Char} :
@[simp]
theorem String.Slice.Pos.nextn_zero {s : Slice} {p : s.Pos} :
p.nextn 0 = p
theorem String.Slice.Pos.nextn_add_one {n : Nat} {s : Slice} {p : s.Pos} :
p.nextn (n + 1) = if h : p = s.endPos then p else (p.next h).nextn n
@[simp]
@[simp]
theorem String.Pos.nextn_zero {s : String} {p : s.Pos} :
p.nextn 0 = p
theorem String.Pos.nextn_add_one {n : Nat} {s : String} {p : s.Pos} :
p.nextn (n + 1) = if h : p = s.endPos then p else (p.next h).nextn n
theorem String.Pos.nextn_toSlice {n : Nat} {s : String} {p : s.Pos} :
theorem String.Pos.toSlice_nextn {n : Nat} {s : String} {p : s.Pos} :
@[simp]
@[simp]
theorem String.Slice.Pos.cast_toSlice_copy {s : Slice} {pos : s.Pos} :
pos.copy.toSlice.cast ⋯ = pos
@[simp]
@[simp]
@[simp]
theorem String.Slice.Pos.sliceTo_eq_endPos {s : Slice} {p : s.Pos} :
p.sliceTo p ⋯ = (s.sliceTo p).endPos
@[simp]
theorem String.Slice.Pos.slice_eq_startPos {s : Slice} {p₀ p₁ : s.Pos} {h : p₀ ≤ p₁} :
p₀.slice p₀ p₁ ⋯ h = (s.slice p₀ p₁ ⋯).startPos
@[simp]
theorem String.Slice.Pos.slice_eq_endPos {s : Slice} {p₀ p₁ : s.Pos} {h : p₀ ≤ p₁} :
p₁.slice p₀ p₁ h ⋯ = (s.slice p₀ p₁ ⋯).endPos