Documentation
Init
.
Data
.
String
.
Lemmas
.
FindPos
Search
return to top
source
Imports
Init.Data.Order.Lemmas
Init.Data.String.FindPos
Init.Data.String.FindPos
Init.Data.String.OrderInstances
Init.Data.String.Lemmas.Order
Imported by
String
.
Slice
.
le_offset_posGE
String
.
Slice
.
posGE_le_iff
String
.
Slice
.
lt_posGE_iff
String
.
Slice
.
posGE_eq_iff
String
.
Slice
.
posGT_eq_posGE
String
.
Slice
.
posGE_inc
String
.
Slice
.
lt_offset_posGT
String
.
Slice
.
posGT_le_iff
String
.
Slice
.
lt_posGT_iff
String
.
Slice
.
posGT_eq_iff
String
.
Slice
.
Pos
.
posGE_offset
String
.
Slice
.
offset_posGE_eq_self_iff
String
.
Slice
.
posGE_eq_pos
String
.
Slice
.
pos_eq_posGE
String
.
Slice
.
Pos
.
posGT_offset
String
.
Slice
.
posGT_eq_next
String
.
Slice
.
Pos
.
next_eq_posGT
String
.
Slice
.
offset_posLE_le
String
.
Slice
.
le_posLE_iff
String
.
Slice
.
posLE_lt_iff
String
.
Slice
.
posLE_eq_iff
String
.
Slice
.
posLT_eq_posLE
String
.
Slice
.
posLE_dec
String
.
Slice
.
offset_posLT_lt
String
.
Slice
.
le_posLT_iff
String
.
Slice
.
posLT_lt_iff
String
.
Slice
.
posLT_eq_iff
String
.
Slice
.
Pos
.
posLE_offset
String
.
Slice
.
offset_posLE_eq_self_iff
String
.
Slice
.
posLE_eq_pos
String
.
Slice
.
pos_eq_posLE
String
.
Slice
.
Pos
.
posLT_offset
String
.
Slice
.
posLT_eq_prev
String
.
Slice
.
Pos
.
prev_eq_posLT
String
.
Slice
.
Pos
.
le_prev_iff_lt
String
.
Slice
.
Pos
.
prev_lt_iff_le
String
.
Slice
.
Pos
.
prev_eq_iff
String
.
Slice
.
Pos
.
prev_lt
String
.
Slice
.
Pos
.
prev_ne_endPos
String
.
Slice
.
Pos
.
prevn_le
String
.
Slice
.
Pos
.
prev_next
String
.
Slice
.
Pos
.
next_prev
String
.
le_offset_posGE
String
.
posGE_le_iff
String
.
lt_posGE_iff
String
.
posGE_eq_iff
String
.
posGT_eq_posGE
String
.
posGE_inc
String
.
lt_offset_posGT
String
.
posGT_le_iff
String
.
lt_posGT_iff
String
.
posGT_eq_iff
String
.
posGE_toSlice
String
.
posGE_eq_posGE_toSlice
String
.
posGT_toSlice
String
.
posGT_eq_posGT_toSlice
String
.
Pos
.
posGE_offset
String
.
offset_posGE_eq_self_iff
String
.
posGE_eq_pos
String
.
pos_eq_posGE
String
.
Pos
.
posGT_offset
String
.
posGT_eq_next
String
.
next_eq_posGT
String
.
offset_posLE_le
String
.
le_posLE_iff
String
.
posLE_lt_iff
String
.
posLE_eq_iff
String
.
posLT_eq_posLE
String
.
posLE_dec
String
.
offset_posLT_lt
String
.
le_posLT_iff
String
.
posLT_lt_iff
String
.
posLT_eq_iff
String
.
posLE_toSlice
String
.
posLE_eq_posLE_toSlice
String
.
posLT_toSlice
String
.
posLT_eq_posLT_toSlice
String
.
Pos
.
posLE_offset
String
.
offset_posLE_eq_self_iff
String
.
posLE_eq_pos
String
.
pos_eq_posLE
String
.
Pos
.
posLT_offset
String
.
posLT_eq_prev
String
.
Pos
.
prev_eq_posLT
String
.
Pos
.
le_prev_iff_lt
String
.
Pos
.
prev_lt_iff_le
String
.
Pos
.
prev_eq_iff
String
.
Pos
.
prev_lt
String
.
Pos
.
prev_ne_endPos
String
.
Pos
.
toSlice_prev
String
.
Pos
.
prev_toSlice
String
.
Pos
.
prevn_le
String
.
Pos
.
prev_next
String
.
Pos
.
next_prev
source
@[simp]
theorem
String
.
Slice
.
le_offset_posGE
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
:
p
≤
(
s
.
posGE
p
h
)
.
offset
source
@[simp]
theorem
String
.
Slice
.
posGE_le_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGE
p
h
≤
q
↔
p
≤
q
.
offset
source
@[simp]
theorem
String
.
Slice
.
lt_posGE_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
q
<
s
.
posGE
p
h
↔
q
.
offset
<
p
source
theorem
String
.
Slice
.
posGE_eq_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGE
p
h
=
q
↔
p
≤
q
.
offset
∧
∀ (
q'
:
s
.
Pos
),
p
≤
q'
.
offset
→
q
≤
q'
source
theorem
String
.
Slice
.
posGT_eq_posGE
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
:
s
.
posGT
p
h
=
s
.
posGE
p
.
inc
⋯
source
@[simp]
theorem
String
.
Slice
.
posGE_inc
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
.
inc
≤
s
.
rawEndPos
}
:
s
.
posGE
p
.
inc
h
=
s
.
posGT
p
h
source
@[simp]
theorem
String
.
Slice
.
lt_offset_posGT
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
:
p
<
(
s
.
posGT
p
h
)
.
offset
source
@[simp]
theorem
String
.
Slice
.
posGT_le_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGT
p
h
≤
q
↔
p
<
q
.
offset
source
@[simp]
theorem
String
.
Slice
.
lt_posGT_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
q
<
s
.
posGT
p
h
↔
q
.
offset
≤
p
source
theorem
String
.
Slice
.
posGT_eq_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGT
p
h
=
q
↔
p
<
q
.
offset
∧
∀ (
q'
:
s
.
Pos
),
p
<
q'
.
offset
→
q
≤
q'
source
@[simp]
theorem
String
.
Slice
.
Pos
.
posGE_offset
{
s
:
Slice
}
{
p
:
s
.
Pos
}
:
s
.
posGE
p
.
offset
⋯
=
p
source
@[simp]
theorem
String
.
Slice
.
offset_posGE_eq_self_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
:
(
s
.
posGE
p
h
)
.
offset
=
p
↔
Pos.Raw.IsValidForSlice
s
p
source
theorem
String
.
Slice
.
posGE_eq_pos
{
s
:
Slice
}
{
p
:
Pos.Raw
}
(
h
:
Pos.Raw.IsValidForSlice
s
p
)
:
s
.
posGE
p
⋯
=
s
.
pos
p
h
source
theorem
String
.
Slice
.
pos_eq_posGE
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
Pos.Raw.IsValidForSlice
s
p
}
:
s
.
pos
p
h
=
s
.
posGE
p
⋯
source
@[simp]
theorem
String
.
Slice
.
Pos
.
posGT_offset
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
.
offset
<
s
.
rawEndPos
}
:
s
.
posGT
p
.
offset
h
=
p
.
next
⋯
source
theorem
String
.
Slice
.
posGT_eq_next
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
(
h'
:
Pos.Raw.IsValidForSlice
s
p
)
:
s
.
posGT
p
h
=
(
s
.
pos
p
h'
)
.
next
⋯
source
theorem
String
.
Slice
.
Pos
.
next_eq_posGT
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
endPos
}
:
p
.
next
h
=
s
.
posGT
p
.
offset
⋯
source
@[simp]
theorem
String
.
Slice
.
offset_posLE_le
{
s
:
Slice
}
{
p
:
Pos.Raw
}
:
(
s
.
posLE
p
)
.
offset
≤
p
source
@[simp]
theorem
String
.
Slice
.
le_posLE_iff
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
q
:
Pos.Raw
}
:
p
≤
s
.
posLE
q
↔
p
.
offset
≤
q
source
@[simp]
theorem
String
.
Slice
.
posLE_lt_iff
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
q
:
Pos.Raw
}
:
s
.
posLE
q
<
p
↔
q
<
p
.
offset
source
theorem
String
.
Slice
.
posLE_eq_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
q
:
s
.
Pos
}
:
s
.
posLE
p
=
q
↔
q
.
offset
≤
p
∧
∀ (
q'
:
s
.
Pos
),
q'
.
offset
≤
p
→
q'
≤
q
source
theorem
String
.
Slice
.
posLT_eq_posLE
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
:
s
.
posLT
p
h
=
s
.
posLE
p
.
dec
source
theorem
String
.
Slice
.
posLE_dec
{
s
:
Slice
}
{
p
:
Pos.Raw
}
(
h
:
0
<
p
)
:
s
.
posLE
p
.
dec
=
s
.
posLT
p
h
source
@[simp]
theorem
String
.
Slice
.
offset_posLT_lt
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
:
(
s
.
posLT
p
h
)
.
offset
<
p
source
@[simp]
theorem
String
.
Slice
.
le_posLT_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
q
≤
s
.
posLT
p
h
↔
q
.
offset
<
p
source
@[simp]
theorem
String
.
Slice
.
posLT_lt_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
s
.
posLT
p
h
<
q
↔
p
≤
q
.
offset
source
theorem
String
.
Slice
.
posLT_eq_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
s
.
posLT
p
h
=
q
↔
q
.
offset
<
p
∧
∀ (
q'
:
s
.
Pos
),
q'
.
offset
<
p
→
q'
≤
q
source
@[simp]
theorem
String
.
Slice
.
Pos
.
posLE_offset
{
s
:
Slice
}
{
p
:
s
.
Pos
}
:
s
.
posLE
p
.
offset
=
p
source
@[simp]
theorem
String
.
Slice
.
offset_posLE_eq_self_iff
{
s
:
Slice
}
{
p
:
Pos.Raw
}
:
(
s
.
posLE
p
)
.
offset
=
p
↔
Pos.Raw.IsValidForSlice
s
p
source
theorem
String
.
Slice
.
posLE_eq_pos
{
s
:
Slice
}
{
p
:
Pos.Raw
}
(
h
:
Pos.Raw.IsValidForSlice
s
p
)
:
s
.
posLE
p
=
s
.
pos
p
h
source
theorem
String
.
Slice
.
pos_eq_posLE
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
Pos.Raw.IsValidForSlice
s
p
}
:
s
.
pos
p
h
=
s
.
posLE
p
source
@[simp]
theorem
String
.
Slice
.
Pos
.
posLT_offset
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
0
<
p
.
offset
}
:
s
.
posLT
p
.
offset
h
=
p
.
prev
⋯
source
theorem
String
.
Slice
.
posLT_eq_prev
{
s
:
Slice
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
(
h'
:
Pos.Raw.IsValidForSlice
s
p
)
:
s
.
posLT
p
h
=
(
s
.
pos
p
h'
)
.
prev
⋯
source
theorem
String
.
Slice
.
Pos
.
prev_eq_posLT
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
=
s
.
posLT
p
.
offset
⋯
source
@[simp]
theorem
String
.
Slice
.
Pos
.
le_prev_iff_lt
{
s
:
Slice
}
{
p
q
:
s
.
Pos
}
{
h
:
q
≠
s
.
startPos
}
:
p
≤
q
.
prev
h
↔
p
<
q
source
@[simp]
theorem
String
.
Slice
.
Pos
.
prev_lt_iff_le
{
s
:
Slice
}
{
p
q
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
<
q
↔
p
≤
q
source
theorem
String
.
Slice
.
Pos
.
prev_eq_iff
{
s
:
Slice
}
{
p
q
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
=
q
↔
q
<
p
∧
∀ (
q'
:
s
.
Pos
),
q'
<
p
→
q'
≤
q
source
@[simp]
theorem
String
.
Slice
.
Pos
.
prev_lt
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
<
p
source
@[simp]
theorem
String
.
Slice
.
Pos
.
prev_ne_endPos
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
≠
s
.
endPos
source
theorem
String
.
Slice
.
Pos
.
prevn_le
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
n
:
Nat
}
:
p
.
prevn
n
≤
p
source
@[simp]
theorem
String
.
Slice
.
Pos
.
prev_next
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
endPos
}
:
(
p
.
next
h
)
.
prev
⋯
=
p
source
@[simp]
theorem
String
.
Slice
.
Pos
.
next_prev
{
s
:
Slice
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
(
p
.
prev
h
)
.
next
⋯
=
p
source
@[simp]
theorem
String
.
le_offset_posGE
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
:
p
≤
(
s
.
posGE
p
h
)
.
offset
source
@[simp]
theorem
String
.
posGE_le_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGE
p
h
≤
q
↔
p
≤
q
.
offset
source
@[simp]
theorem
String
.
lt_posGE_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
q
<
s
.
posGE
p
h
↔
q
.
offset
<
p
source
theorem
String
.
posGE_eq_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGE
p
h
=
q
↔
p
≤
q
.
offset
∧
∀ (
q'
:
s
.
Pos
),
p
≤
q'
.
offset
→
q
≤
q'
source
theorem
String
.
posGT_eq_posGE
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
:
s
.
posGT
p
h
=
s
.
posGE
p
.
inc
⋯
source
@[simp]
theorem
String
.
posGE_inc
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
.
inc
≤
s
.
rawEndPos
}
:
s
.
posGE
p
.
inc
h
=
s
.
posGT
p
h
source
@[simp]
theorem
String
.
lt_offset_posGT
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
:
p
<
(
s
.
posGT
p
h
)
.
offset
source
@[simp]
theorem
String
.
posGT_le_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGT
p
h
≤
q
↔
p
<
q
.
offset
source
@[simp]
theorem
String
.
lt_posGT_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
q
<
s
.
posGT
p
h
↔
q
.
offset
≤
p
source
theorem
String
.
posGT_eq_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
{
q
:
s
.
Pos
}
:
s
.
posGT
p
h
=
q
↔
p
<
q
.
offset
∧
∀ (
q'
:
s
.
Pos
),
p
<
q'
.
offset
→
q
≤
q'
source
theorem
String
.
posGE_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
p
≤
s
.
toSlice
.
rawEndPos
)
:
s
.
toSlice
.
posGE
p
h
=
(
s
.
posGE
p
h
)
.
toSlice
source
theorem
String
.
posGE_eq_posGE_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
p
≤
s
.
rawEndPos
)
:
s
.
posGE
p
h
=
Pos.ofToSlice
(
s
.
toSlice
.
posGE
p
⋯
)
source
theorem
String
.
posGT_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
p
<
s
.
toSlice
.
rawEndPos
)
:
s
.
toSlice
.
posGT
p
h
=
(
s
.
posGT
p
h
)
.
toSlice
source
theorem
String
.
posGT_eq_posGT_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
p
<
s
.
rawEndPos
)
:
s
.
posGT
p
h
=
Pos.ofToSlice
(
s
.
toSlice
.
posGT
p
⋯
)
source
@[simp]
theorem
String
.
Pos
.
posGE_offset
{
s
:
String
}
{
p
:
s
.
Pos
}
:
s
.
posGE
p
.
offset
⋯
=
p
source
@[simp]
theorem
String
.
offset_posGE_eq_self_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
≤
s
.
rawEndPos
}
:
(
s
.
posGE
p
h
)
.
offset
=
p
↔
Pos.Raw.IsValid
s
p
source
theorem
String
.
posGE_eq_pos
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
Pos.Raw.IsValid
s
p
)
:
s
.
posGE
p
⋯
=
s
.
pos
p
h
source
theorem
String
.
pos_eq_posGE
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
Pos.Raw.IsValid
s
p
}
:
s
.
pos
p
h
=
s
.
posGE
p
⋯
source
@[simp]
theorem
String
.
Pos
.
posGT_offset
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
.
offset
<
s
.
rawEndPos
}
:
s
.
posGT
p
.
offset
h
=
p
.
next
⋯
source
theorem
String
.
posGT_eq_next
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
p
<
s
.
rawEndPos
}
(
h'
:
Pos.Raw.IsValid
s
p
)
:
s
.
posGT
p
h
=
(
s
.
pos
p
h'
)
.
next
⋯
source
theorem
String
.
next_eq_posGT
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
endPos
}
:
p
.
next
h
=
s
.
posGT
p
.
offset
⋯
source
@[simp]
theorem
String
.
offset_posLE_le
{
s
:
String
}
{
p
:
Pos.Raw
}
:
(
s
.
posLE
p
)
.
offset
≤
p
source
@[simp]
theorem
String
.
le_posLE_iff
{
s
:
String
}
{
p
:
s
.
Pos
}
{
q
:
Pos.Raw
}
:
p
≤
s
.
posLE
q
↔
p
.
offset
≤
q
source
@[simp]
theorem
String
.
posLE_lt_iff
{
s
:
String
}
{
p
:
s
.
Pos
}
{
q
:
Pos.Raw
}
:
s
.
posLE
q
<
p
↔
q
<
p
.
offset
source
theorem
String
.
posLE_eq_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
q
:
s
.
Pos
}
:
s
.
posLE
p
=
q
↔
q
.
offset
≤
p
∧
∀ (
q'
:
s
.
Pos
),
q'
.
offset
≤
p
→
q'
≤
q
source
theorem
String
.
posLT_eq_posLE
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
:
s
.
posLT
p
h
=
s
.
posLE
p
.
dec
source
theorem
String
.
posLE_dec
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
0
<
p
)
:
s
.
posLE
p
.
dec
=
s
.
posLT
p
h
source
@[simp]
theorem
String
.
offset_posLT_lt
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
:
(
s
.
posLT
p
h
)
.
offset
<
p
source
@[simp]
theorem
String
.
le_posLT_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
q
≤
s
.
posLT
p
h
↔
q
.
offset
<
p
source
@[simp]
theorem
String
.
posLT_lt_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
s
.
posLT
p
h
<
q
↔
p
≤
q
.
offset
source
theorem
String
.
posLT_eq_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
{
q
:
s
.
Pos
}
:
s
.
posLT
p
h
=
q
↔
q
.
offset
<
p
∧
∀ (
q'
:
s
.
Pos
),
q'
.
offset
<
p
→
q'
≤
q
source
theorem
String
.
posLE_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
:
s
.
toSlice
.
posLE
p
=
(
s
.
posLE
p
)
.
toSlice
source
theorem
String
.
posLE_eq_posLE_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
:
s
.
posLE
p
=
Pos.ofToSlice
(
s
.
toSlice
.
posLE
p
)
source
theorem
String
.
posLT_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
0
<
p
)
:
s
.
toSlice
.
posLT
p
h
=
(
s
.
posLT
p
h
)
.
toSlice
source
theorem
String
.
posLT_eq_posLT_toSlice
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
0
<
p
)
:
s
.
posLT
p
h
=
Pos.ofToSlice
(
s
.
toSlice
.
posLT
p
h
)
source
@[simp]
theorem
String
.
Pos
.
posLE_offset
{
s
:
String
}
{
p
:
s
.
Pos
}
:
s
.
posLE
p
.
offset
=
p
source
@[simp]
theorem
String
.
offset_posLE_eq_self_iff
{
s
:
String
}
{
p
:
Pos.Raw
}
:
(
s
.
posLE
p
)
.
offset
=
p
↔
Pos.Raw.IsValid
s
p
source
theorem
String
.
posLE_eq_pos
{
s
:
String
}
{
p
:
Pos.Raw
}
(
h
:
Pos.Raw.IsValid
s
p
)
:
s
.
posLE
p
=
s
.
pos
p
h
source
theorem
String
.
pos_eq_posLE
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
Pos.Raw.IsValid
s
p
}
:
s
.
pos
p
h
=
s
.
posLE
p
source
@[simp]
theorem
String
.
Pos
.
posLT_offset
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
0
<
p
.
offset
}
:
s
.
posLT
p
.
offset
h
=
p
.
prev
⋯
source
theorem
String
.
posLT_eq_prev
{
s
:
String
}
{
p
:
Pos.Raw
}
{
h
:
0
<
p
}
(
h'
:
Pos.Raw.IsValid
s
p
)
:
s
.
posLT
p
h
=
(
s
.
pos
p
h'
)
.
prev
⋯
source
theorem
String
.
Pos
.
prev_eq_posLT
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
=
s
.
posLT
p
.
offset
⋯
source
@[simp]
theorem
String
.
Pos
.
le_prev_iff_lt
{
s
:
String
}
{
p
q
:
s
.
Pos
}
{
h
:
q
≠
s
.
startPos
}
:
p
≤
q
.
prev
h
↔
p
<
q
source
@[simp]
theorem
String
.
Pos
.
prev_lt_iff_le
{
s
:
String
}
{
p
q
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
<
q
↔
p
≤
q
source
theorem
String
.
Pos
.
prev_eq_iff
{
s
:
String
}
{
p
q
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
=
q
↔
q
<
p
∧
∀ (
q'
:
s
.
Pos
),
q'
<
p
→
q'
≤
q
source
@[simp]
theorem
String
.
Pos
.
prev_lt
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
<
p
source
@[simp]
theorem
String
.
Pos
.
prev_ne_endPos
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
p
.
prev
h
≠
s
.
endPos
source
theorem
String
.
Pos
.
toSlice_prev
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
(
p
.
prev
h
)
.
toSlice
=
p
.
toSlice
.
prev
⋯
source
theorem
String
.
Pos
.
prev_toSlice
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
.
toSlice
≠
s
.
toSlice
.
startPos
}
:
p
.
toSlice
.
prev
h
=
(
p
.
prev
⋯
)
.
toSlice
source
theorem
String
.
Pos
.
prevn_le
{
s
:
String
}
{
p
:
s
.
Pos
}
{
n
:
Nat
}
:
p
.
prevn
n
≤
p
source
@[simp]
theorem
String
.
Pos
.
prev_next
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
endPos
}
:
(
p
.
next
h
)
.
prev
⋯
=
p
source
@[simp]
theorem
String
.
Pos
.
next_prev
{
s
:
String
}
{
p
:
s
.
Pos
}
{
h
:
p
≠
s
.
startPos
}
:
(
p
.
prev
h
)
.
next
⋯
=
p