Prefix table for the Knuth-Morris-Pratt matching algorithm
This is an array of the form t = [(x₀,n₀), (x₁,n₁), (x₂, n₂), ...] where for each i, nᵢ is
the length of the longest proper prefix of xs = [x₀,x₁,...,xᵢ] which is also a suffix of xs.
Validity condition to help with termination proofs
Instances For
Validity condition to help with termination proofs
Equations
- Array.instInhabitedPrefixTable = { default := { toArray := #[], valid := ⋯ } }
Transition function for the KMP matcher
Assuming we have an input xs with a suffix that matches the pattern prefix t.pattern[:len]
where len : Fin (t.size+1). Then xs.push x has a suffix that matches the pattern prefix
t.pattern[:t.step x len]. If len is as large as possible then t.step x len will also be
as large as possible.
Equations
Instances For
Extend a prefix table by one element
If t is the prefix table for xs then t.extend x is the prefix table for xs.push x.
Equations
- t.extend x = { toArray := t.push (x, ↑(t.step x ⟨t.size, ⋯⟩)), valid := ⋯ }
Instances For
Make prefix table from a pattern array
Equations
- xs.mkPrefixTable = Array.foldl (fun (x : Array.PrefixTable α) => x.extend) default xs 0
Instances For
Make prefix table from a pattern stream
Equations
- Array.mkPrefixTableOfStream stream = Array.mkPrefixTableOfStream.loop default stream
Instances For
Inner loop for mkPrefixTableOfStream
KMP matcher structure
- table : Array.PrefixTable α
Prefix table for the pattern
Current longest matching prefix
Instances For
Make a KMP matcher for a given pattern array
Equations
- Array.Matcher.ofArray pat = { table := pat.mkPrefixTable, state := 0 }
Instances For
Make a KMP matcher for a given a pattern stream
Equations
- Array.Matcher.ofStream pat = { table := Array.mkPrefixTableOfStream pat, state := 0 }
Instances For
Find next match from a given stream
Runs the stream until it reads a sequence that matches the sought pattern, then returns the stream state at that point and an updated matcher state.