Forbidden-pair TSL_2 grammars #
A tier-based strictly 2-local schema: for a
forbidden-pair relation R : α → α → Prop and tier predicate p,
TierStrictlyLocalGrammar.ofForbiddenPairs R p bans any string whose tier projection has an
adjacent pair (a, b) with R a b. The canonical instance is the OCP
(R := (· = ·)); OCP-Feature and single-tier harmony (with p carrying
blocking/transparency) are other choices of R.
Main definitions #
Subregular.TierStrictlyLocalGrammar.ofForbiddenPairs R p: the TSL_2 grammar above.Subregular.countAdjacent R xs: count ofR-related adjacent pairs inxs.
Main results #
Subregular.mem_ofForbiddenPairs_language_iff_filter_isChain: membership reduces to anIsChain (¬ R · ·)check on the tier-projected string.Subregular.mem_ofForbiddenPairs_language_map_iff: a word's image under a letter map is in the language exactly when the word is in the language of the pulled-back grammar.
Implementation notes #
Out of scope (they need a richer-than-segmental alphabet): *Lapse/*Clash (SL_2 over a syllable alphabet) and *Coda (SL_1). Similarity-graded and interval-conditioned (ITSL) harmony, and cross-tier dependencies (MTSL), also fall outside this single-tier constructor.
References #
The forbidden 2-factors induced by R are the pairs [some a, some b] with R a b.
Equations
- Subregular.forbiddenPairs R = {f : Augmented α | ∃ (a : α) (b : α), R a b ∧ f = [some a, some b]}
Instances For
A pair is clean for R unless both symbols are some and R-related, so none is
vacuously clean (CleanPair.isBoundaryVacuous).
Equations
- Subregular.CleanPair R (some a) (some b) = ¬R a b
- Subregular.CleanPair R x✝¹ x✝ = True
Instances For
CleanPair R is boundary-vacuous: none satisfies it on either side.
A list has no forbidden 2-factor iff it is a chain for CleanPair R.
The TSL_2 grammar banning tier-adjacent pairs satisfying R has tier p and permits
everything but forbiddenPairs R.
Equations
- Subregular.TierStrictlyLocalGrammar.ofForbiddenPairs R p = { tier := p, decTier := inst✝, permitted := (Subregular.forbiddenPairs R)ᶜ }
Instances For
Membership in ofForbiddenPairs R p reduces to an IsChain (¬ R · ·) check
on the tier-projected string — the characterization all forbidden-pair
constraints inherit.
The language depends only on which symbols project and on R between on-tier symbols.
A word's image under a letter-to-letter map is in a forbidden-pair language exactly when the word is in the language of the grammar with the pulled-back relation and tier.
Adjacent-pair counting #
countAdjacent is the violation-count companion of the membership view; the
optimality-theoretic Constraint.forbidPairs R is countAdjacent R itself.
Count of adjacent pairs (a, b) in xs with R a b.
Equations
- Subregular.countAdjacent R [] = 0
- Subregular.countAdjacent R [head] = 0
- Subregular.countAdjacent R (a :: b :: rest) = (if R a b then 1 else 0) + Subregular.countAdjacent R (b :: rest)
Instances For
Counting adjacent pairs commutes with a relabelling that preserves and reflects the relation.
countAdjacent R xs = 0 iff xs is a chain for ¬ R · ·.
API around ofForbiddenPairs #
Membership in (ofForbiddenPairs R p).language is decidable, via the IsChain
characterization.
Equations
- Subregular.decidableMemOfForbiddenPairsLang R p w = decidable_of_iff (List.IsChain (fun (a b : α) => ¬R a b) (List.filter (fun (x : α) => decide (p x)) w)) ⋯
The empty string is in every forbidden-pair language.
Forbidding more pairs shrinks the language, so R ≤ R' gives
language R' ≤ language R.
If no pair is forbidden (R = ⊥), the language is universal.
If no symbol is on the tier (p = ⊥), the language is universal.
With no tier filtering (p = ⊤) the language is the SL_2 case, in which no two
adjacent symbols of the raw string are R-related.
Forbidding R₁ ∨ R₂ on one tier is conjunctive membership in the two
languages. (Cross-tier composition needs MTSL, not this constructor.)
In lattice form, language (R₁ ∨ R₂) = lang R₁ ⊓ lang R₂ (mem_language_R_sup_iff).
Design boundary: non-monotonicity in the tier predicate #
(ofForbiddenPairs R p).language is neither monotone nor antitone in the tier
predicate p (lang_p_not_monotone/lang_p_not_antitone below): which segments
project is a substantive commitment, not just a monotone refinement.