lemma paths_le_split_via_eq: "paths_le (Suc k) P = paths_le k P ∪ paths_eq (Suc k) P" by (auto simp add: paths_le_def paths_eq_def)
lemma natUnion_superset: shows"g i ⊆ natUnion g" by (meson natUnion_elem subset_eq)
definition indexle :: "nat ==> nat ==> nat ==> nat ==> bool"where "indexle k' u' k u = ((indexlt k' u' k u) ∨ (k' = k ∧ u' = u))"
definition produced_by_scan_step :: "item ==> nat ==> nat ==> bool"where "produced_by_scan_step x k u = (∃ k' u' y X. indexle k' u' k u ∧ y ∈J k' u' ∧ item_end y = k' ∧ X ∈ (T k' u') ∧ x = inc_item y (k' + length (chars_of_token X)) ∧ next_symbol y = Some (terminal_of_token X))"
lemma indexle_trans: "indexle k'' u'' k' u' ==> indexle k' u' k u ==> indexle k'' u'' k u" using indexle_def indexlt_trans proof - assume a1: "indexle k'' u'' k' u'" assume a2: "indexle k' u' k u" thenhave f3: "∧n na. u' = u ∨ indexlt n na k u ∨¬ indexlt n na k' u'" by (meson indexle_def indexlt_trans) have"∧n na. k' = k ∨ indexlt n na k u ∨¬ indexlt n na k' u'" using a2 by (meson indexle_def indexlt_trans) thenshow ?thesis using f3 a2 a1 indexle_def by auto qed
lemma produced_by_scan_step_trans: assumes"indexle k' u' k u" assumes"produced_by_scan_step x k' u'" shows"produced_by_scan_step x k u" proof - from iffD1[OF produced_by_scan_step_def assms(2)] obtain k'a u'a y X where produced_k'_u': "indexle k'a u'a k' u' ∧ y ∈J k'a u'a ∧ item_end y = k'a ∧ X ∈T k'a u'a ∧ x = inc_item y (k'a + length (chars_of_token X)) ∧ next_symbol y = Some (terminal_of_token X)" by blast thenshow ?thesis using indexle_trans assms(1) produced_by_scan_step_def by blast qed
lemmaJ_induct[consumes 1, case_names Induct]: assumes"x ∈J k u" assumes induct: "∧ x k u . (∧ x' k' u'. x' ∈J k' u' ==> indexlt k' u' k u ==> P x' k' u') ==> x ∈J k u ==> P x k u" shows"P x k u" proof - let ?R = "indexlt_rel <*lex*> {}" have wf_R: "wf ?R"by (auto simp add: wf_indexlt_rel) let ?P = "λ a. snd a ∈J (fst (fst a)) (snd (fst a)) ⟶ P (snd a) (fst (fst a)) (snd (fst a))" have"x ∈J k u ⟶ P x k u" apply (rule wf_induct[OF wf_R, where P = ?P and a = "((k, u), x)", simplified]) apply (auto simp add: indexlt_def[symmetric]) apply (rule_tac x=ba and k=a and u=b in induct) by auto thus ?thesis using assms by auto qed
lemma π_no_tokens_item_end: assumes x_in_π: "x ∈ π k {} I" shows"item_end x = k ∨ x ∈ I" proof - have x_in_limit: "x ∈ limit (λI. Complete k (Predict k I)) I" using x_in_π π_no_tokens by auto thenshow ?thesis proof (induct rule: limit_induct) case (Init x) thenshow ?caseby auto next case (Iterate x J) from Iterate(2) have"item_end x = k ∨ x ∈ Predict k J" using Complete_item_end by auto thenshow ?case proof (induct rule: disjCases2) case1thenshow ?caseby blast next case2 thenhave"item_end x = k ∨ x ∈ J" using Predict_item_end by auto thenshow ?case proof (induct rule: disjCases2) case1thenshow ?caseby blast next case2thenshow ?caseusing Iterate(1)[OF 2] by blast qed qed qed qed
lemma natUnion_ex: "x ∈ natUnion f ==>∃ i. x ∈ f i" by (metis (no_types, opaque_lifting) mk_disjoint_insert natUnion_superset natUnion_upperbound
subsetCE subset_insert)
lemma locate_in_limit: assumes x_in_limit: "x ∈ limit f X" assumes x_notin_X: "x ∉ X" shows"∃ n. x ∈ funpower f (Suc n) X ∧ x ∉ funpower f n X" proof - have"∃ N. x ∈ funpower f N X"using x_in_limit limit_def natUnion_ex by fastforce thenobtain N where N: "x ∈ funpower f N X"by blast
{ fix n :: nat have"x ∈ funpower f n X ==>∃ m < n. x ∈ funpower f (Suc m) X ∧ x ∉ funpower f m X" proof (induct n) case0 with x_notin_X show ?caseby auto next case (Suc n) have"x ∉ funpower f n X ∨ x ∈ funpower f n X"by blast thenshow ?case proof (induct rule: disjCases2) case1 thenshow ?caseusing Suc by fastforce next case2 from Suc(1)[OF 2] show ?caseusing less_SucI by blast qed qed
} with N show ?thesis by auto qed
lemma produced_by_scan_step: "x ∈J k u ==> item_end x > k ==> produced_by_scan_step x k u" proof (induct rule: J_induct) case (Induct x k u) have"(k = 0 ∧ u = 0) ∨ (k > 0 ∧ u = 0) ∨ (u > 0)"by arith thenshow ?case proof (induct rule: disjCases3) case1 with Induct have"item_end x = 0"usingJ_0_0_item_end by blast with Induct have"False"by arith thenshow ?caseby blast next case2 thenobtain k' where k': "k = Suc k'"using Suc_pred' by blast with Induct 2have"x ∈J (Suc k') 0"by auto thenhave"x ∈ π k {} (I k')"by (simp add: k') thenhave"item_end x = k ∨ x ∈I k'"using π_no_tokens_item_end by blast thenshow ?case proof (induct rule: disjCases2) case1 with Induct have"False"by auto thenshow ?caseby blast next case2 thenhave"∃ u'. x ∈J k' u'"usingI.simps natUnion_ex by fastforce thenobtain u' where u': "x ∈J k' u'"by blast have k'_bound: "k' < item_end x"using k' Induct by arith have indexlt: "indexlt k' u' k u"by (simp add: indexlt_simp k') from Induct(1)[OF u' this k'_bound] have pred_produced: "produced_by_scan_step x k' u'" . thenshow ?caseusing indexlt produced_by_scan_step_trans indexle_def by blast qed next case3 thenhave ex_u': "∃ u'. u = Suc u'"by arith thenobtain u' where u': "u = Suc u'"by blast with Induct have"x ∈J k (Suc u')"by metis thenhave x_in_π: "x ∈ π k (T k u) (J k u')"using u' J.simps by metis have"x ∈J k u' ∨ x ∉J k u'"by blast thenshow ?case proof (induct rule: disjCases2) case1 have indexlt: "indexlt k u' k u"by (simp add: indexlt_simp u') with Induct(1)[OF 1 indexlt Induct(3)] show ?case using indexle_def produced_by_scan_step_trans by blast next case2 have item_end_x: "k < item_end x"using Induct by auto obtain f where f: "f = Scan (T k u) k ∘ Complete k ∘ Predict k"by blast have"x ∈ limit f (J k u')" using x_in_π π_functional f by simp from locate_in_limit[OF this 2] obtain n where n: "x ∈ funpower f (Suc n) (J k u') ∧ x ∉ funpower f n (J k u')"by blast obtain Y where Y: "Y = funpower f n (J k u')" by blast have x_f_Y: "x ∈ f Y ∧ x ∉ Y"using Y n by auto thenhave"x ∈ Scan (T k u) k (Complete k (Predict k Y))"using comp_apply f by simp thenhave"x ∈ (Complete k (Predict k Y)) ∨ x ∈ { inc_item x' (k + length c) | x' t c. x' ∈ bin (Complete k (Predict k Y)) k∧ (t, c) ∈ (T k u) ∧ next_symbol x' = Some t }"using Scan_def by simp thenshow ?case proof (induct rule: disjCases2) case1 thenhave"False"using item_end_x x_f_Y Complete_item_end Predict_item_end using less_not_refl3 by blast thenshow ?caseby auto next case2 have"Y ⊆ limit f (J k u')"using Y limit_def natUnion_superset by fastforce thenhave"Y ⊆ π k (T k u) (J k u')"using f by (simp add: π_functional) thenhave Y_in_J: "Y ⊆J k u"using u' by simp thenhave in_J: "Complete k (Predict k Y) ⊆J k u" proof - (* automatically generated *) have f1: "∀f I Ia i. (¬ mono f ∨¬ (I::item set) ⊆ Ia ∨ (i::item) ∉ f I) ∨ i ∈ f Ia" by (meson mono_subset_elem) obtain ii :: "item set ==> item set ==> item"where "∀x0 x1. (∃v2. v2 ∈ x1 ∧ v2 ∉ x0) = (ii x0 x1 ∈ x1 ∧ ii x0 x1 ∉ x0)" by moura thenhave f2: "∀I Ia. ii Ia I ∈ I ∧ ii Ia I ∉ Ia ∨ I ⊆ Ia" by blast obtain nn :: nat where
f3: "u = Suc nn" using ex_u' by presburger moreover
{ assume"ii (J k u) (Complete k (Predict k Y)) ∈ Complete k (π k (T k (Suc nn)) (J k nn))" thenhave ?thesis using f3 f2 Complete_π_fixby auto } ultimatelyshow ?thesis using f2 f1 by (metis (full_types) Complete_regular Predict_π_fix Predict_regular J.simps(2) Y_in_J regular_implies_mono) qed from2obtain x' t c where x'_t_c: "x = inc_item x' (k + length c) ∧ x' ∈ bin (Complete k (Predict k Y)) k ∧ (t, c) ∈T k u ∧ next_symbol x' = Some t"by blast show ?case apply (simp add: produced_by_scan_step_def) apply (rule_tac x=k in exI) apply (rule_tac x=u in exI) apply (simp add: indexle_def) apply (rule_tac x=x' in exI) apply auto using x'_t_c bin_def in_Japply auto[1] using x'_t_c bin_def apply blast apply (rule_tac x=t in exI) apply (rule_tac x=c in exI) using x'_t_c by auto qed qed qed qed
lemma limit_single_step: assumes"x ∈ f X" shows"x ∈ limit f X" by (metis assms elem_limit_simp funpower.simps(1) funpower.simps(2))
lemma Gen_union: "Gen (A ∪ B) = Gen A ∪ Gen B" by (simp add: Gen_def, blast)
lemma is_prefix_Prefixes_subset: assumes"is_prefix q p" shows"Prefixes q ⊆ Prefixes p" proof - show ?thesis apply (auto simp add: Prefixes_def) using assms by (metis is_prefix_append is_prefix_def) qed
lemma Prefixes_subset_P: assumes"p ∈P k u" shows"Prefixes p ⊆P k u" using Prefixes_is_prefix assms prefixes_are_paths by blast
lemma Prefixes_subset_paths_le: assumes"Prefixes p ⊆ P" shows"Prefixes p ⊆ paths_le (charslength p) P" using Prefixes_is_prefix assms charslength_of_prefix paths_le_def by auto
lemma Scan_J_subset_J: "Scan (T k (Suc u)) k (J k u) ⊆J k (Suc u)" by (metis (no_types, lifting) Scan_π_fixJ.simps(2) J_subset_Suc_u monoD mono_Scan)
lemma subset_Jk: "u ≤ v ==>J k u ⊆J k v" thmJ_subset_Suc_u by (rule subset_fSuc, rule J_subset_Suc_u)
lemma subset_JIk: "J k u ⊆I k"by (auto simp add: natUnion_def)
lemma subset_IJSuc: "I k ⊆J (Suc k) u" proof - have a: "I k ⊆J (Suc k) 0" apply (simp only: J.simps) using π_apply_setmonotone by blast show ?thesis apply (case_tac "u = 0") apply (simp only: a) apply (rule subset_trans[OF a subset_Jk]) by auto qed
lemma subset_ISuc: "I k ⊆I (Suc k)" by (rule subset_trans[OF subset_IJSuc subset_JIk])
lemma subset_I: "i ≤ j ==>I i ⊆I j" by (rule subset_fSuc[where u=i and v=j and f = I, OF subset_ISuc])
lemma subset_J : assumes leq: "k' < k ∨ (k' = k ∧ u' ≤ u)" shows"J k' u' ⊆J k u" proof - from leq show ?thesis proof (induct rule: disjCases2) case1 have s1: "J k' u' ⊆I k'"by (rule_tac subset_JIk) have s2: "I k' ⊆I (k - 1)" apply (rule_tac subset_I) using1by arith from subset_IJSuc[where k="k - 1"] 1have s3: "I (k - 1) ⊆J k 0" by simp have s4: "J k 0 ⊆J k u"by (rule_tac subset_Jk, simp) from s1 s2 s3 s4 subset_trans show ?caseby blast next case2thus ?caseby (simp add : subset_Jk) qed qed
lemmaJ_subset: assumes"indexle k' u' k u" shows"J k' u' ⊆J k u" using subset_J indexle_def indexlt_simp by (metis assms less_imp_le_nat order_refl)
lemma Scan_items_le: assumes bounded_T: "∧ t . t ∈ T ==> length (chars_of_token t) ≤ l" shows"Scan T k (items_le k P) ⊆ items_le (k + l) (Scan T k P)" proof -
{ fix x :: item assume x_dom: "x ∈ Scan T k (items_le k P)" thenhave x_dom': "x ∈ Scan T k P" by (meson items_le_is_filter mono_Scan mono_subset_elem) from x_dom have"x ∈ items_le k P ∨ (∃ y t c. x = inc_item y (k + length c) ∧ y ∈ bin (items_le k P) k ∧ (t, c) ∈ T ∧ next_symbol y = Some t)" using Scan_def using UnE mem_Collect_eq by auto thenhave"item_end x ≤ k + l" proof (induct rule: disjCases2) case1thenshow ?case by (meson items_le_fix_D items_le_idempotent trans_le_add1) next case2 thenobtain y t c where y: "x = inc_item y (k + length c) ∧ y ∈ bin (items_le k P) k ∧ (t, c) ∈ T ∧ next_symbol y = Some t"by blast thenhave item_end_x: "item_end x = (k + length c)"by simp from bounded_T y have"length c ≤ l" using chars_of_token_simp by auto with item_end_x show ?caseby arith qed with x_dom' have"x ∈ items_le (k + l) (Scan T k P)" using items_le_def mem_Collect_eq by blast
} thenshow ?thesis by blast qed
lemma Scan_mono_tokens: "P ⊆ Q ==> Scan P k I ⊆ Scan Q k I" by (auto simp add: Scan_def)
theorem thmD14: "k ≤ length Doc ==> items_le k (J k u) = Gen (paths_le k (P k u)) ∧T k u = Z k u ∧ items_le k (I k) = Gen (paths_le k (Q k))" proof (induct k arbitrary: u rule: less_induct) case (less k) have"k = 0 ∨ k ≠ 0"by arith thenshow ?case proof (induct rule: disjCases2) case1 haveJ_eq_P: "items_le k (J k 0) = Gen (paths_le k (P k 0))" by (simp only: 1 thmD8 items_le_paths_le) show ?caseusing thmD13[OF J_eq_P less.prems] by blast next case2 have"∃ k'. k = Suc k'"using2by arith thenobtain k' where k': "k = Suc k'"by blast have k'_less_k: "k' < k"using k' by arith have"items_le k (J k 0) = Gen (paths_le k (P k 0))" proof - have simp_left: "items_le k (J k 0) = π k {} (items_le k (I k'))" using items_le_π_swap k' wellformed_items_Iby auto have simp_right: "Gen (paths_le k (P k 0)) = natUnion (λ v. Gen (paths_le k (P k' v)))" by (simp add: k' paths_le_pointwise pointwise_Gen pointwise_natUnion_swap)
{ fix v :: nat have split_J: "items_le k (J k' v) = items_le k' (J k' v) ∪ items_eq k (J k' v)" using k' items_le_split_via_eq by blast have sub1: "items_le k' (J k' v) ⊆ natUnion (λ v. Gen (paths_le k (P k' v)))" proof - have h: "items_le k' (J k' v) ⊆ Gen (paths_le k (P k' v))" proof - (* automatically generated *) have f1: "items_le k' (Gen (P k' v)) ∪ items_eq (Suc k') (Gen (P k' v)) = Gen (paths_le k (P k' v))" using LocalLexing.items_le_split_via_eq LocalLexing_axioms items_le_paths_le k' by blast have"k' ≤ length Doc" by (metis (no_types) dual_order.trans k' less.prems lessI less_imp_le_nat) thenhave"items_le k' (J k' v) = items_le k' (Gen (P k' v))" by (simp add: items_le_paths_le k' less.hyps) thenshow ?thesis using f1 by blast qed have"Gen (paths_le k (P k' v)) ⊆ natUnion (λ v. Gen (paths_le k (P k' v)))" using natUnion_superset by fastforce thenshow ?thesis using h by blast qed
{ fix x :: item assume x_dom: "x ∈ items_eq k (J k' v)" have x_in_J: "x ∈J k' v"using x_dom items_eq_def by auto have item_end_x: "item_end x = k"using x_dom items_eq_def by auto thenhave k'_bound: "k' < item_end x"using k' by arith from produced_by_scan_step[OF x_in_J k'_bound] have"produced_by_scan_step x k' v" . from iffD1[OF produced_by_scan_step_def this] obtain k'' v'' y X where scan_step: "indexle k'' v'' k' v ∧ y ∈J k'' v'' ∧ item_end y = k'' ∧ X ∈T k'' v'' ∧ x = inc_item y (k'' + length (chars_of_token X)) ∧ next_symbol y = Some (terminal_of_token X)"by blast thenhave y_in_items_le: "y ∈ items_le k'' (J k'' v'')" using items_le_def LocalLexing_axioms le_refl mem_Collect_eq by blast have y_in_Gen: "y ∈ Gen(paths_le k'' (P k'' v''))" proof - (* automatically generated *) have f1: "∧n. k' < n ∨¬ k < n" using Suc_lessD k' by blast have f2: "k'' = k' ∨ k'' < k'" using indexle_def indexlt_simp scan_step by force have f3: "k' < k" using k' by blast have f4: "k' ≤ length Doc" using f1 by (meson less.prems less_Suc_eq_le) have"k'' ≤ length Doc ∨ k' = k''" using f2 f1 by (meson Suc_lessD less.prems less_Suc_eq_le less_trans_Suc) thenshow ?thesis using f4 f3 f2 Suc_lessD y_in_items_le less.hyps less_trans_Suc by blast qed thenhave"∃ p. p ∈P k'' v'' ∧ pvalid p y" by (meson Gen_implies_pvalid paths_le_is_filter rev_subsetD) thenobtain p where p: "p ∈P k'' v'' ∧ pvalid p y"by blast thenhave charslength_p: "charslength p = k''"using pvalid_item_end scan_step by auto have pvalid_p_y: "pvalid p y"using p by blast have"admissible (p@[(fst X, snd X)])" apply (rule pvalid_next_terminal_admissible) apply (rule pvalid_p_y) using scan_step apply (simp add: terminal_of_token_def) using scan_step by (metis TokensAt_subset_XT_subset_TokensAt X_are_terminals
rev_subsetD terminal_of_token_def) thenhave admissible_p_X: "admissible (p@[X])"by simp have X_in_Z: "X ∈Z k'' (Suc v'')"by (metis (no_types, lifting) Suc_lessD Z_subset_Suc
k'_bound dual_order.trans indexle_def indexlt_simp item_end_of_inc_item item_end_x
le_add1 le_neq_implies_less less.hyps less.prems not_less_eq scan_step subsetCE) have pX_in_P_k''_v'': "p@[X] ∈P k'' (Suc v'')" apply (simp only: P.simps) apply (rule limit_single_step) apply (auto simp only: Append_def) apply (rule_tac x=p in exI) apply (rule_tac x=X in exI) apply (simp only: admissible_p_X X_in_Z) using charslength_p p by auto have"indexle k'' v'' k' v"using scan_step by simp thenhave"indexle k'' (Suc v'') k' (Suc v)" by (simp add: indexle_def indexlt_simp) thenhave"P k'' (Suc v'') ⊆P k' (Suc v)" by (metis indexle_def indexlt_simp less_or_eq_imp_le subset_P) with pX_in_P_k''_v'' have pX_in_P_k': "p@[X] ∈P k' (Suc v)"by blast have"charslength (p@[X]) = k'' + length (chars_of_token X)" using charslength_p by auto thenhave"charslength (p@[X]) = item_end x"using scan_step by simp thenhave charslength_p_X: "charslength (p@[X]) = k"using item_end_x by simp thenhave pX_dom: "p@[X] ∈ paths_le k (P k' (Suc v))" using lessI less_Suc_eq_le mem_Collect_eq pX_in_P_k' paths_le_def by auto have wellformed_x: "wellformed_item x" using item_end_x less.prems scan_step wellformed_inc_item wellformed_items_J
wellformed_items_def by auto have wellformed_p_X: "wellformed_tokens (p@[X])" usingP_wellformed pX_in_P_k''_v'' by blast from iffD1[OF pvalid_def pvalid_p_y] obtain r γ where r_γ: "wellformed_tokens p ∧ wellformed_item y ∧ r ≤ length p ∧ charslength p = item_end y ∧ charslength (take r p) = item_origin y ∧ is_derivation (terminals (take r p) @ [item_nonterminal y] @ γ) ∧ derives (item_α y) (terminals (drop r p))"by blast have r_le_p: "r ≤ length p"by (simp add: r_γ) have item_nonterminal_x: "item_nonterminal x = item_nonterminal y" by (simp add: scan_step) have item_α_x: "item_α x = (item_α y) @ [terminal_of_token X]" by (simp add: item_α_of_inc_item r_γ scan_step) have pvalid_x: "pvalid (p@[X]) x" apply (auto simp add: pvalid_def wellformed_x wellformed_p_X) apply (rule_tac x=r in exI) apply auto apply (simp add: le_SucI r_γ) using r_γ scan_step apply auto[1] using r_γ scan_step apply auto[1] apply (rule_tac x=γ in exI) apply (simp add: r_le_p item_nonterminal_x) using r_γ apply simp apply (simp add: r_le_p item_α_x) by (metis terminals_singleton append_Nil2
derives_implies_leftderives derives_is_sentence is_sentence_concat
is_sentence_cons is_symbol_def is_word_append is_word_cons is_word_terminals
is_word_terminals_drop leftderives_implies_derives leftderives_padback
leftderives_refl r_γ terminals_append terminals_drop wellformed_p_X) thenhave"x ∈ Gen (paths_le k (P k' (Suc v)))"using pX_dom Gen_def
LocalLexing_axioms mem_Collect_eq by auto
} thenhave sub2: "items_eq k (J k' v) ⊆ natUnion (λ v. Gen (paths_le k (P k' v)))" by (meson dual_order.trans natUnion_superset subsetI) have suffices3: "items_le k (J k' v) ⊆ natUnion (λ v. Gen (paths_le k (P k' v)))" using split_J sub1 sub2 by blast have"items_le k (J k' v) ⊆ Gen (paths_le k (P k 0))" using suffices3 simp_right by blast
} note suffices2 = this have items_le_natUnion_swap: "items_le k (I k') = natUnion(λ v. items_le k (J k' v))" by (simp add: items_le_pointwise pointwise_natUnion_swap) thenhave suffices1: "items_le k (I k') ⊆ Gen (paths_le k (P k 0))" using suffices2 natUnion_upperbound by metis have sub_lemma: "items_le k (J k 0) ⊆ Gen (paths_le k (P k 0))" proof - have"items_le k (J k 0) ⊆ Gen (P k 0)" apply (subst simp_left) apply (rule thmD5) apply (auto simp only: less) using suffices1 items_le_is_filter items_le_paths_le subsetCE by blast thenshow ?thesis by (simp add: items_le_idempotent remove_paths_le_in_subset_Gen) qed have eq1: "π k {} (items_le k (I k')) = π k {} (items_le k (natUnion (J k')))"by simp thenhave eq2: "π k {} (items_le k (natUnion (J k'))) = π k {} (natUnion (λ v. items_le k (J k' v)))" using items_le_natUnion_swap by auto from simp_left eq1 eq2 have simp_left': "items_le k (J k 0) = π k {} (natUnion (λ v. items_le k (J k' v)))" by metis
{ fix v :: nat fix q :: "token list" fix x :: item assume q_dom: "q ∈ paths_eq k (P k' v)" assume pvalid_q_x: "pvalid q x" have q_in_P: "q ∈P k' v"using q_dom paths_eq_def by auto have charslength_q: "charslength q = k"using q_dom paths_eq_def by auto with k'_less_k have q_nonempty: "q ≠ []" using"2.hyps" chars.simps(1) charslength.simps list.size(3) by auto thenhave"∃ p X. q = p @ [X]"by (metis append_butlast_last_id) thenobtain p X where pX: "q = p @ [X]"by blast from last_step_of_path[OF q_in_P pX] obtain k'' v'' where k'': "indexlt k'' v'' k' v ∧ q ∈P k'' (Suc v'') ∧ charslength p = k'' ∧ X ∈Z k'' (Suc v'')"by blast have h1: "p ∈P" by (metis (no_types, lifting) LocalLexing.P_covers_P LocalLexing_axioms
append_Nil2 is_prefix_cancel is_prefix_empty pX prefixes_are_paths q_in_P subsetCE) have h2: "charslength p = k''"using k'' by blast obtain T where T: "T = {X}"by blast have h3: "X ∈ T"using T by blast have h4: "T ⊆X k''"usingZ_subset_X T k'' by blast obtain N where N: "N = item_nonterminal x"by blast obtain α where α: "α = item_α x"by blast obtain β where β: "β = item_β x"by blast have wellformed_x: "wellformed_item x"using pvalid_def pvalid_q_x by blast thenhave h5: "(N, α @ β) ∈R" using N α β item_nonterminal_def item_rhs_def item_rhs_split prod.collapse
wellformed_item_def by auto have pvalid_left_q_x: "pvalid_left q x"using pvalid_q_x by (simp add: pvalid_left) from iffD1[OF pvalid_left_def pvalid_left_q_x] obtain r γ where r_γ: "wellformed_tokens q ∧ wellformed_item x ∧ r ≤ length q ∧ charslength q = item_end x ∧ charslength (take r q) = item_origin x ∧ is_leftderivation (terminals (take r q) @ [item_nonterminal x] @ γ) ∧ leftderives (item_α x) (terminals (drop r q))"by blast have h6: "r ≤ length q"using r_γ by blast have h7: "leftderives [S] (terminals (take r q) @ [N] @ γ)" using r_γ N is_leftderivation_def by blast have h8: "leftderives α (terminals (drop r q))"using r_γ α by metis have h9: "k = k'' + length (chars_of_token X)"using r_γ using charslength_q h2 pX by auto have h10: "x = Item (N, α @ β) (length α) (charslength (take r q)) k" by (metis N α β charslength_q item.collapse item_dot_is_α_length item_nonterminal_def
item_rhs_def item_rhs_split prod.collapse r_γ) from thmD11[OF h1 h2 h3 h4 pX h5 h6 h7 h8 h9 h10] have"x ∈ items_le k (π k {} (Scan T k'' (Gen (Prefixes p))))" by blast thenhave x_in: "x ∈ π k {} (Scan T k'' (Gen (Prefixes p)))" using items_le_is_filter by blast have subset1: "Prefixes p ⊆ Prefixes q" apply (rule is_prefix_Prefixes_subset) by (simp add: pX is_prefix_def) have subset2: "Prefixes q ⊆P k'' (Suc v'')" apply (rule Prefixes_subset_P) using k'' by blast from subset1 subset2 have"Prefixes p ⊆P k'' (Suc v'')"by blast thenhave"Prefixes p ⊆ paths_le k'' (P k'' (Suc v''))" using k'' Prefixes_subset_paths_le by blast thenhave subset3: "Gen (Prefixes p) ⊆ Gen (paths_le k'' (P k'' (Suc v'')))" using Gen_def LocalLexing_axioms by auto have k''_less_k: "k'' < k"using k'' k' using indexlt_simp less_Suc_eq by auto thenhave k''_Doc_bound: "k'' ≤ length Doc"using less by auto from less(1)[OF k''_less_k k''_Doc_bound, of "Suc v''"] have induct1: "items_le k'' (J k'' (Suc v'')) = Gen (paths_le k'' (P k'' (Suc v'')))" by blast from less(1)[OF k''_less_k k''_Doc_bound, of "Suc(Suc v'')"] have induct2: "T k'' (Suc (Suc v'')) = Z k'' (Suc (Suc v''))"by blast have subset4: "Gen (Prefixes p) ⊆ items_le k'' (J k'' (Suc v''))" using subset3 induct1 by auto from induct1 subset4 have subset6: "Scan T k'' (Gen (Prefixes p)) ⊆ Scan T k'' (items_le k'' (J k'' (Suc v'')))" apply (rule_tac monoD[OF mono_Scan]) by blast have"k'' + length (chars_of_token X) = k" by (simp add: h9) have"∧ t. t ∈ T ==> length (chars_of_token t) ≤ length (chars_of_token X)" using T by auto from Scan_items_le[of T, OF this, simplified, of k'' "J k'' (Suc v'')"] h9 have subset7: "Scan T k'' (items_le k'' (J k'' (Suc v''))) ⊆ items_le k (Scan T k'' (J k'' (Suc v'')))"by simp have"T ⊆Z k'' (Suc (Suc v''))"using T k'' usingZ_subset_Suc rev_subsetD singletonD subsetI by blast thenhave T_subset_T: "T ⊆T k'' (Suc (Suc v''))"using induct2 by auto have subset8: "Scan T k'' (J k'' (Suc v'')) ⊆ Scan (T k'' (Suc (Suc v''))) k'' (J k'' (Suc v''))" using T_subset_T Scan_mono_tokens by blast have subset9: "Scan (T k'' (Suc (Suc v''))) k'' (J k'' (Suc v'')) ⊆J k'' (Suc (Suc v''))" by (rule Scan_J_subset_J) have subset10: "(Scan T k'' (J k'' (Suc v''))) ⊆J k'' (Suc (Suc v''))" using subset8 subset9 by blast have"k'' ≤ k'"using k'' indexlt_simp by auto thenhave"indexle k'' (Suc (Suc v'')) k' (Suc (Suc v''))"using indexlt_simp using indexle_def le_neq_implies_less by auto thenhave subset11: "J k'' (Suc (Suc v'')) ⊆J k' (Suc (Suc v''))" usingJ_subset by blast have subset12: "Scan T k'' (J k'' (Suc v'')) ⊆J k' (Suc (Suc v''))" using subset8 subset9 subset10 subset11 by blast thenhave subset13: "items_le k (Scan T k'' (J k'' (Suc v''))) ⊆ items_le k (J k' (Suc (Suc v'')))" using items_le_def mem_Collect_eq rev_subsetD subsetI by auto have subset14: "Scan T k'' (Gen (Prefixes p)) ⊆ items_le k (J k' (Suc (Suc v'')))" using subset6 subset7 subset13 by blast thenhave x_in': "x ∈ π k {} (items_le k (J k' (Suc (Suc v''))))" using x_in by (meson π_apply_setmonotone π_subset_elem_trans subsetCE subsetI) from x_in' have"x ∈ π k {} (natUnion (λ v. items_le k (J k' v)))" by (meson k' mono_π mono_subset_elem natUnion_superset)
} note suffices6 = this
{ fix v :: nat have"Gen (paths_eq k (P k' v)) ⊆ π k {} (natUnion (λ v. items_le k (J k' v)))" using suffices6 by (meson Gen_implies_pvalid subsetI)
} note suffices5 = this
{ fix v :: nat have"paths_le k (P k' v) = paths_le k' (P k' v) ∪ paths_eq k (P k' v)" using paths_le_split_via_eq k' by metis thenhave Gen_split: "Gen (paths_le k (P k' v)) = Gen (paths_le k' (P k' v)) ∪ Gen(paths_eq k (P k' v))"using Gen_union by metis have case_le: "Gen (paths_le k' (P k' v)) ⊆ π k {} (natUnion (λ v. items_le k (J k' v)))" proof - from less k'_less_k have"k' ≤ length Doc"by arith from less(1)[OF k'_less_k this] have"items_le k' (J k' v) = Gen (paths_le k' (P k' v))"by blast thenhave"Gen (paths_le k' (P k' v)) ⊆ natUnion (λ v. items_le k (J k' v))" using items_le_def LocalLexing_axioms k'_less_k natUnion_superset by fastforce thenshow ?thesis using π_apply_setmonotone by blast qed have"Gen (paths_le k (P k' v)) ⊆ π k {} (natUnion (λ v. items_le k (J k' v)))" using Gen_split case_le suffices5 UnE rev_subsetD subsetI by blast
} note suffices4 = this have super_lemma: "Gen (paths_le k (P k 0)) ⊆ items_le k (J k 0)" apply (subst simp_right) apply (subst simp_left') using suffices4 by (meson natUnion_ex rev_subsetD subsetI) from super_lemma sub_lemma show ?thesis by blast qed thenshow ?caseusing thmD13 less.prems by blast qed qed
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.