Tier-Based Alternation Rules #
@cite{belth-2026} @cite{goldsmith-1976}
The canonical operational schema for SPE-style phonological alternations that factor through a tier projection. A rule has the shape
Rel(A, F) / C __ ∘ proj(·, T) (left-context, eq. 6 of @cite{belth-2026})
Rel(A, F) / __ C ∘ proj(·, T) (right-context, eq. 8)
where:
T ⊆ αis a tier (an erasing string-homomorphism — seeCore.Tier);C ⊆ Tis the natural class of the triggering tier-adjacent segment;A ⊆ αis the natural class of targets (here: a single underspecified position identified by index, à la @cite{belth-2026});Fis the agreed-or-disagreed feature; andRelisAgree(assimilation) orDisagree(dissimilation).
This schema covers Belth-style D2L rules (Latin -alis / -aris liquid
dissimilation, Turkish vowel harmony, Finnish backness harmony with
neutral-vowel transparency — see @cite{belth-2026}), Rose-Walker harmony
systems (which structurally contain a TierRule as their value-prediction
core — see Phonology.Harmony.HarmonySystem in Harmony/Defs.lean), and
any SPE rule whose context is a single tier-adjacent segment.
The schema does not cover:
- multi-feature dependencies (e.g., Turkish back/round parasitic harmony) —
would require generalising
featureValue : α → Option Boolto a list; - non-local context windows (e.g., "the second segment to the left on
the tier") — would require a positional offset on top of
lastWith.
Both extensions are admittable on demand following the project's
"infrastructure on demand" policy (see CLAUDE.md).
Relation to Process/LocalRewrite.lean #
Theories/Phonology/Process/LocalRewrite.lean defines Rule — full SPE
notation with arbitrary-length left/right contexts. The single-tier-
segment-context fragment of Rules is structurally subsumed by TierRule
(via the trivial-tier specialisation theorem id_tier_left_is_strict_local
below). The formal subsumption bridge theorem between the two rule types
is deferred — it would state that for any LocalRewrite.Rule whose
left/right contexts are each a single .seg element, there exists a
TierRule computing the same string function. Lean-checkable formulation
is straightforward but requires careful threading of the trivial tier;
land it once a Studies file needs to invoke the bridge concretely.
Belth's Agree/Disagree distinction (@cite{belth-2026} eq. 9).
Instances For
Equations
- Phonology.Alternation.instDecidableEqRelation x✝ y✝ = if h : x✝.ctorIdx = y✝.ctorIdx then isTrue ⋯ else isFalse ⋯
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Flipping the relation twice returns the original.
Which side the context lies on relative to the unspecified target slot.
.left—Rel(A, F) / C __: context precedes the target.right—Rel(A, F) / __ C: context follows the target
Aliased to Core.Direction so the same .left / .right cases used
by Function/Subsequential.lean::Direction (FST scan direction) and
by this file (context side of a tier rule) reduce to one inductive
type. The two roles read differently in prose but are isomorphic in
Lean.
Equations
Instances For
A tier-based alternation rule over alphabet α.
tier: the erasing projection (@cite{goldsmith-1976}) onto which the context-class check is performed.side: whether the triggering context precedes (.left, eq. 6) or follows (.right, eq. 8) the unspecified target slot.targetIsContext: the natural classC— the rule fires only when the tier-adjacent segment satisfies this predicate. Following mathlib'sFinset.filterconvention this isProp-valued with[DecidablePred]carried as the instance fielddecTarget.relation:.agree(assimilation) or.disagree(dissimilation).featureValue: the value ofFextracted from a context segment.nonemeans the segment is itself underspecified forF, in which case the rule defers todefault.default: the Elsewhere value (@cite{belth-2026} §2.3.3, Finnish 52b).nonemeans no default — when no context is found,applyAtreturnsnone.some vis the concrete fallback.
- tier : Core.Tier α α
- side : Side
- targetIsContext : α → Prop
- decTarget : DecidablePred self.targetIsContext
- relation : Relation
- featureValue : α → Option Bool
- default : Option Bool
Instances For
The value the rule predicts at the unspecified slot, given the rule
r, the preceding segments pre, and the following segments
post. The chosen side (r.side) determines which list is consulted.
Returns none only when there is no relevant context and no
default — i.e., the rule has no opinion.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Flipping the relation twice returns the original rule.
Strict locality is the trivial-tier special case. When the tier
is the identity (every segment projects), apply (left-context)
reduces to scanning the raw input for the context class — i.e., a
strictly local rule (@cite{belth-2026} §2.4 example: Turkish voicing
assimilation eq. 49b is Agree([?voice], {voice}) / [*] __ with the
trivial projection).
Reify a TierRule as a string-to-string function: at each input
position, predict the feature value for the implicit "hole" using the
preceding context. The result is a List α → List (Option Bool)
function that consumers can classify subregularly.
Defined recursively (via applyToStringAux) for ease of induction; the
output at position i is applyAt r (input.take i) per the auxiliary's
past-threading.
Equations
- r.applyToString input = Phonology.Alternation.TierRule.applyToString.applyToStringAux r input []
Instances For
Auxiliary: emit predictions over the suffix input, using past
as the accumulated past.
Equations
- Phonology.Alternation.TierRule.applyToString.applyToStringAux r [] past = []
- Phonology.Alternation.TierRule.applyToString.applyToStringAux r (x_2 :: xs) past = r.applyAt past :: Phonology.Alternation.TierRule.applyToString.applyToStringAux r xs (past ++ [x_2])
Instances For
Bridge to function-level subregular substrate #
The TierRule.applyToString reification produces a string-to-string
function classifiable in the function-level subregular hierarchy
(Core/Computability/Subregular/Function/). The expected classification
per @cite{aksenova-rawski-graf-heinz-2020}:
- Identity-tier
TierRules → Left-Subsequential (the trivial-tier case lemmaid_tier_left_is_strict_localabove shows the structural equivalence to scanning the raw input for the context class). - Non-trivial-tier
TierRules → Tier-Subsequential (a strictly larger class than Left-Subsequential, captured by the standard Heinz-Rawski-Tanner 2011 tier-strictly-local family applied to function classes).
This bridge theorem is deferred in this PR (substantive new
construction; the SFST witness needs to thread the tier projection's
state alongside the predicate-evaluation state). The substrate is in
place to receive it; the natural follow-up file is
Theories/Phonology/Process/AlternationSubregular.lean (or a small
addition here once a Studies file consumes the classification).
The prediction function shared by applyAt (under identity tier +
left side) and the SFST construction: given an "accumulated last
context" option, compute the feature value the rule predicts.
Equations
- One or more equations did not get rendered due to their size.
- r.predictFromCtx none = r.default
Instances For
The last context-matching segment of a list as Option α. State
representation for the SFST below: the last input segment so far that
satisfies targetIsContext.
Equations
- r.lastContextOf xs = (List.filter (fun (x : α) => decide (r.targetIsContext x)) xs).getLast?
Instances For
SFST witness for the identity-tier, left-side applyToString:
state tracks the last targetIsContext-matching input segment.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The SFST's state after one step matches the running lastContextOf.
lastContextOf extends by one step: appending a single segment to
the past updates the running last-context exactly as the SFST step
does.
Under identity tier + left side, applyAt agrees with
predictFromCtx ∘ lastContextOf — the structural rephrasing of
id_tier_left_is_strict_local.
The SFST computes applyToString. Generalised over the SFST's
starting state (which represents the lastContextOf of some virtual
past) and the corresponding past.
Identity-tier left-side TierRules reify to Left-Subsequential
functions. Closes audit D6 with a real witness construction (not a
sorry): the SFST has state Option α (last-context-matching segment
seen) and emits the rule's prediction at each step.