CV templates and template association #
The skeletal species of template — [McC81]'s prosodic template,
also called the CV-skeleton — as the sibling of the position-class
AffixTemplate: an ordered sequence of consonantal and vocalic timing
slots. A TemplateMatch pairs a consonantal root, a vocalism, and affixal
material with a template and a list of association lines; spellout reads
off the surface segments. Gemination is a one-to-many association from one
melody element to several slots ([McC81]); a slot with no
association line receives no phonetic realization.
Association conventions — one-to-one left-to-right, spreading, erasure
rules — are derivational recipes and live with the studies that state them
(Studies/McCarthy1981.lean, Studies/Faust2026.lean); this file provides
the representations they manipulate.
Main declarations #
CVSlot,CVTemplate— skeletal slots and templates.Association— a sourced melody-to-slot association line.TemplateMatch— a root, vocalism, and affix matched to a template.TemplateMatch.spellout— the surface segments of a match.TemplateMatch.OrderedOn— the tier-internal well-formedness condition.TemplateMatch.links— the per-tier link sets, in the coordinates of the autosegmental substrate.
Main results #
TemplateMatch.orderedOn_iff—OrderedOndecomposes into the substrate'sAutosegmental.IsNonCrossingplus [McC81]'s prohibition against many-to-one associations (SlotUnique), so the list-level representation here interprets intoPhonology/Autosegmental/NonCrossing.leanrather than duplicating it.
A slot in a CV-skeletal template ([McC81], [Low96]): a bare consonantal timing slot, a vowel timing slot, or a C-slot bearing [+consonantal], which blocks association from glides ([Fau26]).
- C : CVSlot
A bare consonantal timing slot.
- V : CVSlot
A vowel timing slot.
- Cspec : CVSlot
A C-slot specified [+consonantal].
Instances For
Equations
- Morphology.instDecidableEqCVSlot x✝ y✝ = if h : x✝.ctorIdx = y✝.ctorIdx then isTrue ⋯ else isFalse ⋯
Equations
- Morphology.instReprCVSlot.repr Morphology.CVSlot.C prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Morphology.CVSlot.C")).group prec✝
- Morphology.instReprCVSlot.repr Morphology.CVSlot.V prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Morphology.CVSlot.V")).group prec✝
- Morphology.instReprCVSlot.repr Morphology.CVSlot.Cspec prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Morphology.CVSlot.Cspec")).group prec✝
Instances For
Equations
- Morphology.instReprCVSlot = { reprPrec := Morphology.instReprCVSlot.repr }
IsC s asserts that s is a C-slot, bare or [+consonantal].
Equations
- Morphology.CVSlot.C.IsC = True
- Morphology.CVSlot.Cspec.IsC = True
- Morphology.CVSlot.V.IsC = False
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
RequiresConsonantal s asserts that s demands a [+consonantal]
segment.
Equations
- Morphology.CVSlot.Cspec.RequiresConsonantal = True
- x✝.RequiresConsonantal = False
Instances For
Equations
- One or more equations did not get rendered due to their size.
A CV-skeletal template: an ordered sequence of timing slots.
- slots : List CVSlot
The slots, in order.
Instances For
Equations
- Morphology.instReprCVTemplate.repr x✝ prec✝ = Std.Format.bracket "{ " (Std.Format.nil ++ Std.Format.text "slots" ++ Std.Format.text " := " ++ (Std.Format.nest 9 (repr x✝.slots)).group) " }"
Instances For
Equations
- Morphology.instReprCVTemplate = { reprPrec := Morphology.instReprCVTemplate.repr }
Equations
- Morphology.instDecidableEqCVTemplate.decEq { slots := a } { slots := b } = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
The number of slots.
Instances For
The number of C-slots.
Equations
- t.cCount = (List.filter (fun (s : Morphology.CVSlot) => decide s.IsC) t.slots).length
Instances For
t.isFinalSlot i asserts that i is the final slot position.
Equations
- t.isFinalSlot i = (i + 1 = t.length)
Instances For
The slot at position i, if in range.
Instances For
The positions of the C-slots, in order.
Equations
Instances For
The positions of the V-slots, in order.
Equations
Instances For
The tier a melody element on one end of an association line belongs to: the consonantal root, the vocalism, or affixal material. Tiers are morphologically defined ([McC81]) — one melody per morpheme class.
- root : AssocSource
The consonantal root tier.
- vocalism : AssocSource
The vocalic melody tier.
- affix : AssocSource
An affixal tier ([Fau26]'s intruders are sister-exponent affixal material in this sense).
Instances For
Equations
- Morphology.instDecidableEqAssocSource 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
- Morphology.instReprAssocSource = { reprPrec := Morphology.instReprAssocSource.repr }
A single melody-to-slot association line ([McC81]).
melodyIndex indexes into the melody named by source; defaults to .root
so ordinary root associations stay terse.
- source : AssocSource
The tier the associated melody element lives on.
- melodyIndex : ℕ
The index of the melody element on its tier.
- slotIndex : ℕ
The index of the template slot.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Morphology.instReprAssociation = { reprPrec := Morphology.instReprAssociation.repr }
A consonantal root, a vocalism, and affixal material matched to a
template by a list of association lines. Different candidate realizations
of the same morpheme combination are different TemplateMatch values
sharing everything but associations; gemination is one melody index
associated to several slots.
- root : ConsonantalRoot α
The consonantal root.
- vocalism : List α
The vocalic melody.
- affix : List α
The affixal material.
- template : CVTemplate
The template.
- associations : List Association
The association lines.
Instances For
Equations
- Morphology.instReprTemplateMatch = { reprPrec := Morphology.instReprTemplateMatch.repr }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
The melody of a tier.
Equations
Instances For
The segment an association line contributes, if its index is in range.
Equations
- m.segmentAt a = (m.melody a.source)[a.melodyIndex]?
Instances For
The surface segments of the match: each slot contributes the segment of its first association line; a slot with no association receives no phonetic realization ([McC81]).
Equations
- m.spellout = List.filterMap (fun (i : ℕ) => (List.find? (fun (x : Morphology.Association) => x.slotIndex == i) m.associations).bind m.segmentAt) (List.range m.template.length)
Instances For
The C-slot positions not filled by any association.
Equations
- m.unfilledCSlots = List.filter (fun (i : ℕ) => !m.associations.any fun (x : Morphology.Association) => x.slotIndex == i) m.template.cSlots
Instances For
m.allCSlotsFilled asserts that every C-slot is filled by some
association line.
Equations
- m.allCSlotsFilled = (m.unfilledCSlots = [])
Instances For
m.OrderedOn s asserts that the association lines from tier s do not
cross: distinct melody elements associate to slots in melody order
([Gol76]'s no-crossing condition, within one tier).
Equations
- m.OrderedOn s = ∀ a ∈ m.associations, ∀ b ∈ m.associations, a.source = s → b.source = s → a.melodyIndex < b.melodyIndex → a.slotIndex < b.slotIndex
Instances For
Equations
- m.instDecidableAllCSlotsFilled = m.unfilledCSlots.instDecidableEqNil
Equations
- m.instDecidableInBounds = List.decidableBAll (fun (a : Morphology.Association) => a.slotIndex < m.template.length ∧ a.melodyIndex < (m.melody a.source).length) m.associations
Equations
A match with no associations spells out to nothing.
Interpretation into the autosegmental substrate #
The link set of tier s, in the two-layer coordinates of
Phonology/Autosegmental/NonCrossing.lean: one (melodyIndex, slotIndex)
pair per association line from s.
Equations
- m.links s = (List.map (fun (a : Morphology.Association) => (a.melodyIndex, a.slotIndex)) (List.filter (fun (x : Morphology.Association) => x.source == s) m.associations)).toFinset
Instances For
m.SlotUnique s asserts that no slot hosts two distinct melody elements
of tier s — [McC81]'s prohibition against many-to-one
associations.
Equations
- m.SlotUnique s = ∀ a ∈ m.associations, ∀ b ∈ m.associations, a.source = s → b.source = s → a.slotIndex = b.slotIndex → a.melodyIndex = b.melodyIndex
Instances For
Equations
A tier is OrderedOn iff its link set is non-crossing in the sense of
the autosegmental substrate and one-to-one per slot: [Gol76]'s
No-Crossing Constraint plus [McC81]'s prohibition against
many-to-one associations.