Directional constraints as position-indexed blocks #
[Lam22d]'s directional constraint evaluation, realized in the canonical
constraint substrate. A directional constraint maps each candidate to a per-position
violation vector compared lexicographically (Eisner 2000; [Lam22d]). The key
observation ([Lam22d] §1.3) is that "a locus at position i relates to one at
i+1 exactly as a higher-ranked constraint relates to a lower one … violation vectors
are ordered lexicographically, which is exactly how candidates are ordered with respect
to an entire constraint set in OT". So a directional constraint with single-segment
loci over a length-preserving GEN is a position-indexed block of binary
constraints, spliced into a ranking and compared under the canonical ViolationProfile
lex order (Core.Optimization.Evaluation.lexLE_ofFn) — no new mechanism beyond the
CON/ViolationProfile substrate already present.
directionalBlock n locus is that block: at each position i < n it flags whether
locus i holds. Splice it into a ranking forward for left-to-right evaluation (⇒),
or .reverse for right-to-left (⇐) — "the positions are reversed in the violation
vector" ([Lam22d] §1.3, Fig 1.9).
Main definitions #
directionalBlock— the position-indexed block of binary constraints.
Consumers #
Tone.starFloatBlock—*FLOATdirectional float deletion ([McPL26]).Lamont2022c.parseSigmaBlock—Parse(σ)directional footing ([Lam22b]).
Scope #
This covers the single-segment-loci, length-preserving case — both current consumers (a floating tone / an unfooted syllable is a single position, and neither GEN changes the position count). [Lam22d]'s general formulation additionally handles multi-segment loci (the opposite-edge projection that rules out "locus folding", §2.3) and length-changing GEN (step-relative positions, fn. 10); those are deferred until a consumer exercises them.
A directional constraint with single-segment loci over length-preserving GEN
([Lam22d]): the position-indexed block of binary constraints i ↦ ⟦locus i⟧,
for positions i < n. Spliced into a ranking and compared under the canonical lex
profile this is directional EVAL — ⇒ (left-to-right) for the forward block, ⇐ for
.reverse. The block's i-th coordinate is exactly the directional violation vector's
i-th entry, so the spliced profile equals the directional one
(Core.Optimization.Evaluation.lexLE_ofFn).
Equations
- Constraints.directionalBlock n locus = List.map (fun (i : Fin n) => Constraints.Constraint.binary (locus i)) (List.finRange n)