Documentation

Linglib.Phonology.Tone.Basic

Tonal Root Nodes and Subtonal Features #

Tone is paradigmatic. A Tonal Root Node (TRN) is a bundle of subtonal features [±upper] and [±raised] ([Yip80] [Pul86]), each of which links to a TBU (mora, syllable). This file follows [Lio22a]'s reformulation of register-tier geometry: the four tier organisation (subtonal features → TRN → TBU) is shared with [Sni99], but the features themselves are paradigmatic targets, not syntagmatic shifts.

Main definitions #

Implementation notes #

Why paradigmatic, not syntagmatic #

[Sni99]'s h/l features are defined both paradigmatically (specifying register half) and syntagmatically ("higher / lower than the preceding register"). [Lio22a] argues this dual definition is overloaded: the same feature does double duty as a representational primitive and as a phonological process trigger. Switching to purely paradigmatic [±upper]/[±raised] separates the two roles — the features are the representation, the operations (spreading, OCP merger, deletion) are the processes.

Geometry #

    [±upper]    Register-half subtonal feature tier
    [±raised]   Within-register subtonal feature tier
       ○        Tonal Root Node (TRN) — bundles both features
       |
      TBU       Tone-bearing unit (mora / syllable)

A TRN is the structural node that gathers a [±upper] value and a [±raised] value and links them to a TBU. Either or both features may be underspecified (none), with surface values filled in by default.

Subtonal features #

inductive Tone.Subtonal :

The two paradigmatic subtonal feature dimensions ([Lio22a] ex. 51, after [Yip80], [Pul86]).

  • upper: which register half (upper / lower)
  • raised: which target within the register (higher / lower)

Each takes a value in Bool: true ≡ +, false ≡ -. A subtonal feature is none (underspecified), some true (+), or some false (-).

