Strictly Piecewise Languages (SP_k) #
A language L is strictly k-piecewise when membership is determined
by which length-k subsequences (scattered, non-contiguous selections)
the input contains @cite{rogers-pullum-2011} @cite{lambert-2022}. Whereas
SL_k constrains adjacent material via factors (contiguous infixes),
SP_k constrains long-distance co-occurrence via subsequences.
Why subsequences (not factors) #
The two locality dimensions in the subregular hierarchy are
adjacency-based (SL/LT/LTT, captured by contiguous k-factors) and
precedence-based (SP/SP-tier, captured by k-element subsequences).
A long-distance phonological pattern such as sibilant harmony — sasi
but not saʃi — is naturally SP_2: the forbidden length-2 subsequence
is [s, ʃ] (and its reverse), regardless of intervening material.
No boundary augmentation is needed for SP: subsequences are blind to position and to symbols not in the subsequence itself, so leading and trailing markers add no information. This is the canonical convention in Heinz's SP work @cite{heinz-rogers-2010}.
Main definitions #
SPGrammar k α— a positivek-piecewise grammar over alphabetα.SPGrammar.lang— theLanguage αit generates: every length-ksubsequence ofwmust be permitted.IsStrictlyPiecewise k L— the property that aLanguage αis strictlyk-piecewise.
The relation List.Sublist (<+) is mathlib's "is a (non-contiguous)
subsequence of" — exactly what SP needs.
A strictly k-piecewise grammar over α: a set of permitted
length-k subsequences. Unlike SL grammars, no boundary alphabet is
used — subsequences are insensitive to position.
- permitted : Set (List α)
The set of permitted length-
ksubsequences.
Instances For
Equations
- Core.Computability.Subregular.SPGrammar.instInhabited = { default := { permitted := Set.univ } }
A language L is strictly k-piecewise iff some SPGrammar k α
generates exactly L.
Equations
- Core.Computability.Subregular.IsStrictlyPiecewise k L = ∃ (G : Core.Computability.Subregular.SPGrammar k α), G.lang = L
Instances For
Every SP grammar witnesses IsStrictlyPiecewise for its language.
SP membership reduces to a check against List.sublists. Used by the
decidable-membership instance below and by cross-framework comparisons
that need a decide-friendly characterisation.
Equations
- G.decidableMemLang w = decidable_of_iff (∀ s ∈ w.sublists, s.length = k → s ∈ G.permitted) ⋯