The metrical grid #
[LP77] [Pri83] [Hay95a] [HV87] [IM09]
The metrical grid is the prominence dual of the prosodic word: a column of marks over each syllable, taller standing for greater relative prominence (primary > secondary > unstressed). This file is organised as a small tower of objects, each adding structure to the plain grid and each connected to the plainer one below by a forgetful map:
Marks rendered rows of marks; the Continuous Column Constraint lives here
↑ rows (Prince 1983's autonomous grid)
Grid column heights — the pure rhythmic grid
↑ toGrid (add the head terminal)
MarkedGrid a grid whose columns carry the head-spine (Liberman & Prince's head terminals)
↑ project (the RPPR)
Tree the bracketed grid — brackets at all layers ([hayes-1995] §3.5)
The projection Grid.project is the Relative Prominence Projection Rule ([LP77]):
a homomorphism from the tree into the head-marked grid, built from a small algebra
(cell/juxtapose/promote/clear). The grid readers (columns, terminals, headTerminals,
headHeights) are the forgetful maps out of it. What the forgetful map onto the pure grid drops is
theorem-shaped: constituency (Grid.ofTree_not_injective; the grid underdetermines bracketing,
[Hay95a] §3.8) and, under recursion, order-invariant culminativity
(Grid.not_culminative_under_recursion).
Main definitions #
Grid/Grid.peak/Grid.IsCulminative— the pure grid (column heights) and its invariants.Marks/Marks.IsContinuous/Grid.rows— the rendered grid and the Continuous Column Constraint, which holds for any rendered grid by construction.MarkedGrid/Grid.project— the head-marked grid and the RPPR projection from a tree.Tree.columns/Tree.headTerminals/Tree.headHeights/Tree.IsHeaded— the grid readers.
Main results #
Grid.ofTree_isContinuous— the Continuous Column Constraint, by construction (free).Grid.peak_toProsTree— head-preservation for a foot (its grid peaks at the head σ).Tree.headHeights_eq_peak— on a non-recursive headed word the head terminal's height is the grid peak: metrical primary stress is the tallest column.Grid.ofTree_not_injective/Grid.not_culminative_under_recursion— what the projection forgets: constituency, and order-invariant culminativity under recursion.Grid.head_below_peak_under_recursion/Grid.head_below_peak_unlayered— the peak can desert the head terminal under recursion or without Layeredness.
The tower carriers #
The four objects of the tower (see the module header): the rendered Marks, the pure Grid, and
the head-marked grid MarkedGrid built from Columns. Operations follow, one namespace each.
A rendered metrical grid: rows of head-marks, bottom row first.
Equations
- Prosody.Marks = List (List Bool)
Instances For
A metrical grid ([Hay95a] §3.2): the beat count (column height) over each position, left to right. Absolute heights carry no significance; only relative prominence does.
Equations
- Prosody.Grid = List ℕ
Instances For
One column of a marked grid: the σ-leaf it sits over, its mark count (height), and whether it
lies on the current head-spine (the head terminal so far, [LP77]).
- terminal : α
The σ-leaf under this column.
- height : ℕ
The column height = number of grid marks.
- onSpine : Bool
Whether this column is (so far) the head terminal.
Instances For
A grid whose columns carry the head-spine (the head terminals, [LP77]) — the
pure grid plus a head marking. It deliberately does not record the full bracketing (that is
Tree; Grid.ofTree_not_injective is the honest statement that heights lose it).
Equations
- Prosody.MarkedGrid α = List (Prosody.Column α)
Instances For
Marks: the Continuous Column Constraint #
The Continuous Column Constraint ([Pri83]; [Hay95a] §3.4.2 (9)): no column has a gap. A violable predicate on an arbitrary rendered grid.
Equations
- m.IsContinuous = List.IsChain (fun (lower upper : List Bool) => Prosody.Marks.rowSubmask✝ upper lower = true) m
Instances For
Equations
- m.instDecidableIsContinuous = id inferInstance
The head-marked grid: the marked-grid algebra #
Forget the marking: the underlying pure grid of column heights.
Equations
- b.toGrid = List.map (fun (x : Prosody.Column α) => x.height) b
Instances For
The terminals under the columns, left to right.
Equations
- b.terminals = List.map (fun (x : Prosody.Column α) => x.terminal) b
Instances For
The head-spine columns' heights — the head terminals' prominences.
Equations
- b.headHeights = List.map (fun (x : Prosody.Column α) => x.height) (List.filter (fun (x : Prosody.Column α) => x.onSpine) b)
Instances For
The head-spine terminals — the head terminals.
Equations
- b.headTerminals = List.map (fun (x : Prosody.Column α) => x.terminal) (List.filter (fun (x : Prosody.Column α) => x.onSpine) b)
Instances For
A single terminal: one column of height 1, on its own head-spine.
Equations
- Prosody.MarkedGrid.cell x = [{ terminal := x, height := 1, onSpine := true }]
Instances For
The head-projection step of the RPPR ([LP77]): a head edge raises the head by one grid mark — bump every head-spine column.
Equations
Instances For
A weak edge: heights freeze, the head-spine marking is dropped.
Equations
Instances For
One edge of the descent: a head edge projects, any other clears the spine.
Equations
- Prosody.MarkedGrid.edge isHead b = if isHead = true then b.promote else b.clear
Instances For
The algebra of the marked grid #
Grid: peak, the RPPR projection, and the readers #
The pure grid: peak, culminativity, rendering #
Every column is at most the peak.
Culminativity ([LP77]; [Hay95a]): exactly one column is tallest. Note this
is strictly stronger than having a unique head terminal (IsHeaded) — two columns can tie.
Equations
- g.IsCulminative = (List.countP (fun (x : ℕ) => x == g.peak) g = 1)
Instances For
Equations
- g.instDecidableIsCulminative = id inferInstance
The Continuous Column Constraint is free. Every rendered grid satisfies it, because a column is a solid stack of marks by construction — continuity is the shape of a histogram, not a theorem about trees ([Hay95a] §3.4.2).
The RPPR projection #
The Relative Prominence Projection Rule ([LP77]) as a homomorphism
Tree → MarkedGrid: a σ-leaf is one cell; any other node juxtaposes its children, projecting
across head edges and clearing the spine across the rest.
Equations
- t.project = (RoseTree.fold Prosody.Tree.projectStep✝ t).2
Instances For
Reading the grid off a tree (the forgetful maps) #
The head terminals ([LP77]): the σ-leaves reached from the root by all head edges.
Equations
Instances For
The head terminals' prominences: the live cells' heights.
Equations
- t.headHeights = t.project.headHeights
Instances For
A tree is headed when it has a unique head terminal.
Equations
- t.IsHeaded = (List.length t.headHeights = 1)
Instances For
Equations
- t.instDecidableIsHeaded = id inferInstance
The metrical grid of a tree, as stacked rows.
Equations
- Prosody.Grid.ofTree t = t.columns.rows
Instances For
Grid.ofTree always satisfies the Continuous Column Constraint ([Pri83];
[Hay95a]) — free from Grid.rows_isContinuous: a projected grid is a histogram.
The reader recursions #
Each reader is a homomorphism out of the marked-grid algebra, so on a node it is the juxtaposition
of the children's readings, projected across head edges. These fuse project_node with the algebra
once, so the downstream proofs never re-walk the fold.
The head terminals compute the head-terminal relation #
leaf is a head terminal of t, reached from the root by an all-head descent.
- leaf {a : Constituent} (ha : a.isSyl = true) : IsHeadTerminal (RoseTree.node a []) (RoseTree.node a [])
- head {a : Constituent} {cs : List (RoseTree Constituent)} {c leaf : Tree} : c ∈ cs → (RoseTree.value c).isHead = true → c.IsHeadTerminal leaf → IsHeadTerminal (RoseTree.node a cs) leaf
Instances For
Soundness of headTerminals ([LP77]): every head terminal the projection
computes really is one — reached from the root by an all-head descent. (The decide-verified
lists give the converse concretely, so the full iff is not needed.)
Head-preservation: the foot commuting square #
Reading a Foot's grid recovers its head — the depth-1 core of the transport story: its column
heights are 2 at the head σ and 1 elsewhere, so the grid peaks at 2.
Head-preservation for a foot ([LP77]): projecting a foot's prosodic tree
recovers its metrical grid — the commuting square columns ∘ toProsTree = toGrid.
A foot's grid peaks at 2 — its head σ carries the primary mark ([LP77]).
What the grid forgets #
The forgetful map onto the pure grid is one-way: it drops constituency (ofTree_not_injective;
[Hay95a] §3.8 argues for bracketing precisely because the grid underdetermines it) and, under
recursion, order-invariant culminativity (not_culminative_under_recursion).
The grid render is not injective — it forgets constituency: a σ parsed under a foot and the same σ left bare render to the same grid ([Hay95a] §3.8).
Recursion can break culminativity: a word recursively dominating another word, each heading its own σ, has two equally tall columns — no unique peak.
The word peak is the head terminal #
On a non-recursive headed word the grid peak is the head terminal ([LP77]): metrical primary stress is the tallest column. Recursion is the sole obstruction, and — this being [Hay95a] §3.4.2(C)'s "the higher grid mark may only be assigned to a syllable that already bears stress" — the peak sits atop a foot head.
Head-terminal heights are a sublist of the columns.
Every head-terminal height is at most the peak.
An edge column is either a child column or a head height of the edge — the algebraic split that replaces the foot-internal case analysis.
In a word every column is ≤ 2 unless it is a head-terminal height — the genuine non-recursion
content, now one algebraic split (mem_toGrid_edge) plus the depth bound.
In a word the head terminal sits below ω, so its height is at least 2.
On a non-recursive headed word, the head terminal is the grid peak ([LP77]): metrical primary stress is the tallest column.
Under recursion the peak can desert the head terminal, even when culminative ([IM09] for recursive ω; the peak≠head-terminal consequence is a property of this model).
Without Layeredness the peak can desert the head terminal too.