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
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.