The metrical grid #
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 Liberman and Prince's (1977) Relative Prominence Projection Rule:
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,
Hayes 1995 §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);Marks.isContinuous_iffreads it column by column.Grid.isCulminative_of_forall_lt/Grid.IsCulminative.eq_of_eq_peak— a strict unique maximum is culminative, and a culminative grid has one peak column.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.
References #
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 is a list of rows of head-marks, bottom row first.
Equations
- Prosody.Marks = List (List Bool)
Instances For
A metrical grid ([Hay95b] §3.2) records 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 records 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 #
Whether one row is a submask of the row below.
Equations
- Prosody.Marks.rowSubmask upper lower = (upper.zip lower).all fun (p : Bool × Bool) => !p.1 || p.2
Instances For
The Continuous Column Constraint ([Pri83]; [Hay95b] §3.4.2 (9)) says that no column has a gap. It is 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
Read column by column, continuity says that a mark in a row sits over a mark in the row below.
The head-marked grid: the marked-grid algebra #
Forgetting the marking gives 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 is one column of height 1, on its own head-spine.
Equations
- Prosody.MarkedGrid.cell x = [{ terminal := x, height := 1, onSpine := true }]
Instances For
In the head-projection step of the RPPR ([LP77]) a head edge raises the head by one grid mark, bumping every head-spine column.
Equations
Instances For
Across a weak edge heights freeze and the head-spine marking is dropped.
Equations
Instances For
On one edge of the descent a head edge projects and 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 #
The prominence peak is the height of the tallest column.
Equations
- g.peak = List.foldr max 0 g
Instances For
Every column is at most the peak.
The peak is bounded by any common bound on the columns.
Every column height, read with default 0, is at most the peak.
A grid is culminative ([LP77]; [Hay95b]) when exactly one column is
tallest. This is strictly stronger than having a unique head terminal (IsHeaded), since two
columns can tie.
Equations
- g.IsCulminative = (List.countP (fun (x : ℕ) => x == g.peak) g = 1)
Instances For
Equations
- g.instDecidableIsCulminative = id inferInstance
A column strictly taller than every other is the unique peak.
Two columns at the peak of a culminative grid are the same column.
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 ([Hay95b] §3.4.2).
The RPPR projection #
One RPPR step pairs the node's label with its grid, so a parent can read the head flag off each child.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The Relative Prominence Projection Rule ([LP77]) is a homomorphism
Tree → MarkedGrid. A σ-leaf is one cell, and 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]) are the σ-leaves reached from the root by all head edges.
Equations
Instances For
The head terminals' prominences are 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];
[Hay95b]), free from Grid.rows_isContinuous, since 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.level = Level.syl) : 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
By 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 height-1 core of the transport story: its column
heights are 2 at the head σ and 1 elsewhere, so the grid peaks at 2.
By 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;
[Hay95b] §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, since it forgets constituency. A σ parsed under a foot and the same σ left bare render to the same grid ([Hay95b] §3.8).
Recursion can break culminativity. A word recursively dominating another word, each heading its own σ, has two equally tall columns and 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 [Hay95b] §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 height 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]), so 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.