Documentation

Mathlib.Computability.ContextFreeGrammar

Context-Free Grammars #

This file contains the definition of a context-free grammar, which is a grammar that has a single nonterminal symbol on the left-hand side of each rule.

We restrict nonterminals of a context-free grammar to Type because universe polymorphism would be cumbersome and unnecessary; we can always restrict a context-free grammar to the finitely many nonterminal symbols that are referred to by its finitely many rules.

Main definitions #

Main theorems #

structure ContextFreeRule (T : Type u_1) (N : Type u_2) :
Type (max u_1 u_2)

Rule that rewrites a single nonterminal to any string (a list of symbols).

  • input : N

    Input nonterminal a.k.a. left-hand side.

  • output : List (Symbol T N)

    Output string a.k.a. right-hand side.

Instances For
    theorem ContextFreeRule.ext {T : Type u_1} {N : Type u_2} {x y : ContextFreeRule T N} (input : x.input = y.input) (output : x.output = y.output) :
    x = y
    theorem ContextFreeRule.ext_iff {T : Type u_1} {N : Type u_2} {x y : ContextFreeRule T N} :
    x = y โ†” x.input = y.input โˆง x.output = y.output
    @[implicit_reducible]
    instance instDecidableEqContextFreeRule {Tโœ : Type u_1} {Nโœ : Type u_2} [DecidableEq Tโœ] [DecidableEq Nโœ] :
    DecidableEq (ContextFreeRule Tโœ Nโœ)
    def instDecidableEqContextFreeRule.decEq {Tโœ : Type u_1} {Nโœ : Type u_2} [DecidableEq Tโœ] [DecidableEq Nโœ] (xโœ xโœยน : ContextFreeRule Tโœ Nโœ) :
    Decidable (xโœ = xโœยน)
    Instances For
      def instReprContextFreeRule.repr {Tโœ : Type u_1} {Nโœ : Type u_2} [Repr Tโœ] [Repr Nโœ] :
      ContextFreeRule Tโœ Nโœ โ†’ โ„• โ†’ Std.Format
      Instances For
        @[implicit_reducible]
        instance instReprContextFreeRule {Tโœ : Type u_1} {Nโœ : Type u_2} [Repr Tโœ] [Repr Nโœ] :
        Repr (ContextFreeRule Tโœ Nโœ)
        structure ContextFreeGrammar (T : Type u_1) :
        Type (max 1 u_1)

        Context-free grammar that generates words over the alphabet T (a type of terminals).

        Instances For
          inductive ContextFreeRule.Rewrites {T : Type u_1} {N : Type u_2} (r : ContextFreeRule T N) :
          List (Symbol T N) โ†’ List (Symbol T N) โ†’ Prop

          Inductive definition of a single application of a given context-free rule r to a string u; r.Rewrites u v means that the r sends u to v (there may be multiple such strings v).

          Instances For
            theorem ContextFreeRule.Rewrites.exists_parts {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} (hr : r.Rewrites u v) :
            โˆƒ (p : List (Symbol T N)) (q : List (Symbol T N)), u = p ++ [Symbol.nonterminal r.input] ++ q โˆง v = p ++ r.output ++ q
            theorem ContextFreeRule.rewrites_of_exists_parts {T : Type u_1} {N : Type u_2} (r : ContextFreeRule T N) (p q : List (Symbol T N)) :
            r.Rewrites (p ++ [Symbol.nonterminal r.input] ++ q) (p ++ r.output ++ q)
            theorem ContextFreeRule.rewrites_iff {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} :
            r.Rewrites u v โ†” โˆƒ (p : List (Symbol T N)) (q : List (Symbol T N)), u = p ++ [Symbol.nonterminal r.input] ++ q โˆง v = p ++ r.output ++ q

            Rule r rewrites string u is to string v iff they share both a prefix p and postfix q such that the remaining middle part of u is the input of r and the remaining middle part of u is the output of r.

            theorem ContextFreeRule.Rewrites.nonterminal_input_mem {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} :
            r.Rewrites u v โ†’ Symbol.nonterminal r.input โˆˆ u
            theorem ContextFreeRule.Rewrites.append_left {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} (hvw : r.Rewrites u v) (p : List (Symbol T N)) :
            r.Rewrites (p ++ u) (p ++ v)

            Add extra prefix to context-free rewriting.

            theorem ContextFreeRule.Rewrites.append_right {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} (hvw : r.Rewrites u v) (p : List (Symbol T N)) :
            r.Rewrites (u ++ p) (v ++ p)

            Add extra postfix to context-free rewriting.

            def ContextFreeGrammar.Produces {T : Type u_1} (g : ContextFreeGrammar T) (u v : List (Symbol T g.NT)) :

            Given a context-free grammar g and strings u and v g.Produces u v means that one step of a context-free transformation by a rule from g sends u to v.

            Instances For
              @[reducible, inline]
              abbrev ContextFreeGrammar.Derives {T : Type u_1} (g : ContextFreeGrammar T) :
              List (Symbol T g.NT) โ†’ List (Symbol T g.NT) โ†’ Prop

              Given a context-free grammar g and strings u and v g.Derives u v means that g can transform u to v in some number of rewriting steps.

              Instances For
                def ContextFreeGrammar.Generates {T : Type u_1} (g : ContextFreeGrammar T) (s : List (Symbol T g.NT)) :

                Given a context-free grammar g and a string s g.Generates s means that g can transform its initial nonterminal to s in some number of rewriting steps.

                Instances For

                  The language (set of words) that can be generated by a given context-free grammar g.

                  Instances For
                    @[simp]
                    theorem ContextFreeGrammar.mem_language_iff {T : Type u_1} (g : ContextFreeGrammar T) (w : List T) :
                    w โˆˆ g.language โ†” g.Derives [Symbol.nonterminal g.initial] (List.map Symbol.terminal w)

                    A given word w belongs to the language generated by a given context-free grammar g iff g can derive the word w (wrapped as a string) from the initial nonterminal of g in some number of steps.

                    theorem ContextFreeGrammar.Produces.single {T : Type u_1} {g : ContextFreeGrammar T} {v w : List (Symbol T g.NT)} (hvw : g.Produces v w) :
                    g.Derives v w
                    theorem ContextFreeGrammar.Derives.trans {T : Type u_1} {g : ContextFreeGrammar T} {u v w : List (Symbol T g.NT)} (huv : g.Derives u v) (hvw : g.Derives v w) :
                    g.Derives u w
                    theorem ContextFreeGrammar.Derives.trans_produces {T : Type u_1} {g : ContextFreeGrammar T} {u v w : List (Symbol T g.NT)} (huv : g.Derives u v) (hvw : g.Produces v w) :
                    g.Derives u w
                    theorem ContextFreeGrammar.Produces.trans_derives {T : Type u_1} {g : ContextFreeGrammar T} {u v w : List (Symbol T g.NT)} (huv : g.Produces u v) (hvw : g.Derives v w) :
                    g.Derives u w
                    theorem ContextFreeGrammar.Derives.eq_or_head {T : Type u_1} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} (huw : g.Derives u w) :
                    u = w โˆจ โˆƒ (v : List (Symbol T g.NT)), g.Produces u v โˆง g.Derives v w
                    theorem ContextFreeGrammar.derives_iff_eq_or_head {T : Type u_1} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} :
                    g.Derives u w โ†” u = w โˆจ โˆƒ (v : List (Symbol T g.NT)), g.Produces u v โˆง g.Derives v w
                    theorem ContextFreeGrammar.Derives.eq_or_tail {T : Type u_1} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} (huw : g.Derives u w) :
                    w = u โˆจ โˆƒ (v : List (Symbol T g.NT)), g.Derives u v โˆง g.Produces v w
                    theorem ContextFreeGrammar.derives_iff_eq_or_tail {T : Type u_1} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} :
                    g.Derives u w โ†” w = u โˆจ โˆƒ (v : List (Symbol T g.NT)), g.Derives u v โˆง g.Produces v w
                    theorem ContextFreeGrammar.Produces.append_left {T : Type u_1} {g : ContextFreeGrammar T} {v w : List (Symbol T g.NT)} (hvw : g.Produces v w) (p : List (Symbol T g.NT)) :
                    g.Produces (p ++ v) (p ++ w)

                    Add extra prefix to context-free producing.

                    theorem ContextFreeGrammar.Produces.append_right {T : Type u_1} {g : ContextFreeGrammar T} {v w : List (Symbol T g.NT)} (hvw : g.Produces v w) (p : List (Symbol T g.NT)) :
                    g.Produces (v ++ p) (w ++ p)

                    Add extra postfix to context-free producing.

                    theorem ContextFreeGrammar.Derives.append_left {T : Type u_1} {g : ContextFreeGrammar T} {v w : List (Symbol T g.NT)} (hvw : g.Derives v w) (p : List (Symbol T g.NT)) :
                    g.Derives (p ++ v) (p ++ w)

                    Add extra prefix to context-free deriving.

                    theorem ContextFreeGrammar.Derives.append_right {T : Type u_1} {g : ContextFreeGrammar T} {v w : List (Symbol T g.NT)} (hvw : g.Derives v w) (p : List (Symbol T g.NT)) :
                    g.Derives (v ++ p) (w ++ p)

                    Add extra postfix to context-free deriving.

                    theorem ContextFreeGrammar.Produces.exists_nonterminal_input_mem {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} (hguv : g.Produces u v) :
                    โˆƒ r โˆˆ g.rules, Symbol.nonterminal r.input โˆˆ u
                    theorem ContextFreeGrammar.derives_nonterminal {T : Type u_1} {g : ContextFreeGrammar T} {t : g.NT} (hgt : โˆ€ r โˆˆ g.rules, r.input โ‰  t) (s : List (Symbol T g.NT)) (hs : s โ‰  [Symbol.nonterminal t]) :
                    def Language.IsContextFree {T : Type u_1} (L : Language T) :

                    Context-free languages are defined by context-free grammars.

                    Instances For
                      def ContextFreeRule.reverse {T : Type u_1} {N : Type u_2} (r : ContextFreeRule T N) :

                      Rules for a grammar for a reversed language.

                      Instances For
                        @[simp]
                        theorem ContextFreeRule.reverse_comp_reverse {T : Type u_1} {N : Type u_2} :
                        reverse โˆ˜ reverse = id
                        theorem ContextFreeRule.reverse_injective {T : Type u_1} {N : Type u_2} :
                        Function.Injective reverse
                        theorem ContextFreeRule.reverse_surjective {T : Type u_1} {N : Type u_2} :
                        Function.Surjective reverse
                        theorem ContextFreeRule.Rewrites.reverse {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} :
                        r.Rewrites u v โ†’ r.reverse.Rewrites u.reverse v.reverse
                        theorem ContextFreeRule.rewrites_reverse {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} :
                        r.reverse.Rewrites u.reverse v.reverse โ†” r.Rewrites u v
                        @[simp]
                        theorem ContextFreeRule.rewrites_reverse_comm {T : Type u_1} {N : Type u_2} {r : ContextFreeRule T N} {u v : List (Symbol T N)} :
                        r.reverse.Rewrites u v โ†” r.Rewrites u.reverse v.reverse

                        Grammar for a reversed language.

                        Instances For
                          theorem ContextFreeGrammar.produces_reverse {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} :
                          g.reverse.Produces u.reverse v.reverse โ†” g.Produces u v
                          theorem ContextFreeGrammar.Produces.reverse {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} :
                          g.Produces u v โ†’ g.reverse.Produces u.reverse v.reverse

                          Alias of the reverse direction of ContextFreeGrammar.produces_reverse.

                          @[simp]
                          theorem ContextFreeGrammar.produces_reverse_comm {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} :
                          g.reverse.Produces u v โ†” g.Produces u.reverse v.reverse
                          theorem ContextFreeGrammar.Derives.reverse {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} (hg : g.Derives u v) :
                          g.reverse.Derives u.reverse v.reverse
                          theorem ContextFreeGrammar.derives_reverse {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} :
                          g.reverse.Derives u.reverse v.reverse โ†” g.Derives u v
                          @[simp]
                          theorem ContextFreeGrammar.derives_reverse_comm {T : Type u_1} {g : ContextFreeGrammar T} {u v : List (Symbol T g.NT)} :
                          g.reverse.Derives u v โ†” g.Derives u.reverse v.reverse
                          theorem ContextFreeGrammar.generates_reverse {T : Type u_1} {g : ContextFreeGrammar T} {u : List (Symbol T g.NT)} :
                          g.reverse.Generates u.reverse โ†” g.Generates u
                          theorem ContextFreeGrammar.Generates.reverse {T : Type u_1} {g : ContextFreeGrammar T} {u : List (Symbol T g.NT)} :
                          g.Generates u โ†’ g.reverse.Generates u.reverse

                          Alias of the reverse direction of ContextFreeGrammar.generates_reverse.

                          @[simp]
                          theorem ContextFreeGrammar.generates_reverse_comm {T : Type u_1} {g : ContextFreeGrammar T} {u : List (Symbol T g.NT)} :
                          g.reverse.Generates u โ†” g.Generates u.reverse

                          The class of context-free languages is closed under reversal.