Langlib

Langlib.Grammars.Unrestricted.InverseHomomorphism

Grammar Inverse Homomorphism #

Given a grammar g over terminal alphabet Γ and a map encode : T → Γ (with [Fintype T]), we construct a grammar GrammarPullback.pullbackGrammar g encode over terminal alphabet T such that:

w ∈ grammar_language (pullbackGrammar g encode) ↔ w.map encode ∈ grammar_language g

This is the inverse-homomorphism construction used to change the terminal alphabet of a grammar along an encoding function.

Key results #

Symbol maps #

def GrammarPullback.liftSym {T Γ NT : Type} :
symbol Γ NTsymbol T (NT Γ)

Lift symbols from g (over Γ) to the pullback grammar (over T). Terminals become decoding nonterminals; nonterminals are tagged.

Equations
Instances For
    def GrammarPullback.projSym {T Γ NT : Type} (encode : TΓ) :
    symbol T (NT Γ)symbol Γ NT

    Project symbols from the pullback grammar back to g. Terminals in T are mapped via encode; nonterminals are untagged.

    Equations
    Instances For
      theorem GrammarPullback.projSym_liftSym {T Γ NT : Type} (encode : TΓ) (s : symbol Γ NT) :
      projSym encode (liftSym s) = s
      theorem GrammarPullback.map_projSym_map_liftSym {T Γ NT : Type} (encode : TΓ) (l : List (symbol Γ NT)) :

      Pullback grammar construction #

      def GrammarPullback.liftRule {T Γ NT : Type} (r : grule Γ NT) :
      grule T (NT Γ)

      Lift a grammar rule from g to the pullback grammar.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        def GrammarPullback.decodeRule {T Γ NT : Type} (encode : TΓ) (t : T) :
        grule T (NT Γ)

        A decode rule: (Sum.inr (encode t)) → [terminal t].

        Equations
        Instances For
          noncomputable def GrammarPullback.pullbackGrammar {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] :

          The pullback grammar: given grammar g over Γ and encode : T → Γ, produces a grammar over T that generates w iff g generates w.map encode.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For

            Forward direction: pullback generates ⟹ g generates encoded #

            theorem GrammarPullback.transforms_proj {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (sf₁ sf₂ : List (symbol T (g.nt Γ))) (h : grammar_transforms (pullbackGrammar g encode) sf₁ sf₂) :
            grammar_derives g (List.map (projSym encode) sf₁) (List.map (projSym encode) sf₂)
            theorem GrammarPullback.derives_proj {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (sf₁ sf₂ : List (symbol T (g.nt Γ))) (h : grammar_derives (pullbackGrammar g encode) sf₁ sf₂) :
            grammar_derives g (List.map (projSym encode) sf₁) (List.map (projSym encode) sf₂)
            theorem GrammarPullback.pullback_generates_implies_original {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (w : List T) (h : w grammar_language (pullbackGrammar g encode)) :

            Backward direction: g generates encoded ⟹ pullback generates #

            theorem GrammarPullback.pullback_transforms_of_transforms {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (sf₁ sf₂ : List (symbol Γ g.nt)) (h : grammar_transforms g sf₁ sf₂) :
            theorem GrammarPullback.pullback_derives_of_derives {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (sf₁ sf₂ : List (symbol Γ g.nt)) (h : grammar_derives g sf₁ sf₂) :
            theorem GrammarPullback.decode_all {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (w : List T) :
            theorem GrammarPullback.original_generates_implies_pullback {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (w : List T) (h : List.map encode w grammar_language g) :

            Main theorem #

            theorem GrammarPullback.pullbackGrammar_language {T Γ : Type} (g : grammar Γ) (encode : TΓ) [Fintype T] (w : List T) :

            Pullback grammar language: The pullback grammar generates w iff g generates w.map encode.