diff --git a/thys/CAVA_Automata/Digraph_Basic.thy b/thys/CAVA_Automata/Digraph_Basic.thy --- a/thys/CAVA_Automata/Digraph_Basic.thy +++ b/thys/CAVA_Automata/Digraph_Basic.thy @@ -1,695 +1,692 @@ section \Relations interpreted as Directed Graphs\ theory Digraph_Basic imports "Automatic_Refinement.Misc" "Automatic_Refinement.Refine_Util" "HOL-Library.Omega_Words_Fun" begin text \ This theory contains some basic graph theory on directed graphs which are modeled as a relation between nodes. The theory here is very fundamental, and also used by non-directly graph-related applications like the theory of tail-recursion in the Refinement Framework. Thus, we decided to put it in the basic theories of the refinement framework. \ text \Directed graphs are modeled as a relation on nodes\ type_synonym 'v digraph = "('v\'v) set" locale digraph = fixes E :: "'v digraph" subsection \Paths\ text \Path are modeled as list of nodes, the last node of a path is not included into the list. This formalization allows for nice concatenation and splitting of paths.\ inductive path :: "'v digraph \ 'v \ 'v list \ 'v \ bool" for E where path0: "path E u [] u" | path_prepend: "\ (u,v)\E; path E v l w \ \ path E u (u#l) w" lemma path1: "(u,v)\E \ path E u [u] v" by (auto intro: path.intros) lemma path_empty_conv[simp]: "path E u [] v \ u=v" by (auto intro: path0 elim: path.cases) inductive_cases path_uncons: "path E u (u'#l) w" inductive_simps path_cons_conv: "path E u (u'#l) w" lemma path_no_edges[simp]: "path {} u p v \ (u=v \ p=[])" by (cases p) (auto simp: path_cons_conv) lemma path_conc: assumes P1: "path E u la v" assumes P2: "path E v lb w" shows "path E u (la@lb) w" using P1 P2 apply induct by (auto intro: path.intros) lemma path_append: "\ path E u l v; (v,w)\E \ \ path E u (l@[v]) w" using path_conc[OF _ path1] . lemma path_unconc: assumes "path E u (la@lb) w" obtains v where "path E u la v" and "path E v lb w" using assms thm path.induct apply (induct u "la@lb" w arbitrary: la lb rule: path.induct) apply (auto intro: path.intros elim!: list_Cons_eq_append_cases) done lemma path_conc_conv: "path E u (la@lb) w \ (\v. path E u la v \ path E v lb w)" by (auto intro: path_conc elim: path_unconc) lemma (in -) path_append_conv: "path E u (p@[v]) w \ (path E u p v \ (v,w)\E)" by (simp add: path_cons_conv path_conc_conv) lemmas path_simps = path_empty_conv path_cons_conv path_conc_conv lemmas path_trans[trans] = path_prepend path_conc path_append lemma path_from_edges: "\(u,v)\E; (v,w)\E\ \ path E u [u] v" by (auto simp: path_simps) lemma path_edge_cases[case_names no_use split]: assumes "path (insert (u,v) E) w p x" obtains "path E w p x" | p1 p2 where "path E w p1 u" "path (insert (u,v) E) v p2 x" using assms apply induction apply simp apply (clarsimp) apply (metis path_simps path_cons_conv) done lemma path_edge_rev_cases[case_names no_use split]: assumes "path (insert (u,v) E) w p x" obtains "path E w p x" | p1 p2 where "path (insert (u,v) E) w p1 u" "path E v p2 x" using assms apply (induction p arbitrary: x rule: rev_induct) apply simp apply (clarsimp simp: path_cons_conv path_conc_conv) apply (metis path_simps path_append_conv) done lemma path_mono: assumes S: "E\E'" assumes P: "path E u p v" shows "path E' u p v" using P apply induction apply simp using S apply (auto simp: path_cons_conv) done lemma path_is_rtrancl: assumes "path E u l v" shows "(u,v)\E\<^sup>*" using assms by induct auto lemma rtrancl_is_path: assumes "(u,v)\E\<^sup>*" obtains l where "path E u l v" using assms by induct (auto intro: path0 path_append) lemma path_is_trancl: assumes "path E u l v" and "l\[]" shows "(u,v)\E\<^sup>+" using assms apply induct apply auto [] apply (case_tac l) apply auto done lemma trancl_is_path: assumes "(u,v)\E\<^sup>+" obtains l where "l\[]" and "path E u l v" using assms by induct (auto intro: path0 path_append) lemma path_nth_conv: "path E u p v \ (let p'=p@[v] in u=p'!0 \ (\iE))" apply (induct p arbitrary: v rule: rev_induct) apply (auto simp: path_conc_conv path_cons_conv nth_append) done lemma path_mapI: assumes "path E u p v" shows "path (pairself f ` E) (f u) (map f p) (f v)" using assms apply induction apply (simp) apply (force simp: path_cons_conv) done lemma path_restrict: assumes "path E u p v" shows "path (E \ set p \ insert v (set (tl p))) u p v" using assms proof induction print_cases case (path_prepend u v p w) from path_prepend.IH have "path (E \ set (u#p) \ insert w (set p)) v p w" apply (rule path_mono[rotated]) by (cases p) auto thus ?case using \(u,v)\E\ by (cases p) (auto simp add: path_cons_conv) qed auto lemma path_restrict_closed: assumes CLOSED: "E``D \ D" assumes I: "v\D" and P: "path E v p v'" shows "path (E\D\D) v p v'" using P CLOSED I by induction (auto simp: path_cons_conv) lemma path_set_induct: assumes "path E u p v" and "u\I" and "E``I \ I" shows "set p \ I" using assms by (induction rule: path.induct) auto lemma path_nodes_reachable: "path E u p v \ insert v (set p) \ E\<^sup>*``{u}" apply (auto simp: in_set_conv_decomp path_cons_conv path_conc_conv) apply (auto dest!: path_is_rtrancl) done lemma path_nodes_edges: "path E u p v \ set p \ fst`E" by (induction rule: path.induct) auto lemma path_tl_nodes_edges: assumes "path E u p v" shows "set (tl p) \ fst`E \ snd`E" proof - from path_nodes_edges[OF assms] have "set (tl p) \ fst`E" by (cases p) auto moreover have "set (tl p) \ snd`E" using assms apply (cases) apply simp apply simp apply (erule path_set_induct[where I = "snd`E"]) apply auto done ultimately show ?thesis by auto qed lemma path_loop_shift: assumes P: "path E u p u" assumes S: "v\set p" obtains p' where "set p' = set p" "path E v p' v" proof - from S obtain p1 p2 where [simp]: "p = p1@v#p2" by (auto simp: in_set_conv_decomp) from P obtain v' where A: "path E u p1 v" "(v, v') \ E" "path E v' p2 u" by (auto simp: path_simps) hence "path E v (v#p2@p1) v" by (auto simp: path_simps) thus ?thesis using that[of "v#p2@p1"] by auto qed lemma path_hd: assumes "p \ []" "path E v p w" shows "hd p = v" using assms by (auto simp: path_cons_conv neq_Nil_conv) lemma path_last_is_edge: assumes "path E x p y" and "p \ []" shows "(last p, y) \ E" using assms by (auto simp: neq_Nil_rev_conv path_simps) lemma path_member_reach_end: assumes P: "path E x p y" and v: "v \ set p" shows "(v,y) \ E\<^sup>+" using assms by (auto intro!: path_is_trancl simp: in_set_conv_decomp path_simps) lemma path_tl_induct[consumes 2, case_names single step]: assumes P: "path E x p y" and NE: "x \ y" and S: "\u. (x,u) \ E \ P x u" and ST: "\u v. \(x,u) \ E\<^sup>+; (u,v) \ E; P x u\ \ P x v" shows "P x y \ (\ v \ set (tl p). P x v)" proof - from P NE have "p \ []" by auto thus ?thesis using P proof (induction p arbitrary: y rule: rev_nonempty_induct) case (single u) hence "(x,y) \ E" by (simp add: path_cons_conv) with S show ?case by simp next case (snoc u us) hence "path E x us u" by (simp add: path_append_conv) with snoc path_is_trancl have "P x u" "(x,u) \ E\<^sup>+" "\v \ set (tl us). P x v" by simp_all moreover with snoc have "\v \ set (tl (us@[u])). P x v" by simp moreover from snoc have "(u,y) \ E" by (simp add: path_append_conv) ultimately show ?case by (auto intro: ST) qed qed lemma path_restrict_tl: "\ u\R; path (E \ UNIV \ -R) u p v \ \ path (rel_restrict E R) u p v" apply (induction p arbitrary: u) apply (auto simp: path_simps rel_restrict_def) done lemma path1_restr_conv: "path (E\UNIV \ -R) u (x#xs) v \ (\w. w\R \ x=u \ (u,w)\E \ path (rel_restrict E R) w xs v)" proof - have 1: "rel_restrict E R \ E \ UNIV \ - R" by (auto simp: rel_restrict_def) show ?thesis by (auto simp: path_simps intro: path_restrict_tl path_mono[OF 1]) qed lemma dropWhileNot_path: assumes "p \ []" and "path E w p x" and "v \ set p" and "dropWhile ((\) v) p = c" shows "path E v c x" using assms proof (induction arbitrary: w c rule: list_nonempty_induct) case (single p) thus ?case by (auto simp add: path_simps) next case (cons p ps) hence [simp]: "w = p" by (simp add: path_cons_conv) show ?case proof (cases "p=v") case True with cons show ?thesis by simp next case False with cons have "c = dropWhile ((\) v) ps" by simp moreover from cons.prems obtain y where "path E y ps x" using path_uncons by metis moreover from cons.prems False have "v \ set ps" by simp ultimately show ?thesis using cons.IH by metis qed qed lemma takeWhileNot_path: assumes "p \ []" and "path E w p x" and "v \ set p" and "takeWhile ((\) v) p = c" shows "path E w c v" using assms proof (induction arbitrary: w c rule: list_nonempty_induct) case (single p) thus ?case by (auto simp add: path_simps) next case (cons p ps) hence [simp]: "w = p" by (simp add: path_cons_conv) show ?case proof (cases "p=v") case True with cons show ?thesis by simp next case False with cons obtain c' where "c' = takeWhile ((\) v) ps" and [simp]: "c = p#c'" by simp_all moreover from cons.prems obtain y where "path E y ps x" and "(w,y) \ E" using path_uncons by metis+ moreover from cons.prems False have "v \ set ps" by simp ultimately have "path E y c' v" using cons.IH by metis with \(w,y) \ E\ show ?thesis by (auto simp add: path_cons_conv) qed qed subsection \Infinite Paths\ definition ipath :: "'q digraph \ 'q word \ bool" \ \Predicate for an infinite path in a digraph\ where "ipath E r \ \i. (r i, r (Suc i))\E" lemma ipath_conc_conv: "ipath E (u \ v) \ (\a. path E a u (v 0) \ ipath E v)" apply (auto simp: conc_def ipath_def path_nth_conv nth_append) apply (metis add_Suc_right diff_add_inverse not_add_less1) by (metis Suc_diff_Suc diff_Suc_Suc not_less_eq) lemma ipath_iter_conv: assumes "p\[]" shows "ipath E (p\<^sup>\) \ (path E (hd p) p (hd p))" proof (cases p) case Nil thus ?thesis using assms by simp next case (Cons u p') hence PLEN: "length p > 0" by simp show ?thesis proof assume "ipath E (iter (p))" hence "\i. (iter (p) i, iter (p) (Suc i)) \ E" unfolding ipath_def by simp hence "(\iE)" apply (simp add: assms) apply safe apply (drule_tac x=i in spec) apply simp apply (case_tac "Suc i = length p") apply (simp add: Cons) apply (simp add: nth_append) done thus "path E (hd p) p (hd p)" by (auto simp: path_nth_conv Cons nth_append nth_Cons') next assume "path E (hd p) p (hd p)" thus "ipath E (iter p)" apply (auto simp: path_nth_conv ipath_def assms Let_def) apply (drule_tac x="i mod length p" in spec) apply (auto simp: nth_append assms split: if_split_asm) apply (metis less_not_refl mod_Suc) by (metis PLEN diff_self_eq_0 mod_Suc nth_Cons_0 mod_less_divisor) qed qed lemma ipath_to_rtrancl: assumes R: "ipath E r" assumes I: "i1\i2" shows "(r i1,r i2)\E\<^sup>*" using I proof (induction i2) case (Suc i2) show ?case proof (cases "i1=Suc i2") assume "i1\Suc i2" with Suc have "(r i1,r i2)\E\<^sup>*" by auto also from R have "(r i2,r (Suc i2))\E" unfolding ipath_def by auto finally show ?thesis . qed simp qed simp lemma ipath_to_trancl: assumes R: "ipath E r" assumes I: "i1E\<^sup>+" proof - from R have "(r i1,r (Suc i1))\E" by (auto simp: ipath_def) also have "(r (Suc i1),r i2)\E\<^sup>*" using ipath_to_rtrancl[OF R,of "Suc i1" i2] I by auto finally (rtrancl_into_trancl2) show ?thesis . qed lemma run_limit_two_connectedI: assumes A: "ipath E r" assumes B: "a \ limit r" "b\limit r" shows "(a,b)\E\<^sup>+" proof - from B have "{a,b} \ limit r" by simp with A show ?thesis by (metis ipath_to_trancl two_in_limit_iff) qed lemma ipath_subpath: assumes P: "ipath E r" assumes LE: "l\u" shows "path E (r l) (map r [l..Suc n = u-l\ \l\u\ obtain u' where [simp]: "u=Suc u'" and A: "n=u'-l" "l \ u'" by (cases u) auto note IH[OF A] also from P have "(r u',r u)\E" by (auto simp: ipath_def) finally show ?case using \l \ u'\ by (simp add: upt_Suc_append) qed auto lemma ipath_restrict_eq: "ipath (E \ (E\<^sup>*``{r 0} \ E\<^sup>*``{r 0})) r \ ipath E r" unfolding ipath_def by (auto simp: relpow_fun_conv rtrancl_power) lemma ipath_restrict: "ipath E r \ ipath (E \ (E\<^sup>*``{r 0} \ E\<^sup>*``{r 0})) r" by (simp add: ipath_restrict_eq) lemma ipathI[intro?]: "\\i. (r i, r (Suc i)) \ E\ \ ipath E r" unfolding ipath_def by auto lemma ipathD: "ipath E r \ (r i, r (Suc i)) \ E" unfolding ipath_def by auto lemma ipath_in_Domain: "ipath E r \ r i \ Domain E" unfolding ipath_def by auto lemma ipath_in_Range: "\ipath E r; i\0\ \ r i \ Range E" unfolding ipath_def by (cases i) auto lemma ipath_suffix: "ipath E r \ ipath E (suffix i r)" unfolding suffix_def ipath_def by auto subsection \Strongly Connected Components\ text \A strongly connected component is a maximal mutually connected set of nodes\ definition is_scc :: "'q digraph \ 'q set \ bool" where "is_scc E U \ U\U\E\<^sup>* \ (\V. V\U \ \ (V\V\E\<^sup>*))" lemma scc_non_empty[simp]: "\is_scc E {}" unfolding is_scc_def by auto lemma scc_non_empty'[simp]: "is_scc E U \ U\{}" unfolding is_scc_def by auto lemma is_scc_closed: assumes SCC: "is_scc E U" assumes MEM: "x\U" assumes P: "(x,y)\E\<^sup>*" "(y,x)\E\<^sup>*" shows "y\U" proof - from SCC MEM P have "insert y U \ insert y U \ E\<^sup>*" unfolding is_scc_def apply clarsimp apply rule apply clarsimp_all apply (erule disjE1) apply clarsimp apply (metis in_mono mem_Sigma_iff rtrancl_trans) apply auto [] - apply (erule disjE1) - apply clarsimp apply (metis in_mono mem_Sigma_iff rtrancl_trans) - apply auto [] done with SCC show ?thesis unfolding is_scc_def by blast qed lemma is_scc_connected: assumes SCC: "is_scc E U" assumes MEM: "x\U" "y\U" shows "(x,y)\E\<^sup>*" using assms unfolding is_scc_def by auto text \In the following, we play around with alternative characterizations, and prove them all equivalent .\ text \A common characterization is to define an equivalence relation ,,mutually connected'' on nodes, and characterize the SCCs as its equivalence classes:\ definition mconn :: "('a\'a) set \ ('a \ 'a) set" \ \Mutually connected relation on nodes\ where "mconn E = E\<^sup>* \ (E\)\<^sup>*" lemma mconn_pointwise: "mconn E = {(u,v). (u,v)\E\<^sup>* \ (v,u)\E\<^sup>*}" by (auto simp add: mconn_def rtrancl_converse) text \\mconn\ is an equivalence relation:\ lemma mconn_refl[simp]: "Id\mconn E" by (auto simp add: mconn_def) lemma mconn_sym: "mconn E = (mconn E)\" by (auto simp add: mconn_pointwise) lemma mconn_trans: "mconn E O mconn E = mconn E" by (auto simp add: mconn_def) lemma mconn_refl': "refl (mconn E)" by (auto intro: refl_onI simp: mconn_pointwise) lemma mconn_sym': "sym (mconn E)" by (auto intro: symI simp: mconn_pointwise) lemma mconn_trans': "trans (mconn E)" by (metis mconn_def trans_Int trans_rtrancl) lemma mconn_equiv: "equiv UNIV (mconn E)" using mconn_refl' mconn_sym' mconn_trans' by (rule equivI) lemma is_scc_mconn_eqclasses: "is_scc E U \ U \ UNIV // mconn E" \ \The strongly connected components are the equivalence classes of the mutually-connected relation on nodes\ proof assume A: "is_scc E U" then obtain x where "x\U" unfolding is_scc_def by auto hence "U = mconn E `` {x}" using A unfolding mconn_pointwise is_scc_def apply clarsimp apply rule apply auto [] apply clarsimp by (metis A is_scc_closed) thus "U \ UNIV // mconn E" by (auto simp: quotient_def) next assume "U \ UNIV // mconn E" thus "is_scc E U" by (auto simp: is_scc_def mconn_pointwise quotient_def) qed (* For presentation in the paper *) lemma "is_scc E U \ U \ UNIV // (E\<^sup>* \ (E\)\<^sup>*)" unfolding is_scc_mconn_eqclasses mconn_def by simp text \We can also restrict the notion of "reachability" to nodes inside the SCC \ lemma find_outside_node: assumes "(u,v)\E\<^sup>*" assumes "(u,v)\(E\U\U)\<^sup>*" assumes "u\U" "v\U" shows "\u'. u'\U \ (u,u')\E\<^sup>* \ (u',v)\E\<^sup>*" using assms apply (induction) apply auto [] apply clarsimp by (metis IntI mem_Sigma_iff rtrancl.simps) lemma is_scc_restrict1: assumes SCC: "is_scc E U" shows "U\U\(E\U\U)\<^sup>*" using assms unfolding is_scc_def apply clarsimp apply (rule ccontr) apply (drule (2) find_outside_node[rotated]) apply auto [] by (metis is_scc_closed[OF SCC] mem_Sigma_iff rtrancl_trans subsetD) lemma is_scc_restrict2: assumes SCC: "is_scc E U" assumes "V\U" shows "\ (V\V\(E\V\V)\<^sup>*)" using assms unfolding is_scc_def apply clarsimp using rtrancl_mono[of "E \ V \ V" "E"] apply clarsimp apply blast done lemma is_scc_restrict3: assumes SCC: "is_scc E U" shows "((E\<^sup>*``((E\<^sup>*``U) - U)) \ U = {})" apply auto by (metis assms is_scc_closed is_scc_connected rtrancl_trans) lemma is_scc_alt_restrict_path: "is_scc E U \ U\{} \ (U\U \ (E\U\U)\<^sup>*) \ ((E\<^sup>*``((E\<^sup>*``U) - U)) \ U = {})" apply rule apply (intro conjI) apply simp apply (blast dest: is_scc_restrict1) apply (blast dest: is_scc_restrict3) unfolding is_scc_def apply rule apply clarsimp apply (metis (full_types) Int_lower1 in_mono mem_Sigma_iff rtrancl_mono_mp) apply blast done lemma is_scc_pointwise: "is_scc E U \ U\{} \ (\u\U. \v\U. (u,v)\(E\U\U)\<^sup>*) \ (\u\U. \v. (v\U \ (u,v)\E\<^sup>*) \ (\u'\U. (v,u')\E\<^sup>*))" \ \Alternative, pointwise characterization\ unfolding is_scc_alt_restrict_path by blast lemma is_scc_unique: assumes SCC: "is_scc E scc" "is_scc E scc'" and v: "v \ scc" "v \ scc'" shows "scc = scc'" proof - from SCC have "scc = scc' \ scc \ scc' = {}" using quotient_disj[OF mconn_equiv] by (simp add: is_scc_mconn_eqclasses) with v show ?thesis by auto qed lemma is_scc_ex1: "\!scc. is_scc E scc \ v \ scc" proof (rule ex1I, rule conjI) let ?scc = "mconn E `` {v}" have "?scc \ UNIV // mconn E" by (auto intro: quotientI) thus "is_scc E ?scc" by (simp add: is_scc_mconn_eqclasses) moreover show "v \ ?scc" by (blast intro: refl_onD[OF mconn_refl']) ultimately show "\scc. is_scc E scc \ v \ scc \ scc = ?scc" by (metis is_scc_unique) qed lemma is_scc_ex: "\scc. is_scc E scc \ v \ scc" by (metis is_scc_ex1) lemma is_scc_connected': "\is_scc E scc; x \ scc; y \ scc\ \ (x,y)\(Restr E scc)\<^sup>*" unfolding is_scc_pointwise by blast definition scc_of :: "('v\'v) set \ 'v \ 'v set" where "scc_of E v = (THE scc. is_scc E scc \ v \ scc)" lemma scc_of_is_scc[simp]: "is_scc E (scc_of E v)" using is_scc_ex1[of E v] by (auto dest!: theI' simp: scc_of_def) lemma node_in_scc_of_node[simp]: "v \ scc_of E v" using is_scc_ex1[of E v] by (auto dest!: theI' simp: scc_of_def) lemma scc_of_unique: assumes "w \ scc_of E v" shows "scc_of E v = scc_of E w" proof - have "is_scc E (scc_of E v)" by simp moreover note assms moreover have "is_scc E (scc_of E w)" by simp moreover have "w \ scc_of E w" by simp ultimately show ?thesis using is_scc_unique by metis qed end diff --git a/thys/Statecharts/HAOps.thy b/thys/Statecharts/HAOps.thy --- a/thys/Statecharts/HAOps.thy +++ b/thys/Statecharts/HAOps.thy @@ -1,1117 +1,1111 @@ (* Title: statecharts/HA/HAOps.thy Author: Steffen Helke, Software Engineering Group Copyright 2010 Technische Universitaet Berlin *) section \Constructing Hierarchical Automata\ theory HAOps imports HA begin subsection "Constructing a Composition Function for a PseudoHA" definition EmptyMap :: "'s set => ('s \ (('s,'e,'d)seqauto) set)" where "EmptyMap S = (\ a . if a \ S then Some {} else None)" lemma EmptyMap_dom [simp]: "dom (EmptyMap S) = S" by (unfold dom_def EmptyMap_def,auto) lemma EmptyMap_ran [simp]: "S \ {} \ ran (EmptyMap S) = {{}}" by (unfold ran_def EmptyMap_def, auto) lemma EmptyMap_the [simp]: "x \ S \ the ((EmptyMap S) x) = {}" by (unfold ran_def EmptyMap_def, auto) lemma EmptyMap_ran_override: "\ S \ {}; (S \ (dom G)) = {} \ \ ran (G ++ EmptyMap S) = insert {} (ran G)" apply (subst ran_override) apply (simp add: Int_commute) apply simp done lemma EmptyMap_Union_ran_override: "\ S \ {}; S \ dom G = {} \ \ (Union (ran (G ++ (EmptyMap S)))) = (Union (ran G))" apply (subst EmptyMap_ran_override) apply auto done lemma EmptyMap_Union_ran_override2: "\ S \ {}; S \ dom G1 = {}; dom G1 \ dom G2 = {} \ \ \ (ran (G1 ++ EmptyMap S ++ G2)) = (\ (ran G1 \ ran G2))" apply (unfold Union_eq UNION_eq EmptyMap_def Int_def ran_def) apply (simp add: map_add_Some_iff) apply (unfold dom_def) apply simp apply (rule equalityI) apply (rule subsetI) apply simp apply fast apply (rule subsetI) apply (rename_tac t) apply simp apply (erule bexE) apply (rename_tac U) apply simp apply (erule disjE) apply (erule exE) apply (rename_tac v) apply (rule_tac x=U in exI) apply simp apply (rule_tac x=v in exI) apply auto done lemma EmptyMap_Root [simp]: "Root {SA} (EmptyMap (States SA)) = SA" by (unfold Root_def, auto) lemma EmptyMap_RootEx [simp]: "RootEx {SA} (EmptyMap (States SA))" by (unfold RootEx_def, auto) lemma EmptyMap_OneAncestor [simp]: "OneAncestor {SA} (EmptyMap (States SA))" by (unfold OneAncestor_def, auto) lemma EmptyMap_NoCycles [simp]: "NoCycles {SA} (EmptyMap (States SA))" by (unfold NoCycles_def EmptyMap_def , auto) lemma EmptyMap_IsCompFun [simp]: "IsCompFun {SA} (EmptyMap (States SA))" by (unfold IsCompFun_def, auto) lemma EmptyMap_hierauto [simp]: "(D,{SA}, SAEvents SA, EmptyMap (States SA)) \ hierauto" by (unfold hierauto_def HierAuto_def, auto) subsection "Extending a Composition Function by a SA" definition FAddSA :: "[('s \ (('s,'e,'d)seqauto) set), 's * ('s,'e,'d)seqauto] => ('s \ (('s,'e,'d)seqauto) set)" ("(_ [f+]/ _)" [10,11]10) where "FAddSA G SSA = (let (S,SA) = SSA in (if ((S \ dom G) \ (S \ States SA)) then (G ++ (Map.empty(S \ (insert SA (the (G S))))) ++ EmptyMap (States SA)) else G))" lemma FAddSA_dom [simp]: "(S \ (dom (A::('a => ('a,'c,'d)seqauto set option)))) \ ((A [f+] (S,(SA::('a,'c,'d)seqauto))) = A)" by (unfold FAddSA_def Let_def, auto) lemma FAddSA_States [simp]: "(S \ (States (SA::('a,'c,'d)seqauto))) \ (((A::('a => ('a,'c,'d)seqauto set option)) [f+] (S,SA)) = A)" by (unfold FAddSA_def Let_def, auto) lemma FAddSA_dom_insert [simp]: "\ S \ (dom A); S \ States SA \ \ (((A [f+] (S,SA)) S) = Some (insert SA (the (A S))))" by (unfold FAddSA_def Let_def restrict_def, auto) lemma FAddSA_States_neq [simp]: "\ S' \ States (SA::('a,'c,'d)seqauto); S \ S' \ \ ((((A::('a => ('a,'c,'d)seqauto set option)) [f+] (S,SA)) S') = (A S'))" apply (case_tac "S \ dom A") apply (case_tac "S \ States SA") apply auto apply (case_tac "S' \ dom A") apply (unfold FAddSA_def Let_def) apply auto apply (simp add: dom_None) done lemma FAddSA_dom_emptyset [simp]: "\ S \ (dom A); S \ States SA; S' \ States (SA::('a,'c,'d)seqauto) \ \ ((((A::('a => ('a,'c,'d)seqauto set option))) [f+] (S,SA)) S') = (Some {})" apply (unfold FAddSA_def Let_def) apply auto apply (unfold EmptyMap_def) apply auto done lemma FAddSA_dom_dom_States [simp]: "\ S \ (dom F); S \ States SA \ \ (dom ((F::('a \ (('a,'b,'d)seqauto) set)) [f+] (S, SA))) = ((dom F) \ (States (SA::('a,'b,'d)seqauto)))" by (unfold FAddSA_def Let_def, auto) lemma FAddSA_dom_dom [simp]: "S \ (dom F) \ (dom ((F::('a \ (('a,'b,'d)seqauto) set)) [f+] (S,(SA::('a,'b,'d)seqauto)))) = (dom F)" by (unfold FAddSA_def Let_def, auto) lemma FAddSA_States_dom [simp]: "S \ (States SA) \ (dom ((F::('a \ (('a,'b,'d)seqauto) set)) [f+] (S,(SA::('a,'b,'d)seqauto)))) = (dom F)" by (unfold FAddSA_def Let_def, auto) lemma FAddSA_dom_insert_dom_disjunct [simp]: "\ S \ dom G; States SA \ dom G = {} \ \ ((G [f+] (S,SA)) S) = Some (insert SA (the (G S)))" apply (rule FAddSA_dom_insert) apply auto done lemma FAddSA_Union_ran: "\ S \ dom G; (States SA) \ (dom G) = {} \ \ (\ (ran (G [f+] (S,SA)))) = (insert SA (\ (ran G)))" apply (unfold FAddSA_def Let_def) apply simp apply (rule conjI) prefer 2 apply (rule impI) apply (unfold Int_def) apply simp apply (fold Int_def) apply (rule impI) apply (subst EmptyMap_Union_ran_override) apply auto done lemma FAddSA_Union_ran2: "\ S \ dom G1; (States SA) \ (dom G1) = {}; (dom G1 \ dom G2) = {} \ \ (\ (ran ((G1 [f+] (S,SA)) ++ G2))) = (insert SA (\ ((ran G1) \ (ran G2))))" apply (unfold FAddSA_def Let_def) apply (simp (no_asm_simp)) apply (rule conjI) apply (rule impI) apply (subst EmptyMap_Union_ran_override2) apply simp apply simp apply simp apply fast apply (subst Union_Un_distrib) apply (subst Union_ran_override2) apply auto done lemma FAddSA_ran: "\ \ T \ dom G . T \ S \ (the (G T) \ the (G S)) = {}; S \ dom G; (States SA) \ (dom G) = {} \ \ ran (G [f+] (S,SA)) = insert {} (insert (insert SA (the (G S))) (ran G - {the (G S)}))" apply (unfold FAddSA_def Let_def) apply simp apply (rule conjI) apply (rule impI)+ prefer 2 apply fast apply (simp add: EmptyMap_ran_override) apply (unfold ran_def) apply auto apply (rename_tac Y X a xa xb) apply (erule_tac x=a in allE) apply simp apply (erule_tac x=a in allE) apply simp done lemma FAddSA_RootEx_def: "\ S \ dom G; (States SA) \ (dom G) = {} \ \ RootEx F (G [f+] (S,SA)) = (\! A . A \ F \ A \ insert SA (\ (ran G)))" apply (unfold RootEx_def) apply (simp only: FAddSA_Union_ran Int_commute) done lemma FAddSA_RootEx: "\ \ (ran G) = F - {Root F G}; dom G = \(States ` F); (dom G \ States SA) = {}; S \ dom G; RootEx F G \ \ RootEx (insert SA F) (G [f+] (S,SA))" apply (simp add: FAddSA_RootEx_def Int_commute cong: rev_conj_cong) apply (auto cong: conj_cong) done lemma FAddSA_Root_def: "\ S \ dom G; (States SA) \ (dom G) = {} \ \ (Root F (G [f+] (S,SA)) = (@ A . A \ F \ A \ insert SA (\ (ran G))))" apply (unfold Root_def) apply (simp only: FAddSA_Union_ran Int_commute) done lemma FAddSA_RootEx_Root: "\ Union (ran G) = F - {Root F G}; \(States ` F) = dom G; (dom G \ States SA) = {}; S \ dom G; RootEx F G \ \ (Root (insert SA F) (G [f+] (S,SA))) = (Root F G)" apply (simp add: FAddSA_Root_def Int_commute cong: rev_conj_cong) apply (simp cong:conj_cong) done lemma FAddSA_OneAncestor: "\ \ (ran G) = F - {Root F G}; (dom G \ States SA) = {}; S \ dom G; \(States ` F) = dom G; RootEx F G; OneAncestor F G \ \ OneAncestor (insert SA F) (G [f+] (S,SA))" apply (subst OneAncestor_def) apply simp apply (rule ballI) apply (rename_tac SAA) apply (case_tac "SA = SAA") apply (rule_tac a=S in ex1I) apply (rule conjI) apply simp apply fast apply (subst FAddSA_dom_insert) apply simp apply (simp add:Int_def) apply simp apply (rename_tac T) apply (erule conjE bexE exE disjE)+ apply (rename_tac SAAA) apply simp apply (erule conjE) apply (subst not_not [THEN sym]) apply (rule notI) apply (case_tac "T \ States SAA") apply blast apply (drule_tac A=G and S=S and SA=SAA in FAddSA_States_neq) apply fast apply simp apply (case_tac "SAA \ Union (ran G)") apply (frule ran_dom_the) prefer 2 apply fast apply blast apply simp apply (erule conjE) apply (simp add: States_Int_not_mem) apply (unfold OneAncestor_def) apply (drule_tac G=G and S=S and SA=SA in FAddSA_RootEx_Root) apply simp apply simp apply simp apply simp apply (erule_tac x=SAA in ballE) prefer 2 apply simp apply simp apply (erule conjE bexE ex1E exE disjE)+ apply (rename_tac T SAAA) apply (rule_tac a=T in ex1I) apply (rule conjI) apply fast apply (case_tac "T = S") apply simp apply (case_tac "S \ States SA") apply simp apply simp apply (subst FAddSA_States_neq) apply blast apply (rule not_sym) apply simp apply simp apply (rename_tac U) apply simp apply (erule conjE bexE)+ apply (rename_tac SAAAA) apply simp apply (erule conjE disjE)+ apply (frule FAddSA_dom_emptyset) prefer 2 apply fast back back apply simp apply blast apply simp apply (erule_tac x=U in allE) apply (erule impE) prefer 2 apply simp apply (rule conjI) apply fast apply (case_tac "S \ U") apply (subgoal_tac "U \ States SA") apply (drule_tac A=G in FAddSA_States_neq) apply fast apply simp apply blast apply (drule_tac A=G and SA=SA in FAddSA_dom_insert) apply simp apply blast apply auto done lemma FAddSA_NoCycles: "\ (States SA \ dom G) = {}; S \ dom G; dom G = \(States ` F); NoCycles F G \ \ NoCycles (insert SA F) (G [f+] (S,SA))" apply (unfold NoCycles_def) apply (rule ballI impI)+ apply (rename_tac SAA) apply (case_tac "\ s \ SAA. s \ States SA") apply simp apply (erule bexE)+ apply (rename_tac SAAA T) apply (rule_tac x=T in bexI) apply simp apply (subst FAddSA_dom_emptyset) apply simp apply fast apply blast apply simp apply simp apply simp apply simp apply (erule_tac x=SAA in ballE) prefer 2 apply simp apply auto[1] apply (unfold UNION_eq Pow_def) apply simp apply (case_tac "SAA = {}") apply fast apply simp apply (erule bexE)+ apply (rename_tac SAAA T) apply (rule_tac x=T in bexI) prefer 2 apply simp apply (case_tac "T=S") apply simp apply (subst FAddSA_dom_insert) apply auto done lemma FAddSA_IsCompFun: "\ (States SA \ (\(States ` F))) = {}; S \ (\(States ` F)); IsCompFun F G \ \ IsCompFun (insert SA F) (G [f+] (S,SA))" apply (unfold IsCompFun_def) apply (erule conjE)+ apply (simp add: Int_commute FAddSA_RootEx_Root FAddSA_RootEx FAddSA_OneAncestor FAddSA_NoCycles) apply (rule conjI) apply (subst FAddSA_dom_dom_States) apply simp apply blast apply (simp add: Un_commute) apply (simp add: FAddSA_Union_ran) apply (case_tac "SA = Root F G") prefer 2 apply blast apply (subgoal_tac "States (Root F G) \ \(States ` F)") apply simp apply (frule subset_lemma) apply auto done lemma FAddSA_HierAuto: "\ (States SA \ (\(States ` F))) = {}; S \ (\(States ` F)); HierAuto D F E G \ \ HierAuto D (insert SA F) (E \ SAEvents SA) (G [f+] (S,SA))" apply (unfold HierAuto_def) apply auto apply (simp add: MutuallyDistinct_Insert) apply (rule FAddSA_IsCompFun) apply auto done lemma FAddSA_HierAuto_insert [simp]: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ HierAuto (HAInitValue HA) (insert SA (SAs HA)) (HAEvents HA \ SAEvents SA) (CompFun HA [f+] (S,SA))" apply (unfold HAStates_def) apply (rule FAddSA_HierAuto) apply auto done subsection "Constructing a PseudoHA" definition PseudoHA :: "[('s,'e,'d)seqauto,'d data] => ('s,'e,'d)hierauto" where "PseudoHA SA D = Abs_hierauto(D,{SA}, SAEvents SA ,EmptyMap (States SA))" lemma PseudoHA_SAs [simp]: "SAs (PseudoHA SA D) = {SA}" by (unfold PseudoHA_def SAs_def, simp add: Abs_hierauto_inverse) lemma PseudoHA_Events [simp]: "HAEvents (PseudoHA SA D) = SAEvents SA" by (unfold PseudoHA_def HAEvents_def, simp add: Abs_hierauto_inverse) lemma PseudoHA_CompFun [simp]: "CompFun (PseudoHA SA D) = EmptyMap (States SA)" by (unfold PseudoHA_def CompFun_def, simp add: Abs_hierauto_inverse) lemma PseudoHA_HAStates [simp]: "HAStates (PseudoHA SA D) = (States SA)" by (unfold HAStates_def, auto) lemma PseudoHA_HAInitValue [simp]: "(HAInitValue (PseudoHA SA D)) = D" by (unfold PseudoHA_def Let_def HAInitValue_def, simp add: Abs_hierauto_inverse) lemma PseudoHA_CompFun_the [simp]: "S \ States A \ (the (CompFun (PseudoHA A D) S)) = {}" by simp lemma PseudoHA_CompFun_ran [simp]: "(ran (CompFun (PseudoHA SA D))) = {{}}" by auto lemma PseudoHA_HARoot [simp]: "(HARoot (PseudoHA SA D)) = SA" by (unfold HARoot_def, auto) lemma PseudoHA_HAInitState [simp]: "HAInitState (PseudoHA A D) = InitState A" apply (unfold HAInitState_def) apply simp done lemma PseudoHA_HAInitStates [simp]: "HAInitStates (PseudoHA A D) = {InitState A}" apply (unfold HAInitStates_def) apply simp done lemma PseudoHA_Chi [simp]: "S \ States A \ Chi (PseudoHA A D) S = {}" apply (unfold Chi_def restrict_def) apply auto done lemma PseudoHA_ChiRel [simp]: "ChiRel (PseudoHA A D) = {}" apply (unfold ChiRel_def) apply simp done lemma PseudoHA_InitConf [simp]: "InitConf (PseudoHA A D) = {InitState A}" apply (unfold InitConf_def) apply simp done subsection \Extending a HA by a SA (\AddSA\)\ definition AddSA :: "[('s,'e,'d)hierauto, 's * ('s,'e,'d)seqauto] => ('s,'e,'d)hierauto" ("(_ [++]/ _)" [10,11]10) where "AddSA HA SSA = (let (S,SA) = SSA; DNew = HAInitValue HA; FNew = insert SA (SAs HA); ENew = HAEvents HA \ SAEvents SA; GNew = CompFun HA [f+] (S,SA) in Abs_hierauto(DNew,FNew,ENew,GNew))" definition AddHA :: "[('s,'e,'d)hierauto, 's * ('s,'e,'d)hierauto] => ('s,'e,'d)hierauto" ("(_ [**]/ _)" [10,11]10) where "AddHA HA1 SHA = (let (S,HA2) = SHA; (D1,F1,E1,G1) = Rep_hierauto (HA1 [++] (S,HARoot HA2)); (D2,F2,E2,G2) = Rep_hierauto HA2; FNew = F1 \ F2; ENew = E1 \ E2; GNew = G1 ++ G2 in Abs_hierauto(D1,FNew,ENew,GNew))" lemma AddSA_SAs: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ (SAs (HA [++] (S,SA))) = insert SA (SAs HA)" apply (unfold Let_def AddSA_def) apply (subst SAs_def) apply (simp add: hierauto_def Abs_hierauto_inverse) done lemma AddSA_Events: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ HAEvents (HA [++] (S,SA)) = (HAEvents HA) \ (SAEvents SA)" apply (unfold Let_def AddSA_def) apply (subst HAEvents_def) apply (simp add: hierauto_def Abs_hierauto_inverse) done lemma AddSA_CompFun: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ CompFun (HA [++] (S,SA)) = (CompFun HA [f+] (S,SA))" apply (unfold Let_def AddSA_def) apply (subst CompFun_def) apply (simp add: hierauto_def Abs_hierauto_inverse) done lemma AddSA_HAStates: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ HAStates (HA [++] (S,SA)) = (HAStates HA) \ (States SA)" apply (unfold HAStates_def) apply (subst AddSA_SAs) apply (unfold HAStates_def) apply auto done lemma AddSA_HAInitValue: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ (HAInitValue (HA [++] (S,SA))) = (HAInitValue HA)" apply (unfold Let_def AddSA_def) apply (subst HAInitValue_def) apply (simp add: hierauto_def Abs_hierauto_inverse) done lemma AddSA_HARoot: "\ (States SA \ HAStates HA) = {}; S \ HAStates HA \ \ (HARoot (HA [++] (S,SA))) = (HARoot HA)" apply (unfold HARoot_def) apply (simp add: AddSA_CompFun AddSA_SAs) apply (subst FAddSA_RootEx_Root) apply auto apply (simp only: HAStates_SA_mem) apply (unfold HAStates_def) apply fast done lemma AddSA_CompFun_the: "\ (States SA \ HAStates A) = {}; S \ HAStates A \ \ (the ((CompFun (A [++] (S,SA))) S)) = insert SA (the ((CompFun A) S))" by (simp add: AddSA_CompFun) lemma AddSA_CompFun_the2: "\ S' \ States (SA::('a,'c,'d)seqauto); (States SA \ HAStates A) = {}; S \ HAStates A \ \ the ((CompFun (A [++] (S,SA))) S') = {}" apply (simp add: AddSA_CompFun) apply (subst FAddSA_dom_emptyset) apply auto done lemma AddSA_CompFun_the3: "\ S' \ States (SA::('a,'c,'d)seqauto); S \ S'; (States SA \ HAStates A) = {}; S \ HAStates A \ \ (the ((CompFun (A [++] (S,SA))) S')) = (the ((CompFun A) S'))" by (simp add: AddSA_CompFun) lemma AddSA_CompFun_ran: "\ (States SA \ HAStates A) = {}; S \ HAStates A \ \ ran (CompFun (A [++] (S,SA))) = insert {} (insert (insert SA (the ((CompFun A) S))) (ran (CompFun A) - {the ((CompFun A) S)}))" apply (simp add: AddSA_CompFun) apply (subst FAddSA_ran) apply auto apply (fast dest: CompFun_Int_disjoint) done lemma AddSA_CompFun_ran2: "\ (States SA1 \ HAStates A) = {}; (States SA2 \ (HAStates A \ States SA1)) = {}; S \ HAStates A; T \ States SA1 \ \ ran (CompFun ((A [++] (S,SA1)) [++] (T,SA2))) = insert {} (insert {SA2} (ran (CompFun (A [++] (S,SA1)))))" apply (simp add: AddSA_HAStates AddSA_CompFun) apply (subst FAddSA_ran) apply (rule ballI) apply (rule impI) apply (subst AddSA_CompFun [THEN sym]) apply simp apply simp apply (subst AddSA_CompFun [THEN sym]) apply simp apply simp apply (rule CompFun_Int_disjoint) apply simp apply (simp add: AddSA_HAStates) apply (simp add: AddSA_HAStates) apply (case_tac "S \ States SA1") apply simp apply (simp only: dom_CompFun [THEN sym]) apply (frule FAddSA_dom_dom_States) apply fast apply simp apply (case_tac "S \ States SA1") apply simp apply fast apply (subst FAddSA_dom_dom_States) apply simp apply simp apply simp apply (case_tac "S \ States SA1") apply simp apply fast apply (subst FAddSA_dom_dom_States) apply simp apply simp apply simp apply (case_tac "S \ States SA1") apply simp apply fast apply simp apply fast done lemma AddSA_CompFun_ran_not_mem: "\ States SA2 \ (HAStates A \ States SA1) = {}; States SA1 \ HAStates A = {}; S \ HAStates A \ \ {SA2} \ ran (CompFun A [f+] (S, SA1))" apply (cut_tac HA="A [++] (S,SA1)" and Sas="{SA2}" in ran_CompFun_is_not_SA) apply (metis AddSA_HAStates SA_States_disjunct2 SAs_States_HAStates insert_subset) apply (simp add: AddSA_HAStates AddSA_CompFun) done lemma AddSA_CompFun_ran3: "\ (States SA1 \ HAStates A) = {}; (States SA2 \ (HAStates A \ States SA1)) = {}; (States SA3 \ (HAStates A \ States SA1 \ States SA2)) = {}; S \ HAStates A; T \ States SA1 \ \ ran (CompFun ((A [++] (S,SA1)) [++] (T,SA2) [++] (T,SA3))) = insert {} (insert {SA3,SA2} (ran (CompFun (A [++] (S,SA1)))))" apply (simp add: AddSA_HAStates AddSA_CompFun) apply (subst FAddSA_ran) apply (metis AddSA_CompFun AddSA_HAStates CompFun_Int_disjoint UnCI dom_CompFun) apply (metis AddSA_CompFun AddSA_HAStates UnCI dom_CompFun) apply (metis AddSA_CompFun AddSA_HAStates UnCI dom_CompFun) apply (subst AddSA_CompFun [THEN sym]) back apply simp apply simp apply (subst AddSA_CompFun [THEN sym]) back apply (simp add: AddSA_HAStates) apply (simp add: AddSA_HAStates) apply (subst AddSA_CompFun_ran2) apply fast apply fast apply fast apply fast apply (simp add: AddSA_CompFun) apply (subst FAddSA_dom_insert) apply (subst FAddSA_dom_dom_States) apply simp apply fast apply simp apply fast apply (subst FAddSA_dom_emptyset) apply simp apply fast apply simp apply simp apply (subst FAddSA_dom_insert) apply (subst FAddSA_dom_dom_States) apply simp apply fast apply simp apply fast apply (subst FAddSA_dom_emptyset) apply simp apply fast apply simp apply simp by (simp add: AddSA_CompFun_ran_not_mem insert_Diff_if insert_commute) lemma AddSA_CompFun_PseudoHA_ran: "\ S \ States RootSA; States RootSA \ States SA = {} \ \ (ran (CompFun ((PseudoHA RootSA D) [++] (S,SA)))) = (insert {} {{SA}})" apply (subst AddSA_CompFun_ran) apply auto done lemma AddSA_CompFun_PseudoHA_ran2: "\ States SA1 \ States RootSA = {}; States SA2 \ (States RootSA \ States SA1) = {}; S \ States RootSA \ \ (ran (CompFun ((PseudoHA RootSA D) [++] (S,SA1) [++] (S,SA2)))) = (insert {} {{SA2,SA1}})" apply (subst AddSA_CompFun_ran) prefer 3 apply (subst AddSA_CompFun_the) apply simp apply simp apply (subst AddSA_CompFun_PseudoHA_ran) apply fast apply fast apply (subst AddSA_CompFun_the) apply simp apply simp apply simp apply fast apply (simp add: AddSA_HAStates) apply (simp add: AddSA_HAStates) done lemma AddSA_HAInitStates [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A \ \ HAInitStates (A [++] (S,SA)) = insert (InitState SA) (HAInitStates A)" apply (unfold HAInitStates_def) apply (simp add: AddSA_SAs) done lemma AddSA_HAInitState [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A \ \ HAInitState (A [++] (S,SA)) = (HAInitState A)" apply (unfold HAInitState_def) apply (simp add: AddSA_HARoot) done lemma AddSA_Chi [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A \ \ Chi (A [++] (S,SA)) S = (States SA) \ (Chi A S)" apply (unfold Chi_def restrict_def) apply (simp add: AddSA_SAs AddSA_HAStates AddSA_CompFun_the) apply auto done lemma AddSA_Chi2 [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A; T \ States SA \ \ Chi (A [++] (S,SA)) T = {}" apply (unfold Chi_def restrict_def) apply (simp add: AddSA_SAs AddSA_HAStates AddSA_CompFun_the2) done lemma AddSA_Chi3 [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A; T \ States SA; T \ S \ \ Chi (A [++] (S,SA)) T = Chi A T" apply (unfold Chi_def restrict_def) apply (simp add: AddSA_SAs AddSA_HAStates AddSA_CompFun_the3) apply auto done lemma AddSA_ChiRel [simp]: "\ States SA \ HAStates A = {}; S \ HAStates A \ \ ChiRel (A [++] (S,SA)) = { (T,T') . T = S \ T' \ States SA } \ (ChiRel A)" apply (unfold ChiRel_def) apply (simp add: AddSA_HAStates) apply safe apply (rename_tac T U) apply (case_tac "T \ States SA") apply simp apply simp apply (rename_tac T U) apply (case_tac "T \ S") apply (case_tac "T \ States SA") apply simp apply simp apply simp apply (rename_tac T U) apply (case_tac "T \ States SA") apply simp apply simp apply (cut_tac A=A and T=T in Chi_HAStates) apply fast apply (case_tac "T \ States SA") apply simp apply simp apply (cut_tac A=A and T=T in Chi_HAStates) apply fast apply fast apply (rename_tac T U) apply (case_tac "T \ S") apply (case_tac "T \ States SA") apply simp apply simp apply simp apply (rename_tac T U) apply (case_tac "T \ States SA") apply auto apply (metis AddSA_Chi AddSA_Chi3 Int_iff Un_iff empty_iff) done lemma help_InitConf: "\States SA \ HAStates A = {} \ \ {p. fst p \ InitState SA \ snd p \ InitState SA \ p \ insert (InitState SA) (HAInitStates A) \ insert (InitState SA) (HAInitStates A) \ (p \ {S} \ States SA \ p \ ChiRel A)} = (HAInitStates A \ HAInitStates A \ ChiRel A)" apply auto apply (cut_tac A=SA in InitState_States) apply (cut_tac A=A in HAInitStates_HAStates, fast) apply (cut_tac A=SA in InitState_States) apply (cut_tac A=A in HAInitStates_HAStates, fast) done lemma AddSA_InitConf [simp]: "\ States SA \ HAStates A = {}; S \ InitConf A \ \ InitConf (A [++] (S,SA)) = insert (InitState SA) (InitConf A)" apply (frule InitConf_HAStates2) apply (unfold InitConf_def) apply (simp del: insert_Times_insert) -apply auto -apply (rename_tac T) -apply (case_tac "T=S") -apply auto -prefer 3 -apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) -apply auto -apply (rotate_tac 3) -apply (frule trancl_collect) -prefer 2 -apply fast -apply auto -apply (cut_tac A=SA in InitState_States) -apply (frule ChiRel_HAStates) -apply fast -apply (frule ChiRel_HAStates) -apply (cut_tac A=SA in InitState_States) -apply fast -apply (frule ChiRel_HAStates) -apply (cut_tac A=SA in InitState_States) -apply fast -apply (subst help_InitConf [THEN sym]) -apply fast -apply auto + apply auto + apply (rename_tac T) + apply (case_tac "T=S") + apply auto + prefer 3 + apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) + apply auto + apply (rotate_tac 3) + apply (frule trancl_collect) + prefer 2 + apply fast + apply auto + apply (cut_tac A=SA in InitState_States) + apply (frule ChiRel_HAStates) + apply fast + apply (frule ChiRel_HAStates) + apply (cut_tac A=SA in InitState_States) + apply fast + apply (subst help_InitConf [THEN sym]) + apply fast + apply auto apply (rule_tac b=S in rtrancl_into_rtrancl) -apply auto -prefer 2 -apply (erule rtranclE) -apply auto -prefer 2 -apply (erule rtranclE) -apply auto -apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) + apply auto + prefer 2 + apply (erule rtranclE) + apply auto + prefer 2 + apply (erule rtranclE) + apply auto + apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) apply auto done lemma AddSA_InitConf2 [simp]: "\ States SA \ HAStates A = {}; S \ InitConf A; S \ HAStates A \ \ InitConf (A [++] (S,SA)) = InitConf A" apply (unfold InitConf_def) apply simp apply auto -apply (rename_tac T) -prefer 2 -apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) -apply auto + apply (rename_tac T) + prefer 2 + apply (rule_tac R="(HAInitStates A) \ (HAInitStates A) \ ChiRel A" in trancl_subseteq) + apply auto apply (case_tac "T=InitState SA") -apply auto -prefer 2 -apply (rotate_tac 3) -apply (frule trancl_collect) -prefer 2 -apply fast -apply auto -apply (cut_tac A=SA in InitState_States) -apply (frule ChiRel_HAStates) -apply fast -apply (cut_tac A=SA in InitState_States) -apply (frule ChiRel_HAStates) -apply fast -apply (cut_tac A=SA in InitState_States) -apply (cut_tac A=A in HAInitStates_HAStates) -apply fast -apply (subst help_InitConf [THEN sym]) -apply fast -apply auto + apply auto + prefer 2 + apply (rotate_tac 3) + apply (frule trancl_collect) + prefer 2 + apply fast + apply auto + apply (cut_tac A=SA in InitState_States) + apply (frule ChiRel_HAStates) + apply fast + apply (cut_tac A=SA in InitState_States) + apply (frule ChiRel_HAStates) + apply fast + apply (cut_tac A=SA in InitState_States) + apply (cut_tac A=A in HAInitStates_HAStates) + apply (subst help_InitConf [THEN sym]) + apply fast + apply auto apply (rule_tac b="InitState SA" in rtrancl_induct) -apply auto -apply (frule ChiRel_HAStates2) -apply (cut_tac A=SA in InitState_States) -apply fast -prefer 2 -apply (frule ChiRel_HAStates) -apply (cut_tac A=SA in InitState_States) -apply fast + apply auto + apply (frule ChiRel_HAStates2) + apply (cut_tac A=SA in InitState_States) + apply fast + prefer 2 + apply (frule ChiRel_HAStates) + apply (cut_tac A=SA in InitState_States) + apply fast apply (rule rtrancl_into_rtrancl) -apply auto -apply (rule rtrancl_into_rtrancl) -apply auto + apply auto done subsection "Theorems for Calculating Wellformedness of HA" lemma PseudoHA_HAStates_IFF: "(States SA) = X \ (HAStates (PseudoHA SA D)) = X" apply simp done lemma AddSA_SAs_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (SAs HA) = X \ \ (SAs (HA [++] (S, SA))) = (insert SA X)" apply (subst AddSA_SAs) apply auto done lemma AddSA_Events_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (HAEvents HA) = HAE; (SAEvents SA) = SAE; (HAE \ SAE) = X \ \ (HAEvents (HA [++] (S, SA))) = X" apply (subst AddSA_Events) apply auto done lemma AddSA_CompFun_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (CompFun HA) = HAG; (HAG [f+] (S, SA)) = X \ \ (CompFun (HA [++] (S, SA))) = X" apply (subst AddSA_CompFun) apply auto done lemma AddSA_HAStates_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (HAStates HA) = HAS; (States SA) = SAS; (HAS \ SAS) = X \ \ (HAStates (HA [++] (S, SA))) = X" apply (subst AddSA_HAStates) apply auto done lemma AddSA_HAInitValue_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (HAInitValue HA) = X \ \ (HAInitValue (HA [++] (S, SA))) = X" apply (subst AddSA_HAInitValue) apply auto done lemma AddSA_HARoot_IFF: "\ States SA \ HAStates HA = {}; S \ HAStates HA; (HARoot HA) = X \ \ (HARoot (HA [++] (S, SA))) = X" apply (subst AddSA_HARoot) apply auto done lemma AddSA_InitConf_IFF: "\ InitConf A = Y; States SA \ HAStates A = {}; S \ HAStates A; (if S \ Y then insert (InitState SA) Y else Y) = X \ \ InitConf (A [++] (S,SA)) = X" apply (case_tac "S \ Y") apply auto done lemma AddSA_CompFun_ran_IFF: "\ (States SA \ HAStates A) = {}; S \ HAStates A; (insert {} (insert (insert SA (the ((CompFun A) S))) (ran (CompFun A) - {the ((CompFun A) S)}))) = X \ \ ran (CompFun (A [++] (S,SA))) = X" apply (subst AddSA_CompFun_ran) apply auto done lemma AddSA_CompFun_ran2_IFF: "\ (States SA1 \ HAStates A) = {}; (States SA2 \ (HAStates A \ States SA1)) = {}; S \ HAStates A; T \ States SA1; insert {} (insert {SA2} (ran (CompFun (A [++] (S,SA1))))) = X \ \ ran (CompFun ((A [++] (S,SA1)) [++] (T,SA2))) = X" apply (subst AddSA_CompFun_ran2) apply auto done lemma AddSA_CompFun_ran3_IFF: "\ (States SA1 \ HAStates A) = {}; (States SA2 \ (HAStates A \ States SA1)) = {}; (States SA3 \ (HAStates A \ States SA1 \ States SA2)) = {}; S \ HAStates A; T \ States SA1; insert {} (insert {SA3,SA2} (ran (CompFun (A [++] (S,SA1))))) = X \ \ ran (CompFun ((A [++] (S,SA1)) [++] (T,SA2) [++] (T,SA3))) = X" apply (subst AddSA_CompFun_ran3) apply auto done lemma AddSA_CompFun_PseudoHA_ran_IFF: "\ S \ States RootSA; States RootSA \ States SA = {}; (insert {} {{SA}}) = X \ \ (ran (CompFun ((PseudoHA RootSA D) [++] (S,SA)))) = X" apply (subst AddSA_CompFun_PseudoHA_ran) apply auto done lemma AddSA_CompFun_PseudoHA_ran2_IFF: "\ States SA1 \ States RootSA = {}; States SA2 \ (States RootSA \ States SA1) = {}; S \ States RootSA; (insert {} {{SA2,SA1}}) = X \ \ (ran (CompFun ((PseudoHA RootSA D) [++] (S,SA1) [++] (S,SA2)))) = X" apply (subst AddSA_CompFun_PseudoHA_ran2) apply auto done ML \ val AddSA_SAs_IFF = @{thm AddSA_SAs_IFF}; val AddSA_Events_IFF = @{thm AddSA_Events_IFF}; val AddSA_CompFun_IFF = @{thm AddSA_CompFun_IFF}; val AddSA_HAStates_IFF = @{thm AddSA_HAStates_IFF}; val PseudoHA_HAStates_IFF = @{thm PseudoHA_HAStates_IFF}; val AddSA_HAInitValue_IFF = @{thm AddSA_HAInitValue_IFF}; val AddSA_CompFun_ran_IFF = @{thm AddSA_CompFun_ran_IFF}; val AddSA_HARoot_IFF = @{thm AddSA_HARoot_IFF}; val insert_inter = @{thm insert_inter}; val insert_notmem = @{thm insert_notmem}; val PseudoHA_CompFun = @{thm PseudoHA_CompFun}; val PseudoHA_Events = @{thm PseudoHA_Events}; val PseudoHA_SAs = @{thm PseudoHA_SAs}; val PseudoHA_HARoot = @{thm PseudoHA_HARoot}; val PseudoHA_HAInitValue = @{thm PseudoHA_HAInitValue}; val PseudoHA_CompFun_ran = @{thm PseudoHA_CompFun_ran}; val Un_empty_right = @{thm Un_empty_right}; val insert_union = @{thm insert_union}; fun wellformed_tac ctxt L i = FIRST[resolve_tac ctxt [AddSA_SAs_IFF] i, resolve_tac ctxt [AddSA_Events_IFF] i, resolve_tac ctxt [AddSA_CompFun_IFF] i, resolve_tac ctxt [AddSA_HAStates_IFF] i, resolve_tac ctxt [PseudoHA_HAStates_IFF] i, resolve_tac ctxt [AddSA_HAInitValue_IFF] i, resolve_tac ctxt [AddSA_HARoot_IFF] i, resolve_tac ctxt [AddSA_CompFun_ran_IFF] i, resolve_tac ctxt [insert_inter] i, resolve_tac ctxt [insert_notmem] i, CHANGED (simp_tac (put_simpset HOL_basic_ss ctxt addsimps [PseudoHA_HARoot, PseudoHA_CompFun, PseudoHA_CompFun_ran,PseudoHA_Events,PseudoHA_SAs,insert_union, PseudoHA_HAInitValue,Un_empty_right]@ L) i), fast_tac ctxt i, CHANGED (simp_tac ctxt i)]; \ method_setup wellformed = \Attrib.thms >> (fn thms => fn ctxt => (METHOD (fn facts => (HEADGOAL (wellformed_tac ctxt (facts @ thms))))))\ end