Skip to content

Commit 81631ba

Browse files
move deriveEnter and deriveLeave from Symbol
1 parent f2cc4f2 commit 81631ba

4 files changed

Lines changed: 36 additions & 24 deletions

File tree

Validator/Regex.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Validator.Regex.Enter
44
import Validator.Regex.EnterMem
55
import Validator.Regex.Extract
66
import Validator.Regex.Language
7+
import Validator.Regex.Leave
78
import Validator.Regex.LeaveMem
89
import Validator.Regex.LeaveSmart
910
import Validator.Regex.Map

Validator/Regex/Enter.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import Validator.Std.Vec
22

3+
import Validator.Regex.Extract
34
import Validator.Regex.Num
45
import Validator.Regex.Regex
5-
import Validator.Regex.Symbol
66

77
namespace Enter
88

Validator/Regex/Leave.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Validator.Regex.Extract
2+
import Validator.Regex.Num
3+
import Validator.Regex.Point
4+
import Validator.Regex.Regex
5+
import Validator.Regex.Replace
6+
7+
namespace Leave
8+
9+
def deriveLeaves
10+
(rs: Vec (Regex σ) l)
11+
(ps: Vec Bool (Symbol.nums rs))
12+
: (Vec (Regex σ) l) :=
13+
let replaces: Vec (σ × Bool) (Symbol.nums rs) := Vec.zip (Symbol.extractsFrom rs).2 ps
14+
let replaced: Vec (Regex (σ × Bool)) l := Symbol.replacesFrom (Symbol.extractsFrom rs).1 replaces
15+
Regex.Point.derives replaced
16+
17+
def deriveLeaveM [Monad m] {l: Nat} (xs: Vec (Regex σ) l) (ns: Vec Bool (Symbol.nums xs)): m (Vec (Regex σ) l) := do
18+
return deriveLeaves xs ns
19+
20+
class DeriveLeaveM (m: Type -> Type u) (σ: Type) where
21+
deriveLeaveM {l: Nat} (xs: Vec (Regex σ) l) (ns: Vec Bool (Symbol.nums xs)): m (Vec (Regex σ) l)

Validator/Regex/Symbol.lean

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import Validator.Std.Vec
22

3+
import Validator.Regex.Enter
34
import Validator.Regex.Extract
5+
import Validator.Regex.Leave
46
import Validator.Regex.Map
57
import Validator.Regex.Num
68
import Validator.Regex.Point
@@ -61,47 +63,35 @@ def derives {σ: Type} {α: Type} (Φ: σ -> α -> Bool) (rs: Vec (Regex σ) l)
6163
let replaced: Vec (Regex (σ × Bool)) l := replacesFrom rs' replaces
6264
Regex.Point.derives replaced
6365

64-
def leave
65-
(rs: Vec (Regex σ) l)
66-
(ps: Vec Bool (Symbol.nums rs))
67-
: (Vec (Regex σ) l) :=
68-
let replaces: Vec (σ × Bool) (Symbol.nums rs) := Vec.zip (Symbol.extractsFrom rs).2 ps
69-
let replaced: Vec (Regex (σ × Bool)) l := replacesFrom (Symbol.extractsFrom rs).1 replaces
70-
Regex.Point.derives replaced
71-
72-
def enter (rs: Vec (Regex σ) l): Vec σ (Symbol.nums rs) :=
73-
let (_, symbols): (Vec (RegexID (Symbol.nums rs)) l × Vec σ (Symbol.nums rs)) := Symbol.extractsFrom rs
74-
symbols
75-
7666
-- derives_preds unlike derives takes a predicate that works out the full vector of predicates.
7767
-- This gives the predicate control over the evaluation order of α, for example α is a tree, we can first evaluate the same label, before traversing down.
7868
def derives_preds {σ: Type} {α: Type}
7969
(ps: {n: Nat} -> Vec σ n -> α -> Vec Bool n) (rs: Vec (Regex σ) l) (a: α): Vec (Regex σ) l :=
80-
let symbols: Vec σ (Symbol.nums rs) := enter rs
70+
let symbols: Vec σ (Symbol.nums rs) := Enter.deriveEnter rs
8171
let pred_results: Vec Bool (Symbol.nums rs) := ps symbols a
82-
leave rs pred_results
72+
Leave.deriveLeaves rs pred_results
8373

8474
def derives_closures {σ: Type}
8575
(ps: {n: Nat} -> Vec σ n -> Vec Bool n) (rs: Vec (Regex σ) l): Vec (Regex σ) l :=
86-
let symbols: Vec σ (Symbol.nums rs) := enter rs
76+
let symbols: Vec σ (Symbol.nums rs) := Enter.deriveEnter rs
8777
let pred_results: Vec Bool (Symbol.nums rs) := ps symbols
88-
leave rs pred_results
78+
Leave.deriveLeaves rs pred_results
8979

9080
def derives_closures' {σ: Type}
9181
(ps: {n: Nat} -> Vec σ n -> Vec Bool n) (rs: Vec (Regex σ) l): Vec (Regex σ) l :=
92-
leave rs (ps (enter rs))
82+
Leave.deriveLeaves rs (ps (Enter.deriveEnter rs))
9383

9484
def derives_closure {σ: Type}
9585
(p: σ -> Bool) (rs: Vec (Regex σ) l): Vec (Regex σ) l :=
96-
let symbols: Vec σ (Symbol.nums rs) := enter rs
86+
let symbols: Vec σ (Symbol.nums rs) := Enter.deriveEnter rs
9787
let pred_results: Vec Bool (Symbol.nums rs) := Vec.map symbols p
98-
leave rs pred_results
88+
Leave.deriveLeaves rs pred_results
9989

10090
def derive_closure {σ: Type}
10191
(p: σ -> Bool) (r: Regex σ): Regex σ :=
102-
let symbols: Vec σ (Symbol.nums #vec[r]) := enter #vec[r]
92+
let symbols: Vec σ (Symbol.nums #vec[r]) := Enter.deriveEnter #vec[r]
10393
let pred_results: Vec Bool (Symbol.nums #vec[r]) := Vec.map symbols p
104-
let res := (leave #vec[r] pred_results)
94+
let res := (Leave.deriveLeaves #vec[r] pred_results)
10595
match res with
10696
| Vec.cons res' Vec.nil => res'
10797

@@ -423,8 +413,8 @@ theorem Symbol_derives_is_derives_preds
423413
simp only
424414
rw [<- h]
425415
unfold derives_preds
426-
unfold leave
427-
unfold enter
416+
unfold Leave.deriveLeaves
417+
unfold Enter.deriveEnter
428418
simp only
429419

430420
theorem Symbol_derives_preds_is_derives_closures

0 commit comments

Comments
 (0)