Definite languages #
A language L is k-definite when membership is decided by the last k
symbols of a word [RP11] [Lam22a]: any two words sharing their
length-k suffix are L-equivalent. Reverse k-definite (RD_k) is the dual
through the length-k prefix, and generalized k-definite (Lambert's ℒℐ_k)
tests prefix and suffix jointly [Lam26].
Main definitions #
Subregular.EdgeandSubregular.Edge.takeAt— a string edge and its length-ksubstring (right= suffix,left= prefix).Language.IsDefinite,Language.IsReverseDefinite,Language.IsGeneralizedDefinite— membership factoring through the suffix, prefix, and joint edge projections.Language.IsFiniteOrCofinite— Lambert's𝒩:Lor its complement is finite.
Main theorems #
Language.IsDefinite.toIsGeneralizedDefiniteandLanguage.IsReverseDefinite.toIsGeneralizedDefinite—D_k, RD_k ⊆ ℒℐ_k.Language.isFiniteOrCofinite_iff_exists_isDefinite_and_isReverseDefinite— over a finite alphabet,𝒩 = 𝒟 ∩ 𝒦[Pin]: a language is finite-or-cofinite iff it is definite and reverse-definite.
Edge projections #
Equations
- Subregular.instDecidableEqEdge x✝ y✝ = if h : x✝.ctorIdx = y✝.ctorIdx then isTrue ⋯ else isFalse ⋯
Equations
- Subregular.instReprEdge.repr Subregular.Edge.left prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Subregular.Edge.left")).group prec✝
- Subregular.instReprEdge.repr Subregular.Edge.right prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Subregular.Edge.right")).group prec✝
Instances For
Equations
- Subregular.instReprEdge = { reprPrec := Subregular.instReprEdge.repr }
Take the length-k substring at this edge of xs: left is the length-k
prefix List.take, right the length-k suffix List.rtake. Strings shorter
than k are returned in full.
Equations
- Subregular.Edge.left.takeAt k xs = List.take k xs
- Subregular.Edge.right.takeAt k xs = xs.rtake k
Instances For
An edge substring has length min k xs.length.
Edge-bridge identities #
A long word can be bridged to one sharing its right k-suffix and a prescribed
left k'-prefix; these are the combinatorial core of 𝒩 = 𝒟 ∩ 𝒦.
The definite family #
A language is k-definite (right-edge): membership factors through the
length-k suffix.
Equations
- L.IsDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) (Subregular.Edge.right.takeAt k)
Instances For
A language is reverse k-definite (left-edge): membership factors through
the length-k prefix.
Equations
- L.IsReverseDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) (Subregular.Edge.left.takeAt k)
Instances For
A language is generalized k-definite (Lambert's ℒℐ_k): membership factors
through the joint length-k prefix and suffix [Lam26].
Equations
- L.IsGeneralizedDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) fun (w : List α) => (Subregular.Edge.left.takeAt k w, Subregular.Edge.right.takeAt k w)
Instances For
Generalized definiteness in two-hypothesis form: equal length-k prefix and
suffix give L-equivalence (unpacking the joint-projection invariance).
Definiteness in membership form: a word and its length-k suffix are
L-equivalent (single-edge analogue of isGeneralizedDefinite_iff_edges).
A language is finite-or-cofinite (Lambert's 𝒩): L or its complement is
finite (equivalently L.Finite ∨ L ∈ Filter.cofinite).
Equations
- L.IsFiniteOrCofinite = (Set.Finite L ∨ Set.Finite Lᶜ)
Instances For
Constructive view: a language carved out by a permitted length-k suffix set
is k-definite (this is the e of Function.factorsThrough_iff).
Mirror for the left edge: a permitted length-k prefix set is reverse-definite.
Reverse duality #
Reverse duality: reverse-k-definite is k-definite of the reversed language.
Inclusions into ℒℐ_k #
D_k ⊆ ℒℐ_k: the suffix alone determines membership, so the joint prefix-and-suffix test does too.
RD_k ⊆ ℒℐ_k: symmetric, via the prefix.
𝒩 = 𝒟 ∩ 𝒦 #
A language whose membership is constant off a finite set s is finite-or-cofinite:
either some word outside s lies in L (forcing Lᶜ ⊆ s) or none does (forcing
L ⊆ s). The reusable engine behind the reverse direction of 𝒩 = 𝒟 ∩ 𝒦.
Forward direction of 𝒩 = 𝒟 ∩ 𝒦: a finite-or-cofinite language is both
k-definite and reverse-k'-definite for some k, k'.
Reverse direction of 𝒩 = 𝒟 ∩ 𝒦 (finite alphabet): if L is both
k-definite and reverse-k'-definite, it is finite-or-cofinite. For words of
length ≥ k + k' membership is constant (bridge argument), so either the long
words are all in L (Lᶜ bounded) or none are (L bounded).
Pin's 𝒩 = 𝒟 ∩ 𝒦 (finite alphabet): a language over a finite alphabet is
finite-or-cofinite iff it is k-definite for some k and reverse-k'-definite for
some k'.