Definite languages #
This file defines the definite languages and their relatives. A language L is k-definite
when membership of a word is decided by its last k letters: any two words with the same
length-k suffix are both in L or both outside it. Perles, Rabin and Shamir develop the theory
of these languages; reverse k-definite languages are the mirror image through the length-k
prefix, and generalized k-definite languages are decided by the prefix and suffix together.
Main definitions #
Language.IsDefinite,Language.IsReverseDefinite,Language.IsGeneralizedDefinite: membership factors through the suffix, the prefix, and both.Language.IsFiniteOrCofinite:Lor its complement is finite.
Main results #
Language.IsDefinite.toIsGeneralizedDefinite,Language.IsReverseDefinite.toIsGeneralizedDefinite: definite and reverse definite languages are generalized definite.Language.IsDefinite.isRegular,Language.IsReverseDefinite.isRegular,Language.IsGeneralizedDefinite.isRegular: over a finite alphabet all three are regular.Language.isFiniteOrCofinite_iff_exists_isDefinite_and_isReverseDefinite: over a finite alphabet, a language is finite or cofinite exactly when it is both definite and reverse definite.
References #
Edge-bridge identities #
Two long words are bridged by a word sharing the length-k suffix of the first and the
length-k' prefix of the second. This is the combinatorial step behind the characterization of
the finite and cofinite languages.
The definite family #
A language is k-definite when membership factors through the length-k suffix.
Equations
- L.IsDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) (Edge.right.takeAt k)
Instances For
A language is reverse k-definite when membership factors through the length-k
prefix.
Equations
- L.IsReverseDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) (Edge.left.takeAt k)
Instances For
A language is generalized k-definite when membership factors through the length-k
prefix and suffix together.
Equations
- L.IsGeneralizedDefinite k = Function.FactorsThrough (fun (x : List α) => x ∈ L) fun (w : List α) => (Edge.left.takeAt k w, Edge.right.takeAt k w)
Instances For
A language is generalized k-definite exactly when words with equal length-k prefix and
suffix are both in it or both outside it.
A language is k-definite exactly when every word is in it just when its length-k suffix
is.
A language is reverse k-definite exactly when every word is in it just when its length-k
prefix is.
A language is finite or cofinite when it or its complement is finite.
Equations
- L.IsFiniteOrCofinite = (Set.Finite L ∨ Set.Finite Lᶜ)
Instances For
The words whose length-k suffix lies in a given set form a k-definite language.
The words whose length-k prefix lies in a given set form a reverse k-definite
language.
Monotonicity in the window #
A k-definite language is k'-definite for every k' ≥ k.
A reverse k-definite language is reverse k'-definite for every k' ≥ k.
A generalized k-definite language is generalized k'-definite for every k' ≥ k.
Affix languages #
The words beginning with xs form a reverse definite language with window xs.length.
The words ending in xs form a definite language with window xs.length.
Reverse duality #
A language is reverse k-definite exactly when its reversal is k-definite.
Inclusions into the generalized definite languages #
A k-definite language is generalized k-definite.
A reverse k-definite language is generalized k-definite.
Regularity #
A definite language over a finite alphabet is regular.
A reverse definite language over a finite alphabet is regular.
A generalized definite language over a finite alphabet is regular.
Finite and cofinite languages #
A language whose membership is constant off a finite set s is finite or cofinite, since
either Lᶜ ⊆ s or L ⊆ s.
A language whose words have length at most N is (N + 1)-definite.
A language whose words have length at most N is reverse (N + 1)-definite.
A finite or cofinite language is definite and reverse definite.
Over a finite alphabet, a language that is both definite and reverse definite is finite or
cofinite, since membership is constant on words of length at least k + k'.
Over a finite alphabet, a language is finite or cofinite exactly when it is definite and reverse definite.