@@ -4,7 +4,7 @@ import RegexCorrectness.Data.Expr.Semantics
44
55set_option autoImplicit false
66
7- open String (ValidPos)
7+ open String (ValidPos ValidPosPlusOne )
88open Regex.Data (CaptureGroups)
99
1010namespace Regex.Strategy
@@ -61,12 +61,12 @@ theorem mem_tags_of_materializeRegexGroups_some {e : Expr} {pos pos' : ValidPos
6161@[simp]
6262theorem materializeUpdatesAux_snoc {n accum updates offset} {pos : ValidPos s} :
6363 materializeUpdatesAux n accum (updates ++ [(offset, pos)]) =
64- (materializeUpdatesAux n accum updates).setIfInBounds offset (some pos) := by
64+ (materializeUpdatesAux n accum updates).setIfInBounds offset (.validPos pos) := by
6565 induction updates generalizing accum with
6666 | nil => simp [materializeUpdatesAux]
6767 | cons _ _ ih => simp [materializeUpdatesAux, ih]
6868
69- theorem materializeUpdatesAux_swap {n : Nat} {accum : Vector (Option (ValidPos s) ) n} {updates : List (Nat × ValidPos s)} {offset₁ pos₁ offset₂ pos₂}
69+ theorem materializeUpdatesAux_swap {n : Nat} {accum : Vector (ValidPosPlusOne s ) n} {updates : List (Nat × ValidPos s)} {offset₁ pos₁ offset₂ pos₂}
7070 (ne : offset₁ ≠ offset₂) :
7171 materializeUpdatesAux n accum ((offset₁, pos₁) :: (offset₂, pos₂) :: updates) =
7272 materializeUpdatesAux n accum ((offset₂, pos₂) :: (offset₁, pos₁) :: updates) := by
@@ -86,7 +86,7 @@ theorem materializeUpdatesAux_swap {n : Nat} {accum : Vector (Option (ValidPos s
8686theorem materializeUpdatesAux_cons_of_not_in {n accum updates offset} {pos : ValidPos s}
8787 (h : ∀ offset' pos', (offset', pos') ∈ updates → offset ≠ offset') :
8888 materializeUpdatesAux n accum ((offset, pos) :: updates) =
89- (materializeUpdatesAux n accum updates).setIfInBounds offset (some pos) := by
89+ (materializeUpdatesAux n accum updates).setIfInBounds offset (.validPos pos) := by
9090 induction updates generalizing accum with
9191 | nil => simp [materializeUpdatesAux]
9292 | cons head updates ih =>
@@ -102,44 +102,29 @@ theorem materializeUpdatesAux_cons_of_not_in {n accum updates offset} {pos : Val
102102 rfl
103103
104104@[simp]
105- theorem materializeUpdatesAux_nil {n : Nat} {accum : Vector (Option (ValidPos s) ) n} :
105+ theorem materializeUpdatesAux_nil {n : Nat} {accum : Vector (ValidPosPlusOne s ) n} :
106106 materializeUpdatesAux n accum [] = accum := rfl
107107
108- theorem materializeUpdatesAux_append {n : Nat} {accum : Vector (Option (ValidPos s) ) n} {updates₁ updates₂ : List (Nat × ValidPos s)} :
108+ theorem materializeUpdatesAux_append {n : Nat} {accum : Vector (ValidPosPlusOne s ) n} {updates₁ updates₂ : List (Nat × ValidPos s)} :
109109 materializeUpdatesAux n accum (updates₁ ++ updates₂) = materializeUpdatesAux n (materializeUpdatesAux n accum updates₁) updates₂ := by
110110 induction updates₁ generalizing accum with
111111 | nil => simp
112112 | cons head tail ih => simp [materializeUpdatesAux, ih]
113113
114- theorem materializeUpdatesAux_getElem {n : Nat} {accum : Vector (Option (ValidPos s) ) n} {updates : List (Nat × ValidPos s)} {offset : Nat} (h : offset < n) :
114+ theorem materializeUpdatesAux_getElem {n : Nat} {accum : Vector (ValidPosPlusOne s ) n} {updates : List (Nat × ValidPos s)} {offset : Nat} (h : offset < n) :
115115 (materializeUpdatesAux n accum updates)[offset] =
116- ((materializeUpdatesAux n (Vector.replicate n .none ) updates)[offset] <|> accum[offset]) := by
116+ ((materializeUpdatesAux n (Vector.replicate n (.sentinel s) ) updates)[offset] <|> accum[offset]) := by
117117 induction updates generalizing accum with
118118 | nil => simp
119- | cons head updates ih =>
120- simp [materializeUpdatesAux]
121- conv =>
122- lhs
123- rw [ih]
124- conv =>
125- rhs
126- rw [ih]
127- cases (materializeUpdatesAux n (Vector.replicate n .none) updates)[offset] with
128- | some _ => simp
129- | none =>
130- simp
131- if h' : head.1 = offset then
132- simp [h']
133- else
134- simp [h']
119+ | cons head updates ih => grind [materializeUpdatesAux]
135120
136121@[simp]
137- theorem materializeUpdates_empty {n} : @materializeUpdates s n [] = Vector.replicate n .none := rfl
122+ theorem materializeUpdates_empty {n} : @materializeUpdates s n [] = Vector.replicate n (.sentinel s) := rfl
138123
139124@[simp]
140125theorem materializeUpdates_snoc {n : Nat} {updates : List (Nat × ValidPos s)} {offset : Nat} {pos : ValidPos s} :
141126 materializeUpdates n (updates ++ [(offset, pos)]) =
142- (materializeUpdates n updates).setIfInBounds offset (some pos) := by
127+ (materializeUpdates n updates).setIfInBounds offset (.validPos pos) := by
143128 simp [materializeUpdates]
144129
145130theorem materializeUpdates_append_getElem {n : Nat} {updates₁ updates₂ : List (Nat × ValidPos s)} {offset : Nat} (h : offset < n) :
0 commit comments