Output Strictly Local (OSL) Functions #
A function f : List α → List β is k-Output Strictly Local when each
output block depends only on the last k − 1 output symbols plus the
current input symbol @cite{chandlee-eyraud-heinz-2015}. The OSL class
captures iterative spreading processes — patterns where the spreading
feature value of segment i depends on the spreading feature value of
segment i − 1 (already determined by the OSL function), not on the
underlying input value.
Like Subsequential, OSL has left and right variants depending on scan direction. Left-OSL: each output block depends on previous output (processed left-to-right). Right-OSL: each output block depends on following output (process right-to-left).
OSL is properly contained in Subsequential and properly contains ISL @cite{aksenova-rawski-graf-heinz-2020}. The proper containments are:
- ISL ⊊ OSL: many iterative spreading patterns (e.g. progressive nasal harmony) are OSL but not ISL — output decisions feed forward.
- OSL ⊊ Subsequential: subsequential FSTs can carry richer state than bounded output windows; iterative-with-blocking patterns may need this.
Bidirectional iterative harmony patterns (Maasai, Turkana ATR harmony) are above all unidirectional OSL classes — they need the Weakly Deterministic class @cite{heinz-lai-2013} @cite{meinhardt-mai-bakovic-mccollum-2024}.
Main definitions #
OSLRule k α β— a k-OSL rule: a window-based output function(List β) → α → List βthat consumes the (k − 1)-symbol output context plus the current input symbol and emits an output block.OSLRule.apply r— the induced string functionList α → List β, threading the output window left-to-right.IsLeftOutputStrictlyLocal k f,IsRightOutputStrictlyLocal k f,IsOutputStrictlyLocal d k f— Direction-parameterised predicates.
A k-Output-Strictly-Local rule over input alphabet α and
output alphabet β. The single field windowOutput consumes the
(k − 1)-symbol output context window plus the current input symbol and
emits an output block.
In contrast to ISLRule (whose window is over input symbols), the
window here is over already-emitted output symbols. This lets the
rule see what it has just produced and react accordingly — the
mechanism behind iterative spreading.
The k parameter is a type-level annotation; semantic enforcement
happens in apply's window threading.
- windowOutput : List β → α → List β
Map from (output context window, current input symbol) to output block. The window argument has length at most
k - 1when called byOSLRule.apply.
Instances For
Apply the rule, threading a window of accumulated output symbols.
At each input position, emit r.windowOutput outputWindow x, then
extend the output window with the just-emitted block (truncated to keep
at most k − 1 symbols).
Equations
- r.applyAux x✝ [] = []
- r.applyAux x✝ (x_2 :: xs) = r.windowOutput x✝ x_2 ++ r.applyAux (Core.Computability.Subregular.Function.lastN (k - 1) (x✝ ++ r.windowOutput x✝ x_2)) xs
Instances For
A function f : List α → List β is k-Left-Output-Strictly-Local
iff some k-OSL rule computes it via left-to-right scan.
Equations
- Core.Computability.Subregular.Function.IsLeftOutputStrictlyLocal k f = ∃ (r : Core.Computability.Subregular.Function.OSLRule k α β), r.apply = f
Instances For
A function f : List α → List β is k-Right-Output-Strictly-Local
iff some k-OSL rule computes it via right-to-left scan.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Direction-parameterised OSL predicate.
Equations
- Core.Computability.Subregular.Function.IsOutputStrictlyLocal Core.Direction.left k f = Core.Computability.Subregular.Function.IsLeftOutputStrictlyLocal k f
- Core.Computability.Subregular.Function.IsOutputStrictlyLocal Core.Direction.right k f = Core.Computability.Subregular.Function.IsRightOutputStrictlyLocal k f
Instances For
Every OSL rule witnesses IsLeftOutputStrictlyLocal for the function
it computes.
Reverse-conjugation lemma: a function is k-Right-OSL iff its
reverse-conjugate is k-Left-OSL. The two classes are isomorphic via the
involution f ↦ List.reverse ∘ f ∘ List.reverse.
OSL → Subsequential #
Construction-with-cast co-located on the source side, mirroring the ISL treatment.
Construction: every Left-OSL rule induces an SFST whose state is the
output window (length ≤ k − 1) and whose finalOutput is empty.
The windowOutput call is repeated in the two tuple components rather
than let-bound so that (step ow x).2 reduces definitionally to
r.windowOutput ow x for the proof of toSFST_run_eq_apply.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Left-OSL ⊆ Left-Subsequential: every Left-OSL function is computed by some SFST scanning left-to-right.