Documentation

Linglib.Core.Computability.Subregular.Language.Definite

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 #

Main theorems #

Edge projections #

Which edge of the string the definite test inspects. right gives classical D_k (final substring); left gives RD_k (initial substring).

Instances For
    @[implicit_reducible]
    instance Subregular.instDecidableEqEdge :
    DecidableEq Edge
    Equations
    def Subregular.instReprEdge.repr :
    EdgeStd.Format
    Equations
    Instances For
      @[implicit_reducible]
      Equations
      def Subregular.Edge.takeAt {α : Type u_1} (e : Edge) (k : ) (xs : List α) :
      List α

      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
      Instances For
        @[simp]
        theorem Subregular.Edge.takeAt_left {α : Type u_1} (k : ) (xs : List α) :
        left.takeAt k xs = List.take k xs
        @[simp]
        theorem Subregular.Edge.takeAt_right {α : Type u_1} (k : ) (xs : List α) :
        right.takeAt k xs = xs.rtake k
        theorem Subregular.Edge.length_takeAt {α : Type u_1} (e : Edge) (k : ) (xs : List α) :
        (e.takeAt k xs).length = min k xs.length

        An edge substring has length min k xs.length.

        theorem Subregular.Edge.takeAt_of_length_le {α : Type u_1} (e : Edge) {k : } {xs : List α} (h : xs.length k) :
        e.takeAt k xs = xs

        For a short string the edge substring is the whole string.

        theorem Subregular.Edge.takeAt_left_append_of_le_length {α : Type u_1} {k : } (p rest : List α) (h : k p.length) :
        left.takeAt k (p ++ rest) = left.takeAt k p

        The left-k-prefix of p ++ rest is that of p, when k ≤ p.length.

        theorem Subregular.Edge.takeAt_right_append_of_le_length {α : Type u_1} {k : } (x rest : List α) (h : k rest.length) :
        right.takeAt k (x ++ rest) = right.takeAt k rest

        The right-k-suffix of x ++ rest is that of rest, when k ≤ rest.length.

        theorem Subregular.Edge.takeAt_idem {α : Type u_1} (e : Edge) (k : ) (xs : List α) :
        e.takeAt k (e.takeAt k xs) = e.takeAt k xs

        takeAt k is idempotent: its output already has length ≤ k.

        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 #

        def Language.IsDefinite {α : Type u_1} (L : Language α) (k : ) :

        A language is k-definite (right-edge): membership factors through the length-k suffix.

        Equations
        Instances For
          def Language.IsReverseDefinite {α : Type u_1} (L : Language α) (k : ) :

          A language is reverse k-definite (left-edge): membership factors through the length-k prefix.

          Equations
          Instances For
            def Language.IsGeneralizedDefinite {α : Type u_1} (L : Language α) (k : ) :

            A language is generalized k-definite (Lambert's ℒℐ_k): membership factors through the joint length-k prefix and suffix [Lam26].

            Equations
            Instances For
              theorem Language.isGeneralizedDefinite_iff_edges {α : Type u_1} {k : } {L : Language α} :
              L.IsGeneralizedDefinite k ∀ ⦃a b : List α⦄, Subregular.Edge.left.takeAt k a = Subregular.Edge.left.takeAt k bSubregular.Edge.right.takeAt k a = Subregular.Edge.right.takeAt k b(a L b L)

              Generalized definiteness in two-hypothesis form: equal length-k prefix and suffix give L-equivalence (unpacking the joint-projection invariance).

              theorem Language.isDefinite_iff_mem_takeAt {α : Type u_1} {k : } {L : Language α} :
              L.IsDefinite k ∀ (w : List α), w L Subregular.Edge.right.takeAt k w L

              Definiteness in membership form: a word and its length-k suffix are L-equivalent (single-edge analogue of isGeneralizedDefinite_iff_edges).

              def Language.IsFiniteOrCofinite {α : Type u_1} (L : Language α) :

              A language is finite-or-cofinite (Lambert's 𝒩): L or its complement is finite (equivalently L.Finite ∨ L ∈ Filter.cofinite).

              Equations
              Instances For
                theorem Language.isDefinite_setOf_right {α : Type u_1} (k : ) (P : Set (List α)) :
                IsDefinite {w : List α | Subregular.Edge.right.takeAt k w P} k

                Constructive view: a language carved out by a permitted length-k suffix set is k-definite (this is the e of Function.factorsThrough_iff).

                theorem Language.isReverseDefinite_setOf_left {α : Type u_1} (k : ) (P : Set (List α)) :
                IsReverseDefinite {w : List α | Subregular.Edge.left.takeAt k w P} k

                Mirror for the left edge: a permitted length-k prefix set is reverse-definite.

                Reverse duality #

                theorem Language.isReverseDefinite_iff_isDefinite_reverse {α : Type u_1} {k : } {L : Language α} :
                L.IsReverseDefinite k L.reverse.IsDefinite k

                Reverse duality: reverse-k-definite is k-definite of the reversed language.

                Inclusions into ℒℐ_k #

                theorem Language.IsDefinite.toIsGeneralizedDefinite {α : Type u_1} {k : } {L : Language α} (h : L.IsDefinite k) :

                D_k ⊆ ℒℐ_k: the suffix alone determines membership, so the joint prefix-and-suffix test does too.

                theorem Language.IsReverseDefinite.toIsGeneralizedDefinite {α : Type u_1} {k : } {L : Language α} (h : L.IsReverseDefinite k) :

                RD_k ⊆ ℒℐ_k: symmetric, via the prefix.

                𝒩 = 𝒟 ∩ 𝒦 #

                theorem Language.isFiniteOrCofinite_of_eventually_constant {α : Type u_1} {L : Language α} {s : Set (List α)} (hs : s.Finite) (h : as, bs, a L b L) :

                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 𝒩 = 𝒟 ∩ 𝒦.

                theorem Language.IsFiniteOrCofinite.exists_isDefinite_and_isReverseDefinite {α : Type u_1} {L : Language α} (h : L.IsFiniteOrCofinite) :
                (∃ (k : ), L.IsDefinite k) ∃ (k' : ), L.IsReverseDefinite k'

                Forward direction of 𝒩 = 𝒟 ∩ 𝒦: a finite-or-cofinite language is both k-definite and reverse-k'-definite for some k, k'.

                theorem Language.isFiniteOrCofinite_of_isDefinite_and_isReverseDefinite {α : Type u_1} [Finite α] {L : Language α} (h : (∃ (k : ), L.IsDefinite k) ∃ (k' : ), L.IsReverseDefinite 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).

                theorem Language.isFiniteOrCofinite_iff_exists_isDefinite_and_isReverseDefinite {α : Type u_1} [Finite α] {L : Language α} :
                L.IsFiniteOrCofinite (∃ (k : ), L.IsDefinite k) ∃ (k' : ), L.IsReverseDefinite k'

                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'.