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
Returns the size of the prefix table
Instances For
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
.
Instances For
Make prefix table from a pattern array
Equations
- xs.mkPrefixTable = Array.foldl (fun (x : Array.PrefixTable α) => x.extend) default xs
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 : 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 }
Instances For
Make a KMP matcher for a given a pattern stream
Equations
- Array.Matcher.ofStream pat = { table := Array.mkPrefixTableOfStream pat }