Theory CFG
theory CFG
imports Main
begin
typedecl symbol
type_synonym rule = "symbol × symbol list"
type_synonym sentence = "symbol list"
locale CFG =
fixes 𝔑 :: "symbol set"
fixes 𝔗 :: "symbol set"
fixes ℜ :: "rule set"
fixes 𝔖 :: "symbol"
assumes disjunct_symbols: "𝔑 ∩ 𝔗 = {}"
assumes startsymbol_dom: "𝔖 ∈ 𝔑"
assumes validRules: "∀ (N, α) ∈ ℜ. N ∈ 𝔑 ∧ (∀ s ∈ set α. s ∈ 𝔑 ∪ 𝔗)"
begin
definition is_terminal :: "symbol ⇒ bool"
where
"is_terminal s = (s ∈ 𝔗)"
definition is_nonterminal :: "symbol ⇒ bool"
where
"is_nonterminal s = (s ∈ 𝔑)"
lemma is_nonterminal_startsymbol:"is_nonterminal 𝔖"
by (simp add: is_nonterminal_def startsymbol_dom)
definition is_symbol :: "symbol ⇒ bool"
where
"is_symbol s = (is_terminal s ∨ is_nonterminal s)"
definition is_sentence :: "sentence ⇒ bool"
where
"is_sentence s = list_all is_symbol s"
definition is_word :: "sentence ⇒ bool"
where
"is_word s = list_all is_terminal s"
definition derives1 :: "sentence ⇒ sentence ⇒ bool"
where
"derives1 u v =
(∃ x y N α.
u = x @ [N] @ y
∧ v = x @ α @ y
∧ is_sentence x
∧ is_sentence y
∧ (N, α) ∈ ℜ)"
definition derivations1 :: "(sentence × sentence) set"
where
"derivations1 = { (u,v) | u v. derives1 u v }"
definition derivations :: "(sentence × sentence) set"
where
"derivations = derivations1^*"
definition derives :: "sentence ⇒ sentence ⇒ bool"
where
"derives u v = ((u, v) ∈ derivations)"
definition is_derivation :: "sentence ⇒ bool"
where
"is_derivation u = derives [𝔖] u"
definition ℒ :: "sentence set"
where
"ℒ = { v | v. is_word v ∧ is_derivation v}"
definition "ℒ⇩P" :: "sentence set"
where
"ℒ⇩P = { u | u v. is_word u ∧ is_derivation (u@v) }"
end
end