Splits predicates on String.ValidPos and String.Slice.Pos. #
We introduce the predicate p.Splits t₁ t₂ for a position p on a string or slice s, which means
that s = t₁ ++ t₂ with p lying between the two parts. This is a useful primitive when verifying
string operations.
theorem
String.ValidPos.splits
{s : String}
(p : s.ValidPos)
:
p.Splits (s.replaceEnd p).copy (s.replaceStart p).copy
theorem
String.Slice.Pos.splits
{s : Slice}
(p : s.Pos)
:
p.Splits (s.replaceEnd p).copy (s.replaceStart p).copy
@[simp]
theorem
String.ValidPos.Splits.eq_endValidPos_iff
{t₁ t₂ s : String}
{p : s.ValidPos}
(h : p.Splits t₁ t₂)
:
@[simp]
theorem
String.ValidPos.Splits.eq_startValidPos_iff
{t₁ t₂ s : String}
{p : s.ValidPos}
(h : p.Splits t₁ t₂)
:
theorem
String.ValidPos.splits_next_right
{s : String}
(p : s.ValidPos)
(hp : p ≠ s.endValidPos)
:
p.Splits (s.replaceEnd p).copy (singleton (p.get hp) ++ (s.replaceStart (p.next hp)).copy)
theorem
String.ValidPos.splits_next
{s : String}
(p : s.ValidPos)
(hp : p ≠ s.endValidPos)
:
(p.next hp).Splits ((s.replaceEnd p).copy ++ singleton (p.get hp)) (s.replaceStart (p.next hp)).copy
theorem
String.Slice.Pos.splits_next_right
{s : Slice}
(p : s.Pos)
(hp : p ≠ s.endPos)
:
p.Splits (s.replaceEnd p).copy (singleton (p.get hp) ++ (s.replaceStart (p.next hp)).copy)