Skip to content

Commit 8ea6758

Browse files
regex closure commutes
1 parent 6a1e6d7 commit 8ea6758

File tree

2 files changed

+21
-25
lines changed

2 files changed

+21
-25
lines changed

Validator/Regex/Closure.lean

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,12 @@ theorem derive_is_closure_derive (Φ: σ -> α -> Bool) (r: Regex σ) (a: α):
3737
simp only [Regex.derive, Regex.Closure.derive]
3838
rw [ih1]
3939

40-
theorem closure_derive_is_derive (Φ: σ -> Bool) (r: Regex σ) (a: α):
41-
Regex.Closure.derive Φ r = Regex.derive (fun s _ => Φ s) r a := by
42-
induction r with
43-
| emptyset =>
44-
simp only [Regex.derive, Regex.Closure.derive]
45-
| emptystr =>
46-
simp only [Regex.derive, Regex.Closure.derive]
47-
| symbol s =>
48-
simp only [Regex.derive, Regex.Closure.derive]
49-
| or r1 r2 ih1 ih2 =>
50-
simp only [Regex.derive, Regex.Closure.derive]
51-
rw [ih1]
52-
rw [ih2]
53-
| concat r1 r2 ih1 ih2 =>
54-
simp only [Regex.derive, Regex.Closure.derive]
55-
rw [ih1]
56-
rw [ih2]
57-
| star r1 ih1 =>
58-
simp only [Regex.derive, Regex.Closure.derive]
59-
rw [ih1]
40+
theorem derive_commutesb {σ: Type} {α: Type} (Φ: σ -> α -> Bool) (r: Regex σ) (a: α):
41+
denote (fun s a => Φ s a) (Regex.Closure.derive (fun s => Φ s a) r) = Language.derive (denote (fun s a => Φ s a) r) a := by
42+
rw [<- derive_is_closure_derive]
43+
rw [<- Regex.derive_commutesb]
44+
45+
theorem derive_commutesb' {σ: Type} {α: Type} (Φ: σ -> α -> Bool) (r: Regex σ) (a: α):
46+
denote (fun s a => Φ s a) (Regex.Closure.derive (fun s => Φ s a) r) = Language.derive (denote (fun s a => Φ s a) r) a := by
47+
rw [<- derive_is_closure_derive]
48+
rw [<- Regex.derive_commutesb]

Validator/Regex/Regex.lean

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ inductive Regex (σ: Type) where
1212
| star (p: Regex σ)
1313
deriving DecidableEq, Ord, Repr, Hashable
1414

15-
instance [Ord α]: Ord (Regex α) := inferInstance
15+
instance [Ord σ]: Ord (Regex σ) := inferInstance
1616

17-
instance [Repr α]: Repr (Regex α) := inferInstance
17+
instance [Repr σ]: Repr (Regex σ) := inferInstance
1818

19-
instance [DecidableEq α]: DecidableEq (Regex α) := inferInstance
19+
instance [DecidableEq σ]: DecidableEq (Regex σ) := inferInstance
2020

21-
instance [DecidableEq α]: BEq (Regex α) := inferInstance
21+
instance [DecidableEq σ]: BEq (Regex σ) := inferInstance
2222

23-
instance [Hashable α]: Hashable (Regex α) := inferInstance
23+
instance [Hashable σ]: Hashable (Regex σ) := inferInstance
2424

2525
namespace Regex
2626

@@ -200,3 +200,10 @@ theorem derive_commutes {σ: Type} {α: Type} (Φ: σ -> α -> Prop) [DecidableR
200200
congrm ((Language.concat_n ?_ (Language.star_n (denote Φ r))))
201201
guard_target = denote Φ (derive (fun s a => Φ s a) r x) = Language.derive (denote Φ r) x
202202
exact ih
203+
204+
theorem derive_commutesb {σ: Type} {α: Type} (Φ: σ -> α -> Bool) (r: Regex σ) (x: α):
205+
denote (fun s a => Φ s a) (derive (fun s a => Φ s a) r x) = Language.derive (denote (fun s a => Φ s a) r) x := by
206+
rw [<- derive_commutes]
207+
congr
208+
funext s a
209+
simp only [Bool.decide_eq_true]

0 commit comments

Comments
 (0)