Theory Validity
theory Validity 
imports LLEarleyParsing Derivations
begin
context LocalLexing begin
definition wellformed_token :: "token ⇒ bool"
where
  "wellformed_token t = is_terminal (terminal_of_token t)"
definition wellformed_tokens :: "tokens ⇒ bool"
where
  "wellformed_tokens ts = list_all wellformed_token ts"
definition doc_tokens :: "tokens ⇒ bool"
where
  "doc_tokens p = (wellformed_tokens p ∧ is_prefix (chars p) Doc)"
definition wellformed_item :: "item ⇒ bool"
where 
  "wellformed_item x = (
    item_rule x ∈ ℜ ∧ 
    item_origin x ≤ item_end x ∧ 
    item_end x ≤ length Doc ∧
    item_dot x ≤ length (item_rhs x))"
definition wellformed_items :: "items ⇒ bool"
where
  "wellformed_items X = (∀ x ∈ X. wellformed_item x)"
lemma is_word_terminals: "wellformed_tokens p ⟹ is_word (terminals p)"
by (simp add: is_word_def list_all_length terminals_def wellformed_token_def wellformed_tokens_def)
lemma is_word_subset: "is_word x ⟹ set y ⊆ set x ⟹ is_word y"
by (metis (mono_tags, opaque_lifting) in_set_conv_nth is_word_def list_all_length subsetCE)
 
lemma is_word_terminals_take: "wellformed_tokens p ⟹ is_word(terminals (take n p))"
by (metis append_take_drop_id is_word_terminals list_all_append wellformed_tokens_def)
lemma is_word_terminals_drop: "wellformed_tokens p ⟹ is_word(terminals (drop n p))"
by (metis append_take_drop_id is_word_terminals list_all_append wellformed_tokens_def)
definition pvalid :: "tokens ⇒ item ⇒ bool"
where
  "pvalid p x = (∃ u γ.
     wellformed_tokens p ∧
     wellformed_item x ∧
     u ≤ length p ∧
     charslength p = item_end x ∧
     charslength (take u p) = item_origin x ∧
     is_derivation (terminals (take u p) @ [item_nonterminal x] @ γ) ∧
     derives (item_α x) (terminals (drop u p)))"
definition Gen :: "tokens set ⇒ items"
where
  "Gen P = { x | x p. p ∈ P ∧ pvalid p x }"
lemma "wellformed_items (Gen P)"
  by (auto simp add: Gen_def pvalid_def wellformed_items_def)
lemma "wellformed_items (Init)"
  by (auto simp add: wellformed_items_def Init_def init_item_def wellformed_item_def)
definition pvalid_left :: "tokens ⇒ item ⇒ bool"
where
  "pvalid_left p x = (∃ u γ.
     wellformed_tokens p ∧
     wellformed_item x ∧
     u ≤ length p ∧
     charslength p = item_end x ∧
     charslength (take u p) = item_origin x ∧
     is_leftderivation (terminals (take u p) @ [item_nonterminal x] @ γ) ∧
     leftderives (item_α x) (terminals (drop u p)))"
lemma pvalid_left: "pvalid p x = pvalid_left p x"
proof -
  have right_imp_left: "pvalid_left p x ⟹ pvalid p x"
    by (meson CFG.leftderives_implies_derives CFG_axioms LocalLexing.pvalid_def 
        LocalLexing.pvalid_left_def LocalLexing_axioms leftderivation_implies_derivation)
  have left_imp_right: "pvalid p x ⟹ pvalid_left p x"
  proof -
    assume "pvalid p x"
    then obtain u γ where 
      "wellformed_tokens p ∧
       wellformed_item x ∧
       u ≤ length p ∧
       charslength p = item_end x ∧
       charslength (take u p) = item_origin x ∧
       is_derivation (terminals (take u p) @ [item_nonterminal x] @ γ) ∧
       derives (item_α x) (terminals (drop u p))" by (simp add: pvalid_def, blast)
    thus ?thesis
      apply (auto simp add: pvalid_left_def)
      apply (rule_tac x=u in exI)
      apply auto
      apply (simp add: is_leftderivation_def)
      apply (rule_tac derives_implies_leftderives_cons[where b=γ])
      apply (erule is_word_terminals_take)
      apply (simp add: is_derivation_def)
      by (metis derives_implies_leftderives is_word_terminals_drop)
  qed
  show ?thesis by (metis left_imp_right right_imp_left)
qed
  
lemma ℒ⇩P_wellformed_tokens: "terminals p ∈ ℒ⇩P ⟹ wellformed_tokens p"
by (metis (mono_tags, lifting) ℒ⇩P_is_word is_word_def length_map list_all_length 
    nth_map terminals_def wellformed_token_def wellformed_tokens_def)
end
end