Langlib

Langlib.Automata.Pushdown.Basics.Leftmost

Leftmost Deriviations in Context-Free Gammars #

This file contains the definition of a leftmost deriviation. These are deriviations where in each rewriting step the leftmost nonterminal is replaced

Main Definitions #

Main Result #

inductive ContextFreeRule.RewritesLeftmost {T : Type uT} {N : Type uN} (r : ContextFreeRule T N) :
List (Symbol T N)List (Symbol T N)Prop
Instances For
    theorem ContextFreeRule.RewritesLeftmost.append_right {T : Type uT} {N : Type uN} {r : ContextFreeRule T N} {v w : List (Symbol T N)} (hr : r.RewritesLeftmost v w) (p : List (Symbol T N)) :
    r.RewritesLeftmost (v ++ p) (w ++ p)
    theorem ContextFreeRule.rewrites_leftmost_cons {T : Type uT} {N : Type uN} {r : ContextFreeRule T N} {x : Symbol T N} {v u : List (Symbol T N)} (h : r.RewritesLeftmost (x :: v) u) :
    (∃ (u₁ : List (Symbol T N)) (u₂ : List (Symbol T N)), u = u₁ ++ u₂ r.RewritesLeftmost [x] u₁ u₂ = v) ∃ (w₁ : List T) (u₂ : List (Symbol T N)), u = List.map Symbol.terminal w₁ ++ u₂ [x] = List.map Symbol.terminal w₁ r.RewritesLeftmost v u₂
    theorem ContextFreeRule.rewrites_leftmost_append {T : Type uT} {N : Type uN} {r : ContextFreeRule T N} {v₁ v₂ u : List (Symbol T N)} (h : r.RewritesLeftmost (v₁ ++ v₂) u) :
    (∃ (u₁ : List (Symbol T N)) (u₂ : List (Symbol T N)), u = u₁ ++ u₂ r.RewritesLeftmost v₁ u₁ u₂ = v₂) ∃ (w₁ : List T) (u₂ : List (Symbol T N)), u = List.map Symbol.terminal w₁ ++ u₂ v₁ = List.map Symbol.terminal w₁ r.RewritesLeftmost v₂ u₂
    theorem ContextFreeRule.rewrites_cons {T : Type uT} {N : Type uN} {r : ContextFreeRule T N} {x : Symbol T N} {v u : List (Symbol T N)} (h : r.Rewrites (x :: v) u) :
    ∃ (u₁ : List (Symbol T N)) (u₂ : List (Symbol T N)), u = u₁ ++ u₂ (r.Rewrites [x] u₁ u₂ = v r.Rewrites v u₂ [x] = u₁)
    theorem ContextFreeRule.rewrites_append {T : Type uT} {N : Type uN} {r : ContextFreeRule T N} {v₁ v₂ u : List (Symbol T N)} (h : r.Rewrites (v₁ ++ v₂) u) :
    ∃ (u₁ : List (Symbol T N)) (u₂ : List (Symbol T N)), u = u₁ ++ u₂ (r.Rewrites v₁ u₁ v₂ = u₂ r.Rewrites v₂ u₂ v₁ = u₁)

    Given a context-free grammar g and strings u and v g.ProducesLeftmost u v means that one application of a rule from g to the leftmost nonterminal of u send u to v.

    Equations
    Instances For
      @[reducible, inline]

      Given a context-free grammar g and strings u and v g.DerivesLeftmost u v means that g can transform u to v in some number of rewriting steps, by applying the transformation always to the leftmost symbol of u.

      Equations
      Instances For
        theorem ContextFreeGrammar.DerivesLeftmost.trans {T : Type uT} {g : ContextFreeGrammar T} {u v w : List (Symbol T g.NT)} (huv : g.DerivesLeftmost u v) (hvw : g.DerivesLeftmost v w) :
        theorem ContextFreeGrammar.DerivesLeftmost.eq_or_head {T : Type uT} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} (huw : g.DerivesLeftmost u w) :
        u = w ∃ (v : List (Symbol T g.NT)), g.ProducesLeftmost u v g.DerivesLeftmost v w
        theorem ContextFreeGrammar.DerivesLeftmost.eq_or_tail {T : Type uT} {g : ContextFreeGrammar T} {u w : List (Symbol T g.NT)} (huw : g.DerivesLeftmost u w) :
        u = w ∃ (v : List (Symbol T g.NT)), g.DerivesLeftmost u v g.ProducesLeftmost v w

        Add extra prefix to context-free leftmost producing.

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

        Add extra postfix to context-free leftmost producing.

        Add extra prefix to context-free leftmost deriving.

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

        Add extra postfix to context-free leftmost deriving.

        theorem ContextFreeGrammar.derives_leftmost_cons {T : Type uT} {g : ContextFreeGrammar T} {x : Symbol T g.NT} {v u : List (Symbol T g.NT)} (h : g.DerivesLeftmost (x :: v) u) :
        (∃ (u' : List (Symbol T g.NT)), u = u' ++ v g.DerivesLeftmost [x] u') ∃ (w₁ : List T) (u₂ : List (Symbol T g.NT)), u = List.map Symbol.terminal w₁ ++ u₂ g.DerivesLeftmost [x] (List.map Symbol.terminal w₁) g.DerivesLeftmost v u₂
        theorem ContextFreeGrammar.derives_leftmost_append {T : Type uT} {g : ContextFreeGrammar T} {v₁ v₂ u : List (Symbol T g.NT)} (h : g.DerivesLeftmost (v₁ ++ v₂) u) :
        (∃ (u' : List (Symbol T g.NT)), u = u' ++ v₂ g.DerivesLeftmost v₁ u') ∃ (w₁ : List T) (u₂ : List (Symbol T g.NT)), u = List.map Symbol.terminal w₁ ++ u₂ g.DerivesLeftmost v₁ (List.map Symbol.terminal w₁) g.DerivesLeftmost v₂ u₂
        theorem ContextFreeGrammar.derives_cons {T : Type uT} {g : ContextFreeGrammar T} {x : Symbol T g.NT} {v u : List (Symbol T g.NT)} (h : g.Derives (x :: v) u) :
        ∃ (u₁ : List (Symbol T g.NT)) (u₂ : List (Symbol T g.NT)), u = u₁ ++ u₂ g.Derives [x] u₁ g.Derives v u₂