Syllable Structure #
Syllable constituency (onset–nucleus–coda), sonority scale, the Sonority Sequencing Principle, moraic weight, and OT markedness constraints.
Substance-free sonority #
The sonority hierarchy is represented as an abstract ordered type
(SonorityRank) rather than being defined by articulatory features.
Following @cite{berent-2026}, the synchronic grammar operates on the
ordering alone — the correlation with phonetic features ([±sonorant],
[±approximant], etc.) is a diachronic/evolutionary fact, not a
grammatical primitive. The grounding function sonorityOf maps
segments to ranks via their features, but the SSP and markedness
constraints see only SonorityRank.
Source: @cite{goldsmith-2011} "The Syllable" in The Handbook of Phonological Theory (Ch 6, pp. 164–196). Cross-referenced with Hayes §4.6 and §15.
@cite{goldsmith-2011} @cite{berent-2026}
The abstract sonority hierarchy: what the synchronic grammar operates on.
Following @cite{berent-2026}, phonological constraints on syllable structure are substance-free — the grammar sees an ordered set of sonority categories, not the articulatory features that happen to correlate with them. The correlation is diachronic (shaped by cultural evolution and articulatory pressures), but the synchronic computation is algebraic.
| Rank | Category |
|---|---|
| 0 | Stop |
| 1 | Fricative |
| 2 | Nasal |
| 3 | Liquid |
| 4 | Glide |
| 5 | Vowel |
The 6 levels follow @cite{clements-1990}'s refinement of the basic
5-class hierarchy (splitting obstruents by [±continuant]). See
NatClass.parkerSonority for the finer 8-level Parker scale.
- stop : SonorityRank
- fricative : SonorityRank
- nasal : SonorityRank
- liquid : SonorityRank
- glide : SonorityRank
- vowel : SonorityRank
Instances For
Equations
- Phonology.Syllable.instDecidableEqSonorityRank 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
Numeric rank (0 = least sonorous).
Equations
Instances For
SonorityRank.rank is injective: distinct ranks map to distinct Nats.
Linear order on sonority ranks, lifted from the numeric ranking.
Enables <, ≤, max, min on SonorityRank directly — used by
SONCON and other sonority-sensitive constraints. Follows the same
pattern as Stratum in Stratal.lean.
Substance-based grounding: classify a segment into the sonority hierarchy by its phonetic features.
Following @cite{hayes-2009}, the hierarchy is decomposed by four features ([±sonorant] > [±approximant] > [±consonantal] > [±syllabic]), with @cite{clements-1990}'s refinement splitting obstruents by [±continuant].
This function bridges phonetic substance and the abstract SonorityRank
type. The SSP and other grammatical constraints operate on SonorityRank
directly — they do not inspect articulatory features.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Instances For
Instances For
Instances For
Instances For
Is a list of Nats monotonically non-decreasing?
Equations
- Phonology.Syllable.monotoneRising [] = true
- Phonology.Syllable.monotoneRising [head] = true
- Phonology.Syllable.monotoneRising (a :: b :: rest) = (decide (a ≤ b) && Phonology.Syllable.monotoneRising (b :: rest))
Instances For
Is a list of Nats monotonically non-increasing?
Equations
- Phonology.Syllable.monotoneFalling [] = true
- Phonology.Syllable.monotoneFalling [head] = true
- Phonology.Syllable.monotoneFalling (a :: b :: rest) = (decide (a ≥ b) && Phonology.Syllable.monotoneFalling (b :: rest))
Instances For
Does the onset obey SSP? Sonority rises toward the nucleus.
Equations
- σ.sspOnset = Phonology.Syllable.monotoneRising (List.map (fun (s : Phonology.Segment) => (Phonology.Syllable.sonorityOf s).rank) σ.onset)
Instances For
Does the coda obey SSP? Sonority falls from the nucleus.
Equations
- σ.sspCoda = Phonology.Syllable.monotoneFalling (List.map (fun (s : Phonology.Segment) => (Phonology.Syllable.sonorityOf s).rank) σ.coda)
Instances For
Total segment count.
Equations
- sf.segmentCount = List.foldl (fun (x1 : ℕ) (x2 : Phonology.Syllable.Syllable) => x1 + x2.segments.length) 0 sf.syllables
Instances For
All segments in linear order.
Equations
- sf.allSegments = List.flatMap Phonology.Syllable.Syllable.segments sf.syllables
Instances For
Syllable weight: the mora count of a syllable.
Instead of a lossy 3-value enum, SyllWeight wraps the actual mora
count. The conventional names .light (1μ), .heavy (2μ),
.superheavy (3μ) are abbreviations for the common values.
This design ensures the prosodic pipeline is lossless:
MoraicSyllable → SyllWeight → PrWd preserves exact mora counts,
so bridge theorems between moraic and segmental views are trivial.
- morae : ℕ
The mora count: 1μ = light (CV), 2μ = heavy (CVV, CVC), 3μ = superheavy (CVVC, CVCC).
Instances For
Equations
- Phonology.Syllable.instDecidableEqSyllWeight.decEq { morae := a } { morae := b } = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- Phonology.Syllable.SyllWeight.superheavy = { morae := 3 }
Instances For
Mora count. codaMoraic = true means coda consonants contribute weight
(the "Weight-by-Position" parameter of @cite{hayes-1989}).
Instances For
Weight from mora count.
Instances For
ONSET: every syllable must have an onset. Returns count of onsetless syllables.
Equations
- Phonology.Syllable.onsetViolations sf = (List.filter (fun (σ : Phonology.Syllable.Syllable) => !σ.hasOnset) sf.syllables).length
Instances For
NOCODA: syllables should not have codas. Returns count of syllables with codas.
Equations
- Phonology.Syllable.noCodaViolations sf = (List.filter Phonology.Syllable.Syllable.hasCoda sf.syllables).length
Instances For
*COMPLEXONSET: no complex (multi-segment) onsets. Returns count of syllables with onset length > 1.
Equations
- Phonology.Syllable.complexOnsetViolations sf = (List.filter (fun (σ : Phonology.Syllable.Syllable) => decide (σ.onset.length > 1)) sf.syllables).length
Instances For
*COMPLEXCODA: no complex (multi-segment) codas. Returns count of syllables with coda length > 1.
Equations
- Phonology.Syllable.complexCodaViolations sf = (List.filter (fun (σ : Phonology.Syllable.Syllable) => decide (σ.coda.length > 1)) sf.syllables).length
Instances For
SSP: every syllable obeys the Sonority Sequencing Principle. Returns count of syllables violating SSP.
Equations
- Phonology.Syllable.sspViolations sf = (List.filter (fun (σ : Phonology.Syllable.Syllable) => !σ.sspValid) sf.syllables).length