Instances For
    @[implicit_reducible]
    Equations
    @[implicit_reducible]
    Equations
    def Tone.instReprSubtonal.repr :
    SubtonalStd.Format
    Equations
    Instances For
      @[implicit_reducible]
      Equations

      Tonal root node #

      structure Tone.TRN :

      A Tonal Root Node: a structural node that bundles a [±upper] and a [±raised] subtonal-feature value and links them to a TBU.

      Either or both fields may be none (underspecified). For the register-only Drubea/Numèè system the upper field is uniformly none; for full 3-tone Laal both fields are usually specified.

      Implemented as a structure rather than Subtonal → Option Bool so that DecidableEq and Repr derive automatically (and BEq follows from DecidableEq, below) and so that decide-based proofs over concrete TRN literals reduce cleanly. The bundle view is recovered by TRN.toBundle.

      • upper : Option Bool
      • raised : Option Bool
      Instances For
        @[implicit_reducible]
        instance Tone.instDecidableEqTRN :
        DecidableEq TRN
        Equations
        def Tone.instDecidableEqTRN.decEq (x✝ x✝¹ : TRN) :
        Decidable (x✝ = x✝¹)
        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
          def Tone.instReprTRN.repr :
          TRNStd.Format
          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            @[implicit_reducible]
            instance Tone.instReprTRN :
            Repr TRN
            Equations
            @[implicit_reducible]
            instance Tone.instInhabitedTRN :
            Inhabited TRN
            Equations
            @[implicit_reducible]
            instance Tone.TRN.instBEq :
            BEq TRN

            Boolean equality on TRN as decidable equality, so that LawfulBEq holds. Required for simp-based reasoning over (t == t).

            Equations
            instance Tone.TRN.instLawfulBEq :
            LawfulBEq TRN
            @[match_pattern]

            The empty / fully underspecified TRN. In the Drubea/Numèè register- only system, this is the registerless mora.

            Equations
            Instances For
              @[match_pattern]

              A floating [-raised] subtonal feature, no [upper] value. In the register-only system this is the downstep TRN: it lowers the running register baseline.

              Equations
              Instances For
                @[match_pattern]

                A floating [+raised] subtonal feature, no [upper] value. In the register-only system this is the upstep TRN — used by pre-downstep h-epenthesis ([Lio25]).

                Equations
                Instances For

                  The High tone of Laal-style 3-tone systems: [+upper, -raised] ([Lio22a] ex. 51). Highest pitch.

                  Equations
                  Instances For

                    The Mid tone of Laal-style 3-tone systems: [-upper, +raised] ([Lio22a] ex. 51). M is one of the four [±u, ±r] combinations, derived from the binary subtonal features — not a primitive enum constructor.

                    Equations
                    Instances For

                      The Low tone of Laal-style 3-tone systems: [-upper, -raised] ([Lio22a] ex. 51). Lowest pitch.

                      Equations
                      Instances For

                        The fourth combination [+upper, +raised]unattested in Laal, where it is the gap of the subtonal system ([Lio22a] ex. 51: "Missing from this system is the subtonal specification [+upper, +raised]"). Provided for completeness; an attested 4-tone language or a different 3-tone gap would use this.

                        Equations
                        Instances For
                          def Tone.TRN.toBundle (t : TRN) :
                          SubtonalOption Bool

                          View a TRN as a Subtonal → Option Bool (the parametric foundation in Features.Bundle). The bundle algebra (merge, assimilate, delete, set, refines) is then directly available via this view.

                          Equations
                          Instances For
                            def Tone.TRN.ofBundle (b : SubtonalOption Bool) :

                            Recover a TRN from a generic subtonal-feature bundle. Inverse of toBundle.

                            Equations
                            Instances For

                              Pitch realisation #

                              def Tone.TRN.pitchEffect (t : TRN) :

                              Syntagmatic register shift contributed by a TRN, used by the terracing realisation realizePitch. Reads only the [raised] subtonal feature: [-raised] lowers, [+raised] raises, underspecified is inert.

                              This is not the paradigmatic interpretation of [raised] ([Lio22a] §5.1). It is the realisation pattern attested in register-only systems like Drubea and Numèè ([Lio25]), where each [-raised] triggers a downstep operation that resets the register baseline.

                              Equations
                              Instances For
                                def Tone.realizePitch :
                                List TRNList

                                Terracing realisation: realise a TRN sequence as a sequence of pitch levels, where each [-raised] cumulatively lowers the baseline ([Sni99] [Lio25]).

                                Used for register-only systems (Drubea, Numèè) and for catathesis in Japanese / English intonation ([BP86]). For the paradigmatic Laal-style realisation see TRN.absolutePitch.

                                Defined by direct case-split on the [raised] value so that realizePitch n [TRN.empty, …] reduces to n :: … definitionally (the alternative level + t.pitchEffect form does not reduce for opaque n : Int, since n + 0 = n is not definitional).

                                Equations
                                Instances For
                                  @[simp]
                                  theorem Tone.realizePitch_cons (level : ) (t : TRN) (rest : List TRN) :
                                  realizePitch level (t :: rest) = (level + t.pitchEffect) :: realizePitch (level + t.pitchEffect) rest

                                  A uniform cons rewrite for realizePitch in terms of pitchEffect.

                                  def Tone.pitchDeltas (ts : List TRN) :
                                  List

                                  Pitch deltas — the theory-primary view ([Sni99] [Lio25]). Cumulative register shifts produced by a TRN sequence, expressed as integer offsets from the start. There is no privileged "zero" pitch; only the differences are meaningful.

                                  Equations
                                  Instances For
                                    theorem Tone.realizePitch_eq_pitchDeltas_shift (n : ) (ts : List TRN) :
                                    realizePitch n ts = List.map (fun (x : ) => x + n) (pitchDeltas ts)

                                    realizePitch n ts is pitchDeltas ts shifted by the offset n.

                                    def Tone.realizePitchUtterance (level : ) :
                                    List TRNList

                                    Utterance-initial phonetic neutralisation: an utterance-initial [-raised] TRN is realised at the starting pitch (no preceding register to contrast with — [Lio25] §3.5, §4.5). The feature is not removed from the underlying form: it remains phonologically active for blocking pre-downstep h-epenthesis on itself and for feeding raising on a following registerless TRN.

                                    Equations
                                    Instances For

                                      Paradigmatic Laal-style pitch realisation ([Lio22a] §4). Pitch is computed from [upper] (×2) plus [raised] (×1), independently per TRN — no terracing, no register-baseline state.

                                      Unspecified features contribute 0. The four combinations give: H = 2, M = 1, L = 0, superHigh = 3 (Laal's gap).

                                      Equations
                                      Instances For

                                        Lionnet's 3-tone typology #

                                        The four classes of 3-tone system definable over the binary subtonal features [±upper]/[±raised] ([Lio22a] ex. 51): with four full specifications available, a 3-tone system realises three of them, and the unselected combination is the gap. The four-way classification by gap is a systematisation of Lionnet's binary-feature account (Laal itself has the [+upper, +raised] gap), not a typology the paper surveys.

                                        Instances For
                                          @[implicit_reducible]
                                          Equations
                                          @[implicit_reducible]
                                          Equations
                                          def Tone.instReprThreeToneGap.repr :
                                          ThreeToneGapStd.Format
                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For

                                            Laal's gap is [+upper, +raised] ([Lio22a] ex. 51).

                                            TBU and word-prosodic typology #

                                            inductive Tone.TBUKind :

                                            The prosodic domain that carries TRN specifications. In most tone languages this is the syllable; in Drubea and Numèè it is the mora ([Lio25]).

                                            Instances For
                                              @[implicit_reducible]
                                              instance Tone.instDecidableEqTBUKind :
                                              DecidableEq TBUKind
                                              Equations
                                              def Tone.instReprTBUKind.repr :
                                              TBUKindStd.Format
                                              Equations
                                              Instances For
                                                @[implicit_reducible]
                                                Equations

                                                Word-prosodic system types ([Hym06], enriched by [Lio25]).

                                                Tone systems split into tone-based (paradigmatic — full TRN contrasts) and register-based (only [raised] varies, with cumulative terracing realisation).

                                                Instances For
                                                  @[implicit_reducible]
                                                  Equations
                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  Instances For

                                                    Core definitional properties of downstep, following [Leb18b] as refined by [Lio25].

                                                    Properties (a)–(c) are definitional; (d)–(f) are cross-linguistic tendencies that need not hold in every system.

                                                    • affectsDomain : Bool

                                                      (a) Affects the entire prosodic domain, not just a single tone.

                                                    • changesRegister : Bool

                                                      (b) Changes the register for what follows.

                                                    • isCumulative : Bool

                                                      (c) Cumulative: multiple downsteps stack (unlimited in principle).

                                                    • uttInitialNeutral : Bool

                                                      (d) Utterance-initially, no phonetic contrast with undownstepped.

                                                    • characteristicallyAffectsH : Bool

                                                      (e) Characteristically affects H tones.

                                                    • functionsContrastively : Bool

                                                      (f) Functions contrastively (phonological, syntactic, morphophonological, or lexical).

                                                    Instances For
                                                      Equations
                                                      • One or more equations did not get rendered due to their size.
                                                      Instances For

                                                        Inventory of primitives in a phonological analysis ([Lio25]).

                                                        • underlyingPrimitives :
                                                        • postlexicalProcesses :
                                                        Instances For
                                                          Equations
                                                          • One or more equations did not get rendered due to their size.
                                                          Instances For
                                                            def Tone.instDecidableEqAnalysisInventory.decEq (x✝ x✝¹ : AnalysisInventory) :
                                                            Decidable (x✝ = x✝¹)
                                                            Equations
                                                            • One or more equations did not get rendered due to their size.
                                                            Instances For

                                                              Culminativity #

                                                              @[reducible, inline]
                                                              abbrev Tone.IsCulminative (ts : List TRN) :

                                                              Register culminativity: at most one [-raised] TRN per stem.

                                                              Holds for all native Drubea and Numèè stems ([Lio25] §3.10). The Lionnet 2022 framing: a stem contains at most one bundle whose [raised] value is some false.

                                                              Equations
                                                              Instances For

                                                                Postlexical operations #

                                                                def Tone.hEpenthesis :
                                                                List TRNList TRN

                                                                Pre-downstep h-epenthesis ([Lio25]): insert an upstep TRN immediately before a downstep, on a registerless host.

                                                                The rule fires when an empty (⟨none, none⟩) TRN is immediately followed by a downstep TRN (⟨none, some false⟩); the empty TRN is replaced by an upstep (⟨none, some true⟩). An underlying downstep blocks the rule on itself — that is the diagnostic that survives utterance-initial phonetic neutralisation.

                                                                Equations
                                                                Instances For
                                                                  def Tone.hEpenthesisSpread :
                                                                  List TRNList TRN

                                                                  Spreading h-epenthesis: raise all registerless TRNs in the sequence preceding a downstep, not just the immediately preceding one ([Lio25] §3.2). Models the abrupt-spreading variant.

                                                                  Equations
                                                                  Instances For

                                                                    Subtonal feature operations #

                                                                    def Tone.subtonalAssimilate (f : Subtonal) (src tgt : TRN) :

                                                                    Subtonal assimilation at feature f: the target TRN takes its value at f from the source TRN, leaving its other feature untouched. The Laal M-lowering rule ([Lio22a] §5.2) is subtonalAssimilate Subtonal.raised src tgt: a [-raised] value spreads from src to tgt, so a target M (⟨-u, +r⟩) becomes L (⟨-u, -r⟩) without altering its [upper] value.

                                                                    Equations
                                                                    Instances For
                                                                      def Tone.mergeTRN (t₁ t₂ : TRN) :

                                                                      Binary TRN merger ([Lio22a] ex. 53–54): merge two TRNs' subtonal features into one, taking each feature from the left TRN where it is specified and falling back to the right (Features.Bundle.merge). Models the autosegmental fusion of two associated tones ([Gol76]); the tier-level OCP merger that collapses a run of identical tones is OCP.collapse.

                                                                      Equations
                                                                      Instances For
                                                                        @[simp]
                                                                        theorem Tone.mergeTRN_self (t : TRN) :
                                                                        mergeTRN t t = t

                                                                        Merging a TRN with itself is the identity: mergeTRN is idempotent on equal tones.

                                                                        def Tone.dockFloating (f : Subtonal) (v : Bool) (t : TRN) :

                                                                        Floating-feature docking ([Lio22a] §5.3): a free [±f] subtonal feature docks onto a target TRN, overwriting whatever value it had at f. Used for the morphosyntactic [-raised] suffix in Laal that triggers M-lowering.

                                                                        Equations
                                                                        Instances For

                                                                          Verification: Laal subtonal identities #

                                                                          The Laal H/M/L tones are exactly three of the four binary [±u, ±r] combinations — the gap is superHigh.

                                                                          Paradigmatic pitch ordering: L < M < H < superHigh.

                                                                          M-lowering as [-raised] assimilation ([Lio22a] §5.2). When a [-raised] source assimilates onto an M target, the result is L: M's [+raised] is overwritten to [-raised], and its [-upper] is preserved.

                                                                          Critically, the [upper] feature is not changed — this is what makes the operation subtonal-level rather than full-tone replacement.

                                                                          The same operation has no effect when the source itself is M: assimilating [+raised] onto M leaves M unchanged.

                                                                          Floating [-raised] docking onto M produces L ([Lio22a] §5.3): the morphosyntactic suffix is a free floating feature that overwrites the target's [raised] value.

                                                                          Verification: Drubea/Numèè register-only realisation #

                                                                          Registerless sequences have uniform pitch.

                                                                          theorem Tone.downstep_lowers (n : ) :

                                                                          A single downstep lowers pitch by one step.

                                                                          theorem Tone.terracing (n : ) :
                                                                          realizePitch n [TRN.downstep, TRN.downstep, TRN.downstep] = [n - 1, n - 1 - 1, n - 1 - 1 - 1]

                                                                          Multiple downsteps produce cumulative terracing.

                                                                          Deltas-only view of three downsteps: pitch falls by 1, 2, 3 register steps from the start. No anchor required.

                                                                          Concrete terracing from offset 4 (mid-high on the 1–5 scale).

                                                                          h-epenthesis raises the registerless TRN before a downstep.

                                                                          h-epenthesis + realisation: the raised TRN is higher than baseline.

                                                                          An underlying downstep blocks h-epenthesis on itself: the rule only targets registerless TRNs immediately preceding a downstep. This is what the underlying initial downstep (preserved by realizePitchUtterance) buys us — the contrast /X ⁺Y/ (raises X) vs /⁺X ⁺Y/ (no raising on ⁺X) survives even when the initial X is utterance-initial and phonetically flat.

                                                                          Phonetic suppression of an utterance-initial downstep: the realized pitch sequence starts flat, indistinguishable from a registerless initial.

                                                                          The phonetic neutralisation is only utterance-initial: a non-initial downstep still drops pitch, even after the suppression rule fires.

                                                                          Underlying culminativity is preserved under utterance-initial suppression: an initial downstep still counts toward the stem-level [-raised] budget. The phonetic interface does not delete it.

                                                                          Culminativity: a single [-raised] is culminative.

                                                                          Non-culminativity: two [-raised] TRNs violate culminativity.

                                                                          Monotonicity (catathesis-blocking) #

                                                                          @[implicit_reducible]
                                                                          instance Tone.instPreorderTRN :
                                                                          Preorder TRN

                                                                          TRN order by syntagmatic pitch effect: t₁ ≤ t₂ iff t₁ is at least as lowering as t₂. Lifted from the Int order along TRN.pitchEffect (Preorder.lift) — a Preorder, not a PartialOrder, since TRNs sharing a [raised] value share a pitch effect.

                                                                          Equations
                                                                          @[implicit_reducible]
                                                                          instance Tone.instDecidableRelTRNLe :
                                                                          DecidableRel fun (x1 x2 : TRN) => x1 x2
                                                                          Equations
                                                                          theorem Tone.realizePitch_baseline_mono (ts : List TRN) {n m : } (h : n m) :
                                                                          List.Forall₂ (fun (x1 x2 : ) => x1 x2) (realizePitch n ts) (realizePitch m ts)

                                                                          Monotonicity of realizePitch in the baseline: a higher starting pitch produces pointwise higher output for any fixed TRN sequence.

                                                                          Structural basis for catathesis blocking ([BP86]): when an ip boundary resets the register, subsequent pitches are higher than if catathesis had continued from a compressed baseline.

                                                                          theorem Tone.realizePitch_mono {ts₁ ts₂ : List TRN} (hts : List.Forall₂ (fun (x1 x2 : TRN) => x1 x2) ts₁ ts₂) {n m : } (hnm : n m) :
                                                                          List.Forall₂ (fun (x1 x2 : ) => x1 x2) (realizePitch n ts₁) (realizePitch m ts₂)

                                                                          Full monotonicity of realizePitch: pointwise lowering features plus a lower baseline give pointwise lower output. Subsumes realizePitch_baseline_mono.