Langlib

Langlib.Automata.Pushdown.Equivalence.ContextFree.PDAToCFG

Pushdown automaton to context-free grammar #

This file proves the automaton-to-grammar direction of the PDA = CFG equivalence. From a PDA M it builds the grammar G M whose nonterminals (N) are the triples N.single q Z p and bounded lists N.list q α p, together with a start symbol N.start. The triple q Z p derives exactly the inputs along which M goes from state q to state p while net-popping the single stack symbol Z; the bound max_push M on stack pushes keeps the rule set finite. The main result cfg_of_pda proves (G M).language = M.acceptsByEmptyStack, via derives_of_reachesIn and reachesIn_of_derivesLeftmostIn (both by strong induction on the step count).

@[reducible, inline]
abbrev PDA_to_CFG.AllStackPushes {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :
Set (List S)
Equations
Instances For
    @[reducible, inline]
    abbrev PDA_to_CFG.AllStackPushes' {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :
    Equations
    Instances For
      @[reducible, inline]
      abbrev PDA_to_CFG.max_push {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :
      Equations
      Instances For
        inductive PDA_to_CFG.N {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :
        Instances For
          @[reducible, inline]
          abbrev PDA_to_CFG.N.IsAllowed {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} :
          N MProp
          Equations
          Instances For
            @[reducible, inline]
            abbrev PDA_to_CFG.AllowedNonterminals {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} :
            Set (N M)
            Equations
            Instances For
              theorem PDA_to_CFG.push_le_max_push {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (α : List S) (q : Q) (Z : S) (a : T) (h : α Prod.snd '' M.transition_fun q a Z) :
              theorem PDA_to_CFG.push_le_max_push' {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (α : List S) (q : Q) (Z : S) (h : α Prod.snd '' M.transition_fun' q Z) :
              @[reducible, inline]
              abbrev PDA_to_CFG.epsilon_rule {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q : Q) :
              Equations
              Instances For
                @[reducible, inline]
                abbrev PDA_to_CFG.compute_rule {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q p : Q) (a : T) (Z : S) :
                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  @[reducible, inline]
                  abbrev PDA_to_CFG.compute_rule' {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q p : Q) (Z : S) :
                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    @[reducible, inline]
                    abbrev PDA_to_CFG.split_rule {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q₁ : Q) (n : N M) :
                    Equations
                    Instances For
                      @[reducible, inline]
                      abbrev PDA_to_CFG.start_rule {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q : Q) :
                      Equations
                      Instances For
                        @[reducible, inline]
                        abbrev PDA_to_CFG.RuleSet {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} :
                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          theorem PDA_to_CFG.ruleSet_finite {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} :
                          @[reducible, inline]
                          abbrev PDA_to_CFG.rules {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} :
                          Equations
                          Instances For
                            @[reducible, inline]
                            abbrev PDA_to_CFG.G {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :
                            Equations
                            Instances For
                              theorem PDA_to_CFG.produces_split {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} (q q₁ p : Q) {α : List S} {Z : S} (h : (Z :: α).length max_push M) :
                              theorem PDA_to_CFG.produces_compute {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {q q₁ p : Q} {α : List S} {a : T} {Z : S} (h : (q₁, α) M.transition_fun q a Z) :
                              theorem PDA_to_CFG.produces_compute' {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {q q₁ p : Q} {α : List S} {Z : S} (h : (q₁, α) M.transition_fun' q Z) :
                              theorem PDA_to_CFG.derives_of_reachesIn {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {γ : List S} {q p : Q} {x : List T} {n : } ( : γ.length max_push M) (h : PDA.ReachesIn n { state := q, input := x, stack := γ } { state := p, input := [], stack := [] }) :
                              theorem PDA_to_CFG.derivation_empty {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {n : } {x : List T} {q p : Q} (h : (G M).DerivesLeftmostIn [Symbol.nonterminal (N.list q [] p)] (List.map Symbol.terminal x) n) :
                              q = p x = []
                              theorem PDA_to_CFG.produces_cons {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {q p : Q} {Z : S} {γ : List S} {u : List (Symbol T (N M))} (h : (G M).ProducesLeftmost [Symbol.nonterminal (N.list q (Z :: γ) p)] u) :
                              ∃ (q₁ : Q), u = [Symbol.nonterminal (N.single q Z q₁), Symbol.nonterminal (N.list q₁ γ p)]
                              theorem PDA_to_CFG.produces_single {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {q p : Q} {Z : S} {u v : List (Symbol T (N M))} (h : (G M).ProducesLeftmost (Symbol.nonterminal (N.single q Z p) :: v) u) :
                              (∃ (α : List S) (q₀ : Q) (a : T), (q₀, α) M.transition_fun q a Z u = Symbol.terminal a :: Symbol.nonterminal (N.list q₀ α p) :: v) ∃ (α : List S) (q₀ : Q), (q₀, α) M.transition_fun' q Z u = Symbol.nonterminal (N.list q₀ α p) :: v
                              theorem PDA_to_CFG.reachesIn_of_derivesLeftmostIn {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] {M : PDA Q T S} {γ : List S} {q p : Q} {x : List T} {n : } ( : γ.length max_push M) (h : (G M).DerivesLeftmostIn [Symbol.nonterminal (N.list q γ p)] (List.map Symbol.terminal x) n) :
                              PDA.Reaches { state := q, input := x, stack := γ } { state := p, input := [], stack := [] }
                              theorem PDA_to_CFG.cfg_of_pda {Q T S : Type} [Fintype Q] [Fintype T] [Fintype S] (M : PDA Q T S) :