Tonal root nodes and subtonal features #
Tone is paradigmatic: a tonal root node (TRN) bundles the two subtonal features
[±upper] (which register half) and [±raised] (which target within it) of [Yip80] and
[Pul86], each possibly unspecified, and links to a tone-bearing unit. Following
[Lio22], the features are paradigmatic targets, not [Sni99]'s syntagmatic
shifts; the terracing reading of [raised] is Tone.Register.
Main definitions #
Subtonal,TRN— the two feature dimensions and the root node;TRN.bundleEquividentifies a root node with its feature bundleSubtonal → Option Bool.TRN.H,TRN.M,TRN.L,TRN.superHigh— the four full specifications;TRN.empty,TRN.downstep,TRN.upstep— the register-only nodes.TRN.assimilate,TRN.merge,TRN.dock— the feature operations, through the bundle.TBUKind,IsRegisterOnly— the tone-bearing unit and [Lio25]'s register-only inventories.
Equations
- Tone.instDecidableEqSubtonal x✝ y✝ = if h : x✝.ctorIdx = y✝.ctorIdx then isTrue ⋯ else isFalse ⋯
Equations
- Tone.instReprSubtonal = { reprPrec := Tone.instReprSubtonal.repr }
Equations
- Tone.instReprSubtonal.repr Tone.Subtonal.upper prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Tone.Subtonal.upper")).group prec✝
- Tone.instReprSubtonal.repr Tone.Subtonal.raised prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Tone.Subtonal.raised")).group prec✝
Instances For
Equations
- Tone.instInhabitedSubtonal = { default := Tone.instInhabitedSubtonal.default }
A tonal root node: a [±upper] and a [±raised] value, each possibly unspecified.
A structure rather than the bundle Subtonal → Option Bool, so that DecidableEq derives
and literals reduce; TRN.bundleEquiv is the bundle view.
- upper : Option Bool
- raised : Option Bool
Instances For
Equations
- Tone.instDecidableEqTRN.decEq { upper := a, raised := a_1 } { upper := b, raised := b_1 } = if h : a = b then h ▸ if h : a_1 = b_1 then h ▸ isTrue ⋯ else isFalse ⋯ else isFalse ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Tone.instReprTRN = { reprPrec := Tone.instReprTRN.repr }
Equations
- Tone.instInhabitedTRN = { default := Tone.instInhabitedTRN.default }
The fully unspecified node.
Equations
- Tone.TRN.empty = { upper := none, raised := none }
Instances For
A floating [-raised]: the downstep node of a register-only system.
Equations
- Tone.TRN.downstep = { upper := none, raised := some false }
Instances For
A floating [+raised]: the upstep node.
Equations
- Tone.TRN.upstep = { upper := none, raised := some true }
Instances For
High, [+upper, -raised] ([Lio22] ex. 51).
Equations
- Tone.TRN.H = { upper := some true, raised := some false }
Instances For
Mid, [-upper, +raised] ([Lio22] ex. 51).
Equations
- Tone.TRN.M = { upper := some false, raised := some true }
Instances For
Low, [-upper, -raised] ([Lio22] ex. 51).
Equations
- Tone.TRN.L = { upper := some false, raised := some false }
Instances For
The fourth specification [+upper, +raised]: the gap of Laal's three-tone system
([Lio22] ex. 51).
Equations
- Tone.TRN.superHigh = { upper := some true, raised := some true }
Instances For
The feature bundle of a node.
Equations
Instances For
The node of a feature bundle.
Equations
- Tone.TRN.ofBundle b = { upper := b Tone.Subtonal.upper, raised := b Tone.Subtonal.raised }
Instances For
A root node is its feature bundle.
Equations
- Tone.TRN.bundleEquiv = { toFun := Tone.TRN.toBundle, invFun := Tone.TRN.ofBundle, left_inv := Tone.TRN.ofBundle_toBundle, right_inv := Tone.TRN.toBundle_ofBundle }
Instances For
Subtonal assimilation at f: the target takes its value at f from the source,
its other feature untouched. Laal M-lowering ([Lio22] §5.2) is assimilate .raised:
a [-raised] value spreads onto M, [-upper, +raised], giving L.
Equations
- Tone.TRN.assimilate f src tgt = Tone.TRN.ofBundle (Function.update tgt.toBundle f (src.toBundle f))
Instances For
Merger of two nodes ([Lio22] ex. 53–54): each feature from the left node
where it is specified, else from the right — the fusion of two
associated tones ([Gol76]); the tier-level merger of a run of identical tones is
OCP.collapse.
Equations
- t₁.merge t₂ = Tone.TRN.ofBundle fun (f : Tone.Subtonal) => (t₁.toBundle f).or (t₂.toBundle f)
Instances For
Docking of a floating feature ([Lio22] §5.3): a free [±f] lands on a node,
overwriting its value at f.
Equations
- Tone.TRN.dock f v t = Tone.TRN.ofBundle (Function.update t.toBundle f (some v))
Instances For
Tone-bearing units and word-prosodic types #
Equations
- Tone.instDecidableEqTBUKind x✝ y✝ = if h : x✝.ctorIdx = y✝.ctorIdx then isTrue ⋯ else isFalse ⋯
Equations
- Tone.instReprTBUKind.repr Tone.TBUKind.mora prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Tone.TBUKind.mora")).group prec✝
- Tone.instReprTBUKind.repr Tone.TBUKind.syllable prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Tone.TBUKind.syllable")).group prec✝
Instances For
Equations
- Tone.instReprTBUKind = { reprPrec := Tone.instReprTBUKind.repr }
A register-only inventory ([Lio25]): no node specifies [upper], so only the
syntagmatic [raised] is contrastive. Lionnet's split of [Hym06]'s tone prototype —
register-based systems (Drubea, Numèè) against tone-based ones with paradigmatic [upper]
contrasts (Yoruba, Mandarin) and mixed ones (Paicî, Baga Pukur) — is read off the lexical
inventory rather than recorded.
Equations
- Tone.IsRegisterOnly ts = ∀ (t : Tone.TRN), t ∈ ts → t.upper = none
Instances For
Equations
- Tone.instDecidableIsRegisterOnly ts = List.decidableBAll (fun (t : Tone.TRN) => t.upper = none) ts