Parse Trees for Chomsky Grammars #
This file defines parse trees and proves the basic height and yield lemmas used in the pumping argument.
Main declarations #
A parseTree n encodes a ChomskyNormalFormGrammar derivation of a word from a nonterminal
n
- leaf
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
(t : T)
(hnt : ChomskyNormalFormRule.leaf n t ∈ g.rules)
: parseTree n
Single rule application transforming a nonterminal into a terminal.
- node
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n c₁ c₂ : g.NT}
(t₁ : parseTree c₁)
(t₂ : parseTree c₂)
(hnc : ChomskyNormalFormRule.node n c₁ c₂ ∈ g.rules)
: parseTree n
Application of rule of the second kind.
Instances For
def
ChomskyNormalFormGrammar.parseTree.yield
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
(p : parseTree n)
:
List T
The yield of a tree is the word the tree derives
Equations
Instances For
inductive
ChomskyNormalFormGrammar.parseTree.IsSubtreeOf
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n₁ n₂ : g.NT}
:
IsSubTreeOf p₁ p₂ encodes that p₁ is a subtree of p₂
- eq
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
(p : parseTree n)
: p.IsSubtreeOf p
A parse tree is a subtree of itself
- left_sub
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{l r n₁ n₂ : g.NT}
(p₁ : parseTree l)
(p₂ : parseTree r)
(p : parseTree n₂)
(hrn₁ : ChomskyNormalFormRule.node n₁ l r ∈ g.rules)
(hpp₁ : p.IsSubtreeOf p₁)
: p.IsSubtreeOf (p₁.node p₂ hrn₁)
If
p₁is a subtree ofp₂, it is also a subtree ofnode p₂ p₃ - right_sub
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{l r n₁ n₂ : g.NT}
(p₁ : parseTree l)
(p₂ : parseTree r)
(p : parseTree n₂)
(hrn₁ : ChomskyNormalFormRule.node n₁ l r ∈ g.rules)
(hpp₂ : p.IsSubtreeOf p₂)
: p.IsSubtreeOf (p₁.node p₂ hrn₁)
If
p₁is a subtree ofp₃, it is also a subtree ofnode p₂ p₃
Instances For
theorem
ChomskyNormalFormGrammar.parseTree.yield_derives
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{p : parseTree n}
:
theorem
ChomskyNormalFormGrammar.parseTree.height_pos
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{p : parseTree n}
:
theorem
ChomskyNormalFormGrammar.parseTree.yield_length_pos
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{p : parseTree n}
:
theorem
ChomskyNormalFormGrammar.parseTree.subtree_decomposition
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n₁ n₂ : g.NT}
{p₁ : parseTree n₁}
{p₂ : parseTree n₂}
(hpp : p₂.IsSubtreeOf p₁)
:
theorem
ChomskyNormalFormGrammar.parseTree.strict_subtree_decomposition
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{p₁ p₂ : parseTree n}
(hpp : p₂.IsSubtreeOf p₁)
(hne : p₁ ≠ p₂)
:
theorem
ChomskyNormalFormGrammar.parseTree.IsSubtreeOf.refl
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{p : parseTree n}
:
p.IsSubtreeOf p
theorem
ChomskyNormalFormGrammar.parseTree.IsSubtreeOf.trans
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n₁ n₂ n₃ : g.NT}
{p₁ : parseTree n₁}
{p₂ : parseTree n₂}
{p₃ : parseTree n₃}
(hp₁ : p₁.IsSubtreeOf p₂)
(hp₂ : p₂.IsSubtreeOf p₃)
:
p₁.IsSubtreeOf p₃
theorem
ChomskyNormalFormGrammar.parseTree.subtree_height
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n₁ n₂ : g.NT}
{p₁ : parseTree n₁}
{p₂ : parseTree n₂}
(hpp : p₁.IsSubtreeOf p₂)
:
theorem
ChomskyNormalFormGrammar.DerivesIn.terminal_refl
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{u v : List T}
{m : ℕ}
(huv : g.DerivesIn (List.map Symbol.terminal u) (List.map Symbol.terminal v) m)
:
theorem
ChomskyNormalFormGrammar.Derives.yield
{T : Type uT}
{g : ChomskyNormalFormGrammar T}
{n : g.NT}
{u : List T}
(hnu : g.Derives [Symbol.nonterminal n] (List.map Symbol.terminal u))
: