qualified definition step_eps :: "bool list ==> state ==> state ==> bool"where "step_eps bs q q' ⟷ q ∈ SQ ∧ (case transs ! (q - q0) of eps_trans p n ==> n < length bs ∧ bs ! n ∧ p = q' | split_trans p p' ==> p = q' ∨ p' = q' | _ ==> False)"
qualified definition step_eps_sucs :: "bool list ==> state ==> state set"where "step_eps_sucs bs q = (if q ∈ SQ then (case transs ! (q - q0) of eps_trans p n ==> if n < length bs ∧ bs ! n then {p} else {} | split_trans p p' ==> {p, p'} | _ ==> {}) else {})"
qualified definition step_eps_set :: "bool list ==> state set ==> state set"where "step_eps_set bs R = ∪(step_eps_sucs bs ` R)"
lemma step_eps_set_sound: "step_eps_set bs R = {q'. ∃q ∈ R. step_eps bs q q'}" using step_eps_sucs_sound by (auto simp add: step_eps_set_def)
lemma step_eps_set_mono: "R ⊆ S ==> step_eps_set bs R ⊆ step_eps_set bs S" by (auto simp add: step_eps_set_def)
(* reflexive and transitive closure of step relation *)
qualified definition step_eps_closure :: "bool list ==> state ==> state ==> bool"where "step_eps_closure bs = (step_eps bs)**"
lemma step_eps_closure_dest: "step_eps_closure bs q q' ==> q ≠ q' ==> q ∈ SQ" unfolding step_eps_closure_def apply (induction q q' rule: rtranclp.induct) using step_eps_dest by auto
qualified definition step_eps_closure_set :: "state set ==> bool list ==> state set"where "step_eps_closure_set R bs = ∪((λq. {q'. step_eps_closure bs q q'}) ` R)"
lemma step_eps_closure_set_refl: "R ⊆ step_eps_closure_set R bs" by (auto simp add: step_eps_closure_set_def step_eps_closure_def)
lemma step_eps_closure_set_mono: "R ⊆ S ==> step_eps_closure_set R bs ⊆ step_eps_closure_set S bs" by (auto simp add: step_eps_closure_set_def)
lemma step_eps_closure_set_idem: "step_eps_closure_set (step_eps_closure_set R bs) bs = step_eps_closure_set R bs" unfolding step_eps_closure_set_def step_eps_closure_def by auto
lemma step_eps_closure_set_flip: assumes"step_eps_closure_set R bs = R ∪ S" shows"step_eps_closure_set S bs ⊆ R ∪ S" using step_eps_closure_set_idem[of R bs, unfolded assms, unfolded step_eps_closure_set_split] by auto
lemma step_step_eps_closure: "step_eps bs q q' ==> q ∈ R ==> q' ∈ step_eps_closure_set R bs" unfolding step_eps_closure_set_def step_eps_closure_def by auto
lemma step_eps_closure_set_code[code]: "step_eps_closure_set R bs = (let R' = R ∪ step_eps_set bs R in if R = R' then R else step_eps_closure_set R' bs)" using rtranclp_closed by (auto simp add: step_eps_closure_set_def step_eps_closure_def step_eps_set_sound Let_def)
lemma step_symb_set_proj: "step_symb_set R = step_symb_set (R ∩ SQ)" using step_symb_dest by (auto simp add: step_symb_set_def)
lemma step_symb_set_split: "step_symb_set (R ∪ S) = step_symb_set R ∪ step_symb_set S" by (auto simp add: step_symb_set_def)
lemma step_symb_set_Un: "step_symb_set (∪x ∈ X. R x) = (∪x ∈ X. step_symb_set (R x))" by (auto simp add: step_symb_set_def)
lemma step_symb_set_code[code]: "step_symb_set R = ∪(step_symb_sucs ` R)" using step_symb_sucs_sound by (auto simp add: step_symb_set_def)
(* delta function *)
qualified definition delta :: "state set ==> bool list ==> state set"where "delta R bs = step_symb_set (step_eps_closure_set R bs)"
lemma delta_eps: "delta (step_eps_closure_set R bs) bs = delta R bs" unfolding delta_def step_eps_closure_set_idem by (rule refl)
lemma delta_eps_split: assumes"step_eps_closure_set R bs = R ∪ S" shows"delta R bs = step_symb_set R ∪ delta S bs" unfolding delta_def assms step_symb_set_split using step_symb_set_mono[OF step_eps_closure_set_flip[OF assms], unfolded step_symb_set_split]
step_symb_set_mono[OF step_eps_closure_set_refl] by auto
lemma delta_split: "delta (R ∪ S) bs = delta R bs ∪ delta S bs" by (auto simp add: delta_def step_symb_set_split step_eps_closure_set_split)
lemma delta_step_symb_set_absorb: "delta R bs = delta R bs ∪ step_symb_set R" using step_eps_closure_set_refl by (auto simp add: delta_def step_symb_set_def)
lemma delta_sub_eps_mono: assumes"S ⊆ step_eps_closure_set R bs" shows"delta S bs ⊆ delta R bs" unfolding delta_def using step_symb_set_mono[OF step_eps_closure_set_mono[OF assms, of bs,
unfolded step_eps_closure_set_idem]] by simp
(* run delta function *)
qualified definition run :: "state set ==> bool list list ==> state set"where "run R bss = foldl delta R bss"
lemma run_eps_split: assumes"step_eps_closure_set R bs = R ∪ S""step_symb_set R = {}" shows"run R (bs # bss) = run S (bs # bss)" unfolding run_def foldl.simps delta_eps_split[OF assms(1), unfolded assms(2)] by auto
qualified definition accept :: "state set ==> bool"where "accept R ⟷ accept_eps R []"
(* is a run accepting? *)
qualified definition run_accept_eps :: "state set ==> bool list list ==> bool list ==> bool"where "run_accept_eps R bss bs = accept_eps (run R bss) bs"
lemma run_accept_eps_Nil: "run_accept_eps R [] cs ⟷ accept_eps R cs" by (auto simp add: run_accept_eps_def run_Nil)
lemma run_accept_eps_Cons: "run_accept_eps R (bs # bss) cs ⟷ run_accept_eps (delta R bs) bss cs" by (auto simp add: run_accept_eps_def run_Cons)
lemma run_accept_eps_Cons_delta_cong: "delta R bs = delta S bs ==> run_accept_eps R (bs # bss) cs ⟷ run_accept_eps S (bs # bss) cs" unfolding run_accept_eps_Cons by auto
lemma run_accept_eps_Nil_eps: "run_accept_eps (step_eps_closure_set R bs) [] bs ⟷run_accept_eps R [] bs" unfolding run_accept_eps_Nil accept_eps_def step_eps_closure_set_idem by (rule refl)
lemma run_accept_eps_Cons_eps: "run_accept_eps (step_eps_closure_set R cs) (cs # css) bs ⟷ run_accept_eps R (cs # css) bs" unfolding run_accept_eps_Cons delta_eps by (rule refl)
lemma run_accept_eps_Nil_eps_split: assumes"step_eps_closure_set R bs = R ∪ S""step_symb_set R = {}""qf ∉ R" shows"run_accept_eps R [] bs = run_accept_eps S [] bs" unfolding Nil run_accept_eps_Nil accept_eps_def assms(1) using assms(3) step_eps_closure_set_refl step_eps_closure_set_flip[OF assms(1)] by auto
lemma run_accept_eps_Cons_eps_split: assumes"step_eps_closure_set R cs = R ∪ S""step_symb_set R = {}""qf ∉ R" shows"run_accept_eps R (cs # css) bs = run_accept_eps S (cs # css) bs" unfolding run_accept_eps_def Cons run_eps_split[OF assms(1,2)] by (rule refl)
lemma run_accept_eps_split: "run_accept_eps (R ∪ S) bss bs ⟷ run_accept_eps R bss bs ∨ run_accept_eps S bss bs" unfolding run_accept_eps_def run_split accept_eps_split by auto
qualified definition run_accept :: "state set ==> bool list list ==> bool"where "run_accept R bss = accept (run R bss)"
end
definition"iarray_of_list xs = IArray xs"
contextfixes
transs :: "transition iarray" and len :: nat begin
qualified definition step_eps' :: "bool iarray ==> state ==> state ==> bool"where "step_eps' bs q q' ⟷ q < len ∧ (case transs !! q of eps_trans p n ==> n < IArray.length bs ∧ bs !! n ∧ p = q' | split_trans p p' ==> p = q' ∨ p' = q' | _ ==> False)"
qualified definition step_eps_closure' :: "bool iarray ==> state ==> state ==> bool"where "step_eps_closure' bs = (step_eps' bs)**"
qualified definition step_eps_sucs' :: "bool iarray ==> state ==> state set"where "step_eps_sucs' bs q = (if q < len then (case transs !! q of eps_trans p n ==> if n < IArray.length bs ∧ bs !! n then {p} else {} | split_trans p p' ==> {p, p'} | _ ==> {}) else {})"
qualified definition step_eps_set' :: "bool iarray ==> state set ==> state set"where "step_eps_set' bs R = ∪(step_eps_sucs' bs ` R)"
lemma step_eps_set'_sound: "step_eps_set' bs R = {q'. ∃q ∈ R. step_eps' bs q q'}" using step_eps_sucs'_sound by (auto simp add: step_eps_set'_def)
qualified definition step_eps_closure_set' :: "state set ==> bool iarray ==> state set"where "step_eps_closure_set' R bs = ∪((λq. {q'. step_eps_closure' bs q q'}) ` R)"
lemma step_eps_closure_set'_code[code]: "step_eps_closure_set' R bs = (let R' = R ∪ step_eps_set' bs R in if R = R' then R else step_eps_closure_set' R' bs)" using rtranclp_closed by (auto simp add: step_eps_closure_set'_def step_eps_closure'_def step_eps_set'_sound Let_def)
qualified definition step_symb_sucs' :: "state ==> state set"where "step_symb_sucs' q = (if q < len then (case transs !! q of symb_trans p ==> {p} | _ ==> {}) else {})"
qualified definition step_symb_set' :: "state set ==> state set"where "step_symb_set' R = ∪(step_symb_sucs' ` R)"
qualified definition delta' :: "state set ==> bool iarray ==> state set"where "delta' R bs = step_symb_set' (step_eps_closure_set' R bs)"
qualified definition accept_eps' :: "state set ==> bool iarray ==> bool"where "accept_eps' R bs ⟷ (len ∈ step_eps_closure_set' R bs)"
qualified definition accept' :: "state set ==> bool"where "accept' R ⟷ accept_eps' R (iarray_of_list [])"
qualified definition run' :: "state set ==> bool iarray list ==> state set"where "run' R bss = foldl delta' R bss"
qualified definition run_accept_eps' :: "state set ==> bool iarray list ==> bool iarray ==> bool"where "run_accept_eps' R bss bs = accept_eps' (run' R bss) bs"
qualified definition run_accept' :: "state set ==> bool iarray list ==> bool"where "run_accept' R bss = accept' (run' R bss)"
end
locale nfa_array = fixes transs :: "transition list" and transs' :: "transition iarray" and len :: nat assumes transs_eq: "transs' = IArray transs" and len_def: "len = length transs" begin
lemma Q_diff_qf_SQ: "Q - {qf} = SQ" using qf_not_in_SQ by (auto simp add: NFA.Q_def)
lemma q0_sub_SQ: "{q0} ⊆ SQ" using transs_not_Nil by (auto simp add: NFA.SQ_def)
lemma q0_sub_Q: "{q0} ⊆ Q" using q0_sub_SQ SQ_sub_Q by auto
lemma step_eps_closed: "step_eps bs q q' ==> q' ∈ Q" using transs_q_in_set state_closed by (fastforce simp add: NFA.step_eps_def split: transition.splits)
lemma step_eps_set_closed: "step_eps_set bs R ⊆ Q" using step_eps_closed by (auto simp add: step_eps_set_sound)
lemma step_eps_closure_closed: "step_eps_closure bs q q' ==> q ≠ q' ==> q' ∈ Q" unfolding NFA.step_eps_closure_def apply (induction q q' rule: rtranclp.induct) using step_eps_closed by auto
lemma step_eps_closure_set_closed_union: "step_eps_closure_set R bs ⊆ R ∪ Q" using step_eps_closure_closed by (auto simp add: NFA.step_eps_closure_set_def NFA.step_eps_closure_def)
lemma step_eps_closure_set_closed: "R ⊆ Q ==> step_eps_closure_set R bs ⊆ Q" using step_eps_closure_set_closed_union by auto
lemma step_symb_closed: "step_symb q q' ==> q' ∈ Q" using transs_q_in_set state_closed by (fastforce simp add: NFA.step_symb_def split: transition.splits)
lemma step_symb_set_closed: "step_symb_set R ⊆ Q" using step_symb_closed by (auto simp add: NFA.step_symb_set_def)
lemma step_symb_set_qf: "step_symb_set {qf} = {}" using qf_not_in_SQ step_symb_set_proj[of _ _ "{qf}"] step_symb_set_empty by auto
lemma delta_closed: "delta R bs ⊆ Q" using step_symb_set_closed by (auto simp add: NFA.delta_def)
lemma run_closed_Cons: "run R (bs # bss) ⊆ Q" unfolding NFA.run_def using delta_closed by (induction bss arbitrary: R bs) auto
lemma run_closed: "R ⊆ Q ==> run R bss ⊆ Q" using run_Nil run_closed_Cons by (cases bss) auto
(* transitions from accepting state *)
lemma step_eps_qf: "step_eps bs qf q ⟷ False" using qf_not_in_SQ step_eps_dest by force
lemma step_symb_qf: "step_symb qf q ⟷ False" using qf_not_in_SQ step_symb_dest by force
lemma step_eps_closure_qf: "step_eps_closure bs q q' ==> q = qf ==> q = q'" unfolding NFA.step_eps_closure_def apply (induction q q' rule: rtranclp.induct) using step_eps_qf by auto
lemma step_eps_closure_set_qf: "step_eps_closure_set {qf} bs = {qf}" using step_eps_closure_qf unfolding NFA.step_eps_closure_set_def NFA.step_eps_closure_def by auto
lemma delta_qf: "delta {qf} bs = {}" using step_eps_closure_qf step_symb_qf by (auto simp add: NFA.delta_def NFA.step_symb_set_def NFA.step_eps_closure_set_def)
lemma step_symb_set_cong: "R ⊆ nfa'.Q ==> step_symb_set R = nfa'.step_symb_set R" using step_symb_cong by (auto simp add: NFA.step_symb_set_def)
lemma delta_cong: "R ⊆ nfa'.Q ==> delta R bs = nfa'.delta R bs" using step_symb_set_cong nfa'.step_eps_closure_set_closed by (auto simp add: NFA.delta_def step_eps_closure_set_cong)
lemma run_cong: "R ⊆ nfa'.Q ==> run R bss = nfa'.run R bss" unfolding NFA.run_def using nfa'.delta_closed delta_cong by (induction bss arbitrary: R) auto
lemma accept_eps_cong: "R ⊆ nfa'.Q ==> accept_eps R bs ⟷ nfa'.accept_eps R bs" unfolding NFA.accept_eps_def using step_eps_closure_set_cong qf_eq by auto
lemma run_accept_eps_cong: assumes"R ⊆ nfa'.Q" shows"run_accept_eps R bss bs ⟷ nfa'.run_accept_eps R bss bs" unfolding NFA.run_accept_eps_def run_cong[OF assms]
accept_eps_cong[OF nfa'.run_closed[OF assms]] by simp
end
fun list_split :: "'a list ==> ('a list × 'a list) set"where "list_split [] = {}"
| "list_split (x # xs) = {([], x # xs)} ∪ (∪(ys, zs) ∈ list_split xs. {(x # ys, zs)})"
lemma list_split_unfold: "(∪(ys, zs) ∈ list_split (x # xs). f ys zs) = f [] (x # xs) ∪ (∪(ys, zs) ∈ list_split xs. f (x # ys) zs)" by (induction xs) auto
lemma list_split_def: "list_split xs = (∪n < length xs. {(take n xs, drop n xs)})" using less_Suc_eq_0_disj by (induction xs rule: list_split.induct) auto+
lemma nfa'_step_eps_closure_set_sub: "R ⊆ nfa'.Q ==> nfa'.step_eps_closure_set R bs ⊆ step_eps_closure_set R bs" unfolding NFA.step_eps_closure_set_def using nfa'_step_eps_closure_cong by fastforce
lemma step_eps_closure_set_cong_reach: "R ⊆ nfa'.Q ==> qf' ∈ nfa'.step_eps_closure_set R bs ==> step_eps_closure_set R bs = nfa'.step_eps_closure_set R bs ∪ step_eps_closure_set {qf'} bs" using eps_nfa'_step_eps_closure_cong nfa'_eps_step_eps_closure_cong
rtranclp_trans[of "step_eps bs"] unfolding NFA.step_eps_closure_set_def NFA.step_eps_closure_def by auto blast+
lemma step_eps_closure_set_cong_unreach: "R ⊆ nfa'.Q ==> qf' ∉ nfa'.step_eps_closure_set R bs ==> step_eps_closure_set R bs = nfa'.step_eps_closure_set R bs" using eps_nfa'_step_eps_closure_cong nfa'_eps_step_eps_closure_cong unfolding NFA.step_eps_closure_set_def NFA.step_eps_closure_def by auto blast+
lemma step_symb_cong_Q: "nfa'.step_symb q q' ==> step_symb q q'" using SQ_sub transs_eq by (auto simp add: NFA.step_symb_def)
lemma step_symb_set_cong_SQ: "R ⊆ nfa'.SQ ==> step_symb_set R = nfa'.step_symb_set R" using step_symb_cong_SQ by (auto simp add: NFA.step_symb_set_def)
lemma step_symb_set_cong_Q: "nfa'.step_symb_set R ⊆ step_symb_set R" using step_symb_cong_Q by (auto simp add: NFA.step_symb_set_def)
lemma delta_cong_unreach: assumes"R ⊆ nfa'.Q""¬nfa'.accept_eps R bs" shows"delta R bs = nfa'.delta R bs" proof - have"nfa'.step_eps_closure_set R bs ⊆ nfa'.SQ" using nfa'.step_eps_closure_set_closed[OF assms(1), unfolded NFA.Q_def]
assms(2)[unfolded NFA.accept_eps_def] by auto thenshow ?thesis unfolding NFA.accept_eps_def NFA.delta_def using step_symb_set_cong_SQ
step_eps_closure_set_cong_unreach[OF assms(1) assms(2)[unfolded NFA.accept_eps_def]] by auto qed
lemma nfa'_delta_sub_delta: assumes"R ⊆ nfa'.Q" shows"nfa'.delta R bs ⊆ delta R bs" unfolding NFA.delta_def using step_symb_set_mono[OF nfa'_step_eps_closure_set_sub[OF assms]] step_symb_set_cong_Q by fastforce
lemma delta_cong_reach: assumes"R ⊆ nfa'.Q""nfa'.accept_eps R bs" shows"delta R bs = nfa'.delta R bs ∪ delta {qf'} bs" proof (rule set_eqI, rule iffI) fix q assume assm: "q ∈ delta R bs" have nfa'_eps_diff_Un: "nfa'.step_eps_closure_set R bs = nfa'.step_eps_closure_set R bs - {qf'} ∪ {qf'}" using assms(2)[unfolded NFA.accept_eps_def] by auto from assm have"q ∈ step_symb_set (nfa'.step_eps_closure_set R bs - {qf'}) ∪ step_symb_set {qf'} ∪ delta {qf'} bs" unfolding NFA.delta_def step_eps_closure_set_cong_reach[OF assms(1)
assms(2)[unfolded NFA.accept_eps_def]] step_symb_set_split[symmetric]
nfa'_eps_diff_Un[symmetric] by simp thenhave"q ∈ step_symb_set (nfa'.step_eps_closure_set R bs - {qf'}) ∪ delta {qf'} bs" using step_symb_set_mono[of "{qf'}""step_eps_closure_set {qf'} bs",
OF step_eps_closure_set_refl, unfolded NFA.delta_def[symmetric]]
delta_step_symb_set_absorb by blast thenshow"q ∈ nfa'.delta R bs ∪ delta {qf'} bs" unfolding NFA.delta_def using nfa'.step_eps_closure_set_closed[OF assms(1), unfolded NFA.Q_def]
step_symb_set_cong_SQ[of "nfa'.step_eps_closure_set R bs - {qf'}"]
step_symb_set_mono by blast next fix q assume"q ∈ nfa'.delta R bs ∪ delta {qf'} bs" thenshow"q ∈ delta R bs" using nfa'_delta_sub_delta[OF assms(1)] delta_sub_eps_mono[of "{qf'}" _ _ R bs]
assms(2)[unfolded NFA.accept_eps_def] nfa'_step_eps_closure_set_sub[OF assms(1)] by fastforce qed
lemma run_cong: assumes"R ⊆ nfa'.Q" shows"run R bss = nfa'.run R bss ∪ (∪(css, css') ∈ list_split bss. if nfa'.run_accept_eps R css (hd css') then run {qf'} css' else {})" using assms proof (induction bss arbitrary: R rule: list_split.induct) case1 thenshow ?case using run_Nil by simp next case (2 x xs) show ?case apply (cases "nfa'.accept_eps R x") unfolding run_Cons delta_cong_reach[OF 2(2)]
delta_cong_unreach[OF 2(2)] run_split run_accept_eps_Nil run_accept_eps_Cons
list_split_unfold[of "λys zs. if nfa'.run_accept_eps R ys (hd zs) then run {qf'} zs else {}" x xs] using2(1)[of "nfa'.delta R x",
OF nfa'.delta_closed, unfolded run_accept_eps_Nil] by auto qed
lemma run_cong_Cons_sub: assumes"R ⊆ nfa'.Q""delta {qf'} bs ⊆ nfa'.delta R bs" shows"run R (bs # bss) = nfa'.run R (bs # bss) ∪ (∪(css, css') ∈ list_split bss. if nfa'.run_accept_eps (nfa'.delta R bs) css (hd css') then run {qf'} css' else {})" unfolding run_Cons using run_cong[OF nfa'.delta_closed]
delta_cong_reach[OF assms(1)] delta_cong_unreach[OF assms(1)] by (cases "nfa'.accept_eps R bs") (auto simp add: Un_absorb2[OF assms(2)])
lemma accept_eps_nfa'_run: assumes"R ⊆ nfa'.Q" shows"accept_eps (nfa'.run R bss) bs ⟷ nfa'.accept_eps (nfa'.run R bss) bs ∧ accept_eps (run {qf'} []) bs" unfolding NFA.accept_eps_def run_Nil using step_eps_closure_set_cong_reach[OF nfa'.run_closed[OF assms]]
step_eps_closure_set_cong_unreach[OF nfa'.run_closed[OF assms]] qf_not_in_SQ
qf'_in_SQ nfa'.step_eps_closure_set_closed[OF nfa'.run_closed[OF assms],
unfolded NFA.Q_def] SQ_sub by (cases "qf' ∈ nfa'.step_eps_closure_set (nfa'.run R bss) bs") fastforce+
lemma run_accept_eps_cong: assumes"R ⊆ nfa'.Q" shows"run_accept_eps R bss bs ⟷ (nfa'.run_accept_eps R bss bs ∧ run_accept_eps {qf'} [] bs) ∨ (∃(css, css') ∈ list_split bss. nfa'.run_accept_eps R css (hd css') ∧ run_accept_eps {qf'} css' bs)" unfolding NFA.run_accept_eps_def run_cong[OF assms] accept_eps_split
accept_eps_Un accept_eps_nfa'_run[OF assms] using accept_eps_empty by (auto split: if_splits)+
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.