Non-crossing constraint for two-layer association lines #
A Finset (ι × κ) of links between two ordered tiers is non-crossing
when k₁ < k₂ → i₁ ≤ i₂ for any two links (k₁, i₁), (k₂, i₂) — i.e. the
index coordinates monovary, which in a two-layer drawing is exactly the
absence of crossing segments. This is the discrete-index
[Gol76] / [Sag86] No-Crossing Constraint and the canonical
filter on autosegmental GEN.
Main definitions #
IsNonCrossing links: the link set monovaries ([Preorder]-general).Crosses a b/IndexCrosses links p: two links cross;pcrosses some link already inlinks— the decidable GEN filter.
Main results #
isNonCrossing_insert_iff_not_indexCrosses: a candidate may be added iff it crosses nothing (IsNonCrossing.insert_of_not_indexCrossesis the GEN direction).isNonCrossing_image/IsNonCrossing.image_monotone:IsNonCrossingcommutes withFinset.image, and survives monotone reindexing of the upper coordinate.
Set-level non-crossing property (via mathlib MonovaryOn) #
The link set has no crossings: its two index coordinates monovary.
Equations
- Autosegmental.IsNonCrossing links = MonovaryOn Prod.snd Prod.fst ↑links
Instances For
IsNonCrossing in elementary form.
A pair is non-crossing iff its two links agree in tier- and backbone-order.
A subset of a non-crossing link set is non-crossing.
Inserting p keeps non-crossing iff p crosses no existing link: the
insert-algebra form, Set.pairwise_insert specialised to IsNonCrossing
via monovaryOn_insert.
Equations
- Autosegmental.instDecidableIsNonCrossingOfDecidableLTOfDecidableLE = decidable_of_iff (∀ l₁ ∈ links, ∀ l₂ ∈ links, l₁.1 < l₂.1 → l₁.2 ≤ l₂.2) ⋯
Reindexing along Finset.image #
IsNonCrossing transports across a Finset.image: the image link set is
non-crossing iff the index coordinates monovary after reindexing by f. The
Finset companion of monovaryOn_image, and the single place the definition
is unfolded against an image.
Pushing a non-crossing link set forward along a monotone map on the upper
(first) coordinate keeps it non-crossing: the autosegmental analogue of
SimpleGraph.map along a monotone vertex map. The upper index needs a
LinearOrder (the run-collapse domain is ℕ) so that ρ reflects <. Used to
lift planarity through the OCP run-collapse ρ (Autosegmental/Collapse.lean).
The crossing relation and the GEN filter #
Two links cross: as a pair they fail to be non-crossing (equivalently their
endpoints straddle in opposite tier- and backbone-order — crosses_iff).
Equations
- Autosegmental.Crosses a b = ¬Autosegmental.IsNonCrossing {a, b}
Instances For
p crosses some link already in links — the decidable GEN filter.
Equations
- Autosegmental.IndexCrosses links p = ∃ l ∈ links, Autosegmental.Crosses p l
Instances For
p crosses nothing iff it is pairwise non-crossing with every existing link.
Adding p keeps non-crossing iff it crosses no existing link: the GEN-filter
form of isNonCrossing_insert_iff.
GEN direction of isNonCrossing_insert_iff_not_indexCrosses.
IndexCrosses in elementary index-ordering form.
Link shift (the concatenation offset) #
The coordinate offset that places a morpheme's links past the preceding tiers under
concatenation ([JH15]). Shared by the bipartite Graph and the n-tier
MultiGraph, which apply it to their one / each tier-pair respectively.
Shift a link's two endpoints by (δ₁, δ₂).
Equations
- Autosegmental.shiftLink δ₁ δ₂ p = (p.1 + δ₁, p.2 + δ₂)
Instances For
Shifting a link set preserves non-crossing: shiftLink is a coordinatewise
order-embedding, so via isNonCrossing_image it preserves monovariance.