diff -r df0334468335 -r 8067efcb43da CpsG.thy~ --- a/CpsG.thy~ Sat Jan 16 11:02:17 2016 +0800 +++ b/CpsG.thy~ Sun Jan 17 22:18:35 2016 +0800 @@ -15,21 +15,11 @@ from fnt and seq show "finite (f ` B)" by auto qed -(* I am going to use this file as a start point to retrofiting - PIPBasics.thy, which is originally called CpsG.ghy *) locale valid_trace = fixes s assumes vt : "vt s" -lemma waiting_eq: "waiting s th cs = waiting (wq s) th cs" - by (unfold s_waiting_def cs_waiting_def wq_def, auto) - -lemma holding_eq: "holding (s::state) th cs = holding (wq s) th cs" - by (unfold s_holding_def wq_def cs_holding_def, simp) - -thm s_waiting_def cs_waiting_def wq_def - locale valid_trace_e = valid_trace + fixes e assumes vt_e: "vt (e#s)" @@ -40,6 +30,118 @@ end +locale valid_trace_create = valid_trace_e + + fixes th prio + assumes is_create: "e = Create th prio" + +locale valid_trace_exit = valid_trace_e + + fixes th + assumes is_exit: "e = Exit th" + +locale valid_trace_p = valid_trace_e + + fixes th cs + assumes is_p: "e = P th cs" + +locale valid_trace_v = valid_trace_e + + fixes th cs + assumes is_v: "e = V th cs" +begin + definition "rest = tl (wq s cs)" + definition "wq' = (SOME q. distinct q \ set q = set rest)" +end + +locale valid_trace_v_n = valid_trace_v + + assumes rest_nnl: "rest \ []" + +locale valid_trace_v_e = valid_trace_v + + assumes rest_nil: "rest = []" + +locale valid_trace_set= valid_trace_e + + fixes th prio + assumes is_set: "e = Set th prio" + +context valid_trace +begin + +lemma ind [consumes 0, case_names Nil Cons, induct type]: + assumes "PP []" + and "(\s e. valid_trace_e s e \ + PP s \ PIP s e \ PP (e # s))" + shows "PP s" +proof(induct rule:vt.induct[OF vt, case_names Init Step]) + case Init + from assms(1) show ?case . +next + case (Step s e) + show ?case + proof(rule assms(2)) + show "valid_trace_e s e" using Step by (unfold_locales, auto) + next + show "PP s" using Step by simp + next + show "PIP s e" using Step by simp + qed +qed + +lemma vt_moment: "\ t. vt (moment t s)" +proof(induct rule:ind) + case Nil + thus ?case by (simp add:vt_nil) +next + case (Cons s e t) + show ?case + proof(cases "t \ length (e#s)") + case True + from True have "moment t (e#s) = e#s" by simp + thus ?thesis using Cons + by (simp add:valid_trace_def valid_trace_e_def, auto) + next + case False + from Cons have "vt (moment t s)" by simp + moreover have "moment t (e#s) = moment t s" + proof - + from False have "t \ length s" by simp + from moment_app [OF this, of "[e]"] + show ?thesis by simp + qed + ultimately show ?thesis by simp + qed +qed + +lemma finite_threads: + shows "finite (threads s)" +using vt by (induct) (auto elim: step.cases) + +end + +lemma cp_eq_cpreced: "cp s th = cpreced (wq s) s th" +unfolding cp_def wq_def +apply(induct s rule: schs.induct) +apply(simp add: Let_def cpreced_initial) +apply(simp add: Let_def) +apply(simp add: Let_def) +apply(simp add: Let_def) +apply(subst (2) schs.simps) +apply(simp add: Let_def) +apply(subst (2) schs.simps) +apply(simp add: Let_def) +done + +lemma RAG_target_th: "(Th th, x) \ RAG (s::state) \ \ cs. x = Cs cs" + by (unfold s_RAG_def, auto) + +locale valid_moment = valid_trace + + fixes i :: nat + +sublocale valid_moment < vat_moment: valid_trace "(moment i s)" + by (unfold_locales, insert vt_moment, auto) + +lemma waiting_eq: "waiting s th cs = waiting (wq s) th cs" + by (unfold s_waiting_def cs_waiting_def wq_def, auto) + +lemma holding_eq: "holding (s::state) th cs = holding (wq s) th cs" + by (unfold s_holding_def wq_def cs_holding_def, simp) + lemma runing_ready: shows "runing s \ readys s" unfolding runing_def readys_def @@ -64,6 +166,199 @@ context valid_trace begin +lemma runing_wqE: + assumes "th \ runing s" + and "th \ set (wq s cs)" + obtains rest where "wq s cs = th#rest" +proof - + from assms(2) obtain th' rest where eq_wq: "wq s cs = th'#rest" + by (meson list.set_cases) + have "th' = th" + proof(rule ccontr) + assume "th' \ th" + hence "th \ hd (wq s cs)" using eq_wq by auto + with assms(2) + have "waiting s th cs" + by (unfold s_waiting_def, fold wq_def, auto) + with assms show False + by (unfold runing_def readys_def, auto) + qed + with eq_wq that show ?thesis by metis +qed + +end + +context valid_trace_create +begin + +lemma wq_neq_simp [simp]: + shows "wq (e#s) cs' = wq s cs'" + using assms unfolding is_create wq_def + by (auto simp:Let_def) + +lemma wq_distinct_kept: + assumes "distinct (wq s cs')" + shows "distinct (wq (e#s) cs')" + using assms by simp +end + +context valid_trace_exit +begin + +lemma wq_neq_simp [simp]: + shows "wq (e#s) cs' = wq s cs'" + using assms unfolding is_exit wq_def + by (auto simp:Let_def) + +lemma wq_distinct_kept: + assumes "distinct (wq s cs')" + shows "distinct (wq (e#s) cs')" + using assms by simp +end + +context valid_trace_p +begin + +lemma wq_neq_simp [simp]: + assumes "cs' \ cs" + shows "wq (e#s) cs' = wq s cs'" + using assms unfolding is_p wq_def + by (auto simp:Let_def) + +lemma runing_th_s: + shows "th \ runing s" +proof - + from pip_e[unfolded is_p] + show ?thesis by (cases, simp) +qed + +lemma th_not_waiting: + "\ waiting s th c" +proof - + have "th \ readys s" + using runing_ready runing_th_s by blast + thus ?thesis + by (unfold readys_def, auto) +qed + +lemma waiting_neq_th: + assumes "waiting s t c" + shows "t \ th" + using assms using th_not_waiting by blast + +lemma th_not_in_wq: + shows "th \ set (wq s cs)" +proof + assume otherwise: "th \ set (wq s cs)" + from runing_wqE[OF runing_th_s this] + obtain rest where eq_wq: "wq s cs = th#rest" by blast + with otherwise + have "holding s th cs" + by (unfold s_holding_def, fold wq_def, simp) + hence cs_th_RAG: "(Cs cs, Th th) \ RAG s" + by (unfold s_RAG_def, fold holding_eq, auto) + from pip_e[unfolded is_p] + show False + proof(cases) + case (thread_P) + with cs_th_RAG show ?thesis by auto + qed +qed + +lemma wq_es_cs: + "wq (e#s) cs = wq s cs @ [th]" + by (unfold is_p wq_def, auto simp:Let_def) + +lemma wq_distinct_kept: + assumes "distinct (wq s cs')" + shows "distinct (wq (e#s) cs')" +proof(cases "cs' = cs") + case True + show ?thesis using True assms th_not_in_wq + by (unfold True wq_es_cs, auto) +qed (insert assms, simp) + +end + +context valid_trace_v +begin + +lemma wq_neq_simp [simp]: + assumes "cs' \ cs" + shows "wq (e#s) cs' = wq s cs'" + using assms unfolding is_v wq_def + by (auto simp:Let_def) + +lemma runing_th_s: + shows "th \ runing s" +proof - + from pip_e[unfolded is_v] + show ?thesis by (cases, simp) +qed + +lemma th_not_waiting: + "\ waiting s th c" +proof - + have "th \ readys s" + using runing_ready runing_th_s by blast + thus ?thesis + by (unfold readys_def, auto) +qed + +lemma waiting_neq_th: + assumes "waiting s t c" + shows "t \ th" + using assms using th_not_waiting by blast + +lemma wq_s_cs: + "wq s cs = th#rest" +proof - + from pip_e[unfolded is_v] + show ?thesis + proof(cases) + case (thread_V) + from this(2) show ?thesis + by (unfold rest_def s_holding_def, fold wq_def, + metis empty_iff list.collapse list.set(1)) + qed +qed + +lemma wq_es_cs: + "wq (e#s) cs = wq'" + using wq_s_cs[unfolded wq_def] + by (auto simp:Let_def wq_def rest_def wq'_def is_v, simp) + +lemma wq_distinct_kept: + assumes "distinct (wq s cs')" + shows "distinct (wq (e#s) cs')" +proof(cases "cs' = cs") + case True + show ?thesis + proof(unfold True wq_es_cs wq'_def, rule someI2) + show "distinct rest \ set rest = set rest" + using assms[unfolded True wq_s_cs] by auto + qed simp +qed (insert assms, simp) + +end + +context valid_trace_set +begin + +lemma wq_neq_simp [simp]: + shows "wq (e#s) cs' = wq s cs'" + using assms unfolding is_set wq_def + by (auto simp:Let_def) + +lemma wq_distinct_kept: + assumes "distinct (wq s cs')" + shows "distinct (wq (e#s) cs')" + using assms by simp +end + +context valid_trace +begin + lemma actor_inv: assumes "PIP s e" and "\ isCreate e" @@ -71,7 +366,6 @@ using assms by (induct, auto) - lemma isP_E: assumes "isP e" obtains cs where "e = P (actor e) cs" @@ -82,90 +376,35 @@ obtains cs where "e = V (actor e) cs" using assms by (cases e, auto) - -lemma ind [consumes 0, case_names Nil Cons, induct type]: - assumes "PP []" - and "(\s e. valid_trace s \ valid_trace (e#s) \ - PP s \ PIP s e \ PP (e # s))" - shows "PP s" -proof(rule vt.induct[OF vt]) - from assms(1) show "PP []" . -next - fix s e - assume h: "vt s" "PP s" "PIP s e" - show "PP (e # s)" - proof(cases rule:assms(2)) - from h(1) show v1: "valid_trace s" by (unfold_locales, simp) - next - from h(1,3) have "vt (e#s)" by auto - thus "valid_trace (e # s)" by (unfold_locales, simp) - qed (insert h, auto) -qed - lemma wq_distinct: "distinct (wq s cs)" proof(induct rule:ind) case (Cons s e) - from Cons(4,3) + interpret vt_e: valid_trace_e s e using Cons by simp show ?case - proof(induct) - case (thread_P th s cs1) - show ?case - proof(cases "cs = cs1") - case True - thus ?thesis (is "distinct ?L") - proof - - have "?L = wq_fun (schs s) cs1 @ [th]" using True - by (simp add:wq_def wf_def Let_def split:list.splits) - moreover have "distinct ..." - proof - - have "th \ set (wq_fun (schs s) cs1)" - proof - assume otherwise: "th \ set (wq_fun (schs s) cs1)" - from runing_head[OF thread_P(1) this] - have "th = hd (wq_fun (schs s) cs1)" . - hence "(Cs cs1, Th th) \ (RAG s)" using otherwise - by (simp add:s_RAG_def s_holding_def wq_def cs_holding_def) - with thread_P(2) show False by auto - qed - moreover have "distinct (wq_fun (schs s) cs1)" - using True thread_P wq_def by auto - ultimately show ?thesis by auto - qed - ultimately show ?thesis by simp - qed - next - case False - with thread_P(3) - show ?thesis - by (auto simp:wq_def wf_def Let_def split:list.splits) - qed + proof(cases e) + case (Create th prio) + interpret vt_create: valid_trace_create s e th prio + using Create by (unfold_locales, simp) + show ?thesis using Cons by (simp add: vt_create.wq_distinct_kept) + next + case (Exit th) + interpret vt_exit: valid_trace_exit s e th + using Exit by (unfold_locales, simp) + show ?thesis using Cons by (simp add: vt_exit.wq_distinct_kept) next - case (thread_V th s cs1) - thus ?case - proof(cases "cs = cs1") - case True - show ?thesis (is "distinct ?L") - proof(cases "(wq s cs)") - case Nil - thus ?thesis - by (auto simp:wq_def wf_def Let_def split:list.splits) - next - case (Cons w_hd w_tl) - moreover have "distinct (SOME q. distinct q \ set q = set w_tl)" - proof(rule someI2) - from thread_V(3)[unfolded Cons] - show "distinct w_tl \ set w_tl = set w_tl" by auto - qed auto - ultimately show ?thesis - by (auto simp:wq_def wf_def Let_def True split:list.splits) - qed - next - case False - with thread_V(3) - show ?thesis - by (auto simp:wq_def wf_def Let_def split:list.splits) - qed - qed (insert Cons, auto simp: wq_def Let_def split:list.splits) + case (P th cs) + interpret vt_p: valid_trace_p s e th cs using P by (unfold_locales, simp) + show ?thesis using Cons by (simp add: vt_p.wq_distinct_kept) + next + case (V th cs) + interpret vt_v: valid_trace_v s e th cs using V by (unfold_locales, simp) + show ?thesis using Cons by (simp add: vt_v.wq_distinct_kept) + next + case (Set th prio) + interpret vt_set: valid_trace_set s e th prio + using Set by (unfold_locales, simp) + show ?thesis using Cons by (simp add: vt_set.wq_distinct_kept) + qed qed (unfold wq_def Let_def, simp) end @@ -248,41 +487,6 @@ context valid_trace begin -lemma vt_moment: "\ t. vt (moment t s)" -proof(induct rule:ind) - case Nil - thus ?case by (simp add:vt_nil) -next - case (Cons s e t) - show ?case - proof(cases "t \ length (e#s)") - case True - from True have "moment t (e#s) = e#s" by simp - thus ?thesis using Cons - by (simp add:valid_trace_def) - next - case False - from Cons have "vt (moment t s)" by simp - moreover have "moment t (e#s) = moment t s" - proof - - from False have "t \ length s" by simp - from moment_app [OF this, of "[e]"] - show ?thesis by simp - qed - ultimately show ?thesis by simp - qed -qed -end - - -locale valid_moment = valid_trace + - fixes i :: nat - -sublocale valid_moment < vat_moment: valid_trace "(moment i s)" - by (unfold_locales, insert vt_moment, auto) - -context valid_trace -begin text {* (* ddd *) @@ -489,7 +693,6 @@ shows "th1 = th2" by (insert assms, unfold s_holding_def, auto) - lemma last_set_lt: "th \ threads s \ last_set th s < length s" apply (induct s, auto) by (case_tac a, auto split:if_splits) @@ -522,98 +725,6 @@ thus ?thesis by auto qed -(* An aux lemma used later *) -lemma unique_minus: - assumes unique: "\ a b c. \(a, b) \ r; (a, c) \ r\ \ b = c" - and xy: "(x, y) \ r" - and xz: "(x, z) \ r^+" - and neq: "y \ z" - shows "(y, z) \ r^+" -proof - - from xz and neq show ?thesis - proof(induct) - case (base ya) - have "(x, ya) \ r" by fact - from unique [OF xy this] have "y = ya" . - with base show ?case by auto - next - case (step ya z) - show ?case - proof(cases "y = ya") - case True - from step True show ?thesis by simp - next - case False - from step False - show ?thesis by auto - qed - qed -qed - -lemma unique_base: - assumes unique: "\ a b c. \(a, b) \ r; (a, c) \ r\ \ b = c" - and xy: "(x, y) \ r" - and xz: "(x, z) \ r^+" - and neq_yz: "y \ z" - shows "(y, z) \ r^+" -proof - - from xz neq_yz show ?thesis - proof(induct) - case (base ya) - from xy unique base show ?case by auto - next - case (step ya z) - show ?case - proof(cases "y = ya") - case True - from True step show ?thesis by auto - next - case False - from False step - have "(y, ya) \ r\<^sup>+" by auto - with step show ?thesis by auto - qed - qed -qed - -lemma unique_chain: - assumes unique: "\ a b c. \(a, b) \ r; (a, c) \ r\ \ b = c" - and xy: "(x, y) \ r^+" - and xz: "(x, z) \ r^+" - and neq_yz: "y \ z" - shows "(y, z) \ r^+ \ (z, y) \ r^+" -proof - - from xy xz neq_yz show ?thesis - proof(induct) - case (base y) - have h1: "(x, y) \ r" and h2: "(x, z) \ r\<^sup>+" and h3: "y \ z" using base by auto - from unique_base [OF _ h1 h2 h3] and unique show ?case by auto - next - case (step y za) - show ?case - proof(cases "y = z") - case True - from True step show ?thesis by auto - next - case False - from False step have "(y, z) \ r\<^sup>+ \ (z, y) \ r\<^sup>+" by auto - thus ?thesis - proof - assume "(z, y) \ r\<^sup>+" - with step have "(z, za) \ r\<^sup>+" by auto - thus ?thesis by auto - next - assume h: "(y, z) \ r\<^sup>+" - from step have yza: "(y, za) \ r" by simp - from step have "za \ z" by simp - from unique_minus [OF _ yza h this] and unique - have "(za, z) \ r\<^sup>+" by auto - thus ?thesis by auto - qed - qed - qed -qed - text {* The following three lemmas show that @{text "RAG"} does not change by the happening of @{text "Set"}, @{text "Create"} and @{text "Exit"} @@ -632,291 +743,13 @@ apply (unfold s_RAG_def s_waiting_def wq_def) by (simp add:Let_def) -context valid_trace -begin - -lemma finite_threads: - shows "finite (threads s)" -using vt by (induct) (auto elim: step.cases) - -lemma cp_eq_cpreced: "cp s th = cpreced (wq s) s th" -unfolding cp_def wq_def -apply(induct s rule: schs.induct) -thm cpreced_initial -apply(simp add: Let_def cpreced_initial) -apply(simp add: Let_def) -apply(simp add: Let_def) -apply(simp add: Let_def) -apply(subst (2) schs.simps) -apply(simp add: Let_def) -apply(subst (2) schs.simps) -apply(simp add: Let_def) -done - -lemma RAG_target_th: "(Th th, x) \ RAG (s::state) \ \ cs. x = Cs cs" - by (unfold s_RAG_def, auto) - -lemma wq_threads: - assumes h: "th \ set (wq s cs)" - shows "th \ threads s" -proof - - from vt and h show ?thesis - proof(induct arbitrary: th cs) - case (vt_cons s e) - interpret vt_s: valid_trace s - using vt_cons(1) by (unfold_locales, auto) - assume ih: "\th cs. th \ set (wq s cs) \ th \ threads s" - and stp: "step s e" - and vt: "vt s" - and h: "th \ set (wq (e # s) cs)" - show ?case - proof(cases e) - case (Create th' prio) - with ih h show ?thesis - by (auto simp:wq_def Let_def) - next - case (Exit th') - with stp ih h show ?thesis - apply (auto simp:wq_def Let_def) - apply (ind_cases "step s (Exit th')") - apply (auto simp:runing_def readys_def s_holding_def s_waiting_def holdents_def - s_RAG_def s_holding_def cs_holding_def) - done - next - case (V th' cs') - show ?thesis - proof(cases "cs' = cs") - case False - with h - show ?thesis - apply(unfold wq_def V, auto simp:Let_def V split:prod.splits, fold wq_def) - by (drule_tac ih, simp) - next - case True - from h - show ?thesis - proof(unfold V wq_def) - assume th_in: "th \ set (wq_fun (schs (V th' cs' # s)) cs)" (is "th \ set ?l") - show "th \ threads (V th' cs' # s)" - proof(cases "cs = cs'") - case False - hence "?l = wq_fun (schs s) cs" by (simp add:Let_def) - with th_in have " th \ set (wq s cs)" - by (fold wq_def, simp) - from ih [OF this] show ?thesis by simp - next - case True - show ?thesis - proof(cases "wq_fun (schs s) cs'") - case Nil - with h V show ?thesis - apply (auto simp:wq_def Let_def split:if_splits) - by (fold wq_def, drule_tac ih, simp) - next - case (Cons a rest) - assume eq_wq: "wq_fun (schs s) cs' = a # rest" - with h V show ?thesis - apply (auto simp:Let_def wq_def split:if_splits) - proof - - assume th_in: "th \ set (SOME q. distinct q \ set q = set rest)" - have "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from vt_s.wq_distinct[of cs'] and eq_wq[folded wq_def] - show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" - by auto - qed - with eq_wq th_in have "th \ set (wq_fun (schs s) cs')" by auto - from ih[OF this[folded wq_def]] show "th \ threads s" . - next - assume th_in: "th \ set (wq_fun (schs s) cs)" - from ih[OF this[folded wq_def]] - show "th \ threads s" . - qed - qed - qed - qed - qed - next - case (P th' cs') - from h stp - show ?thesis - apply (unfold P wq_def) - apply (auto simp:Let_def split:if_splits, fold wq_def) - apply (auto intro:ih) - apply(ind_cases "step s (P th' cs')") - by (unfold runing_def readys_def, auto) - next - case (Set thread prio) - with ih h show ?thesis - by (auto simp:wq_def Let_def) - qed - next - case vt_nil - thus ?case by (auto simp:wq_def) - qed -qed - -lemma dm_RAG_threads: - assumes in_dom: "(Th th) \ Domain (RAG s)" - shows "th \ threads s" -proof - - from in_dom obtain n where "(Th th, n) \ RAG s" by auto - moreover from RAG_target_th[OF this] obtain cs where "n = Cs cs" by auto - ultimately have "(Th th, Cs cs) \ RAG s" by simp - hence "th \ set (wq s cs)" - by (unfold s_RAG_def, auto simp:cs_waiting_def) - from wq_threads [OF this] show ?thesis . -qed - - -lemma cp_le: - assumes th_in: "th \ threads s" - shows "cp s th \ Max ((\ th. (preced th s)) ` threads s)" -proof(unfold cp_eq_cpreced cpreced_def cs_dependants_def) - show "Max ((\th. preced th s) ` ({th} \ {th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+})) - \ Max ((\th. preced th s) ` threads s)" - (is "Max (?f ` ?A) \ Max (?f ` ?B)") - proof(rule Max_f_mono) - show "{th} \ {th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} \ {}" by simp - next - from finite_threads - show "finite (threads s)" . - next - from th_in - show "{th} \ {th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} \ threads s" - apply (auto simp:Domain_def) - apply (rule_tac dm_RAG_threads) - apply (unfold trancl_domain [of "RAG s", symmetric]) - by (unfold cs_RAG_def s_RAG_def, auto simp:Domain_def) - qed -qed - -lemma le_cp: - shows "preced th s \ cp s th" -proof(unfold cp_eq_cpreced preced_def cpreced_def, simp) - show "Prc (priority th s) (last_set th s) - \ Max (insert (Prc (priority th s) (last_set th s)) - ((\th. Prc (priority th s) (last_set th s)) ` dependants (wq s) th))" - (is "?l \ Max (insert ?l ?A)") - proof(cases "?A = {}") - case False - have "finite ?A" (is "finite (?f ` ?B)") - proof - - have "finite ?B" - proof- - have "finite {th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+}" - proof - - let ?F = "\ (x, y). the_th x" - have "{th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} \ ?F ` ((RAG (wq s))\<^sup>+)" - apply (auto simp:image_def) - by (rule_tac x = "(Th x, Th th)" in bexI, auto) - moreover have "finite \" - proof - - from finite_RAG have "finite (RAG s)" . - hence "finite ((RAG (wq s))\<^sup>+)" - apply (unfold finite_trancl) - by (auto simp: s_RAG_def cs_RAG_def wq_def) - thus ?thesis by auto - qed - ultimately show ?thesis by (auto intro:finite_subset) - qed - thus ?thesis by (simp add:cs_dependants_def) - qed - thus ?thesis by simp - qed - from Max_insert [OF this False, of ?l] show ?thesis by auto - next - case True - thus ?thesis by auto - qed -qed - -lemma max_cp_eq: - shows "Max ((cp s) ` threads s) = Max ((\ th. (preced th s)) ` threads s)" - (is "?l = ?r") -proof(cases "threads s = {}") - case True - thus ?thesis by auto -next - case False - have "?l \ ((cp s) ` threads s)" - proof(rule Max_in) - from finite_threads - show "finite (cp s ` threads s)" by auto - next - from False show "cp s ` threads s \ {}" by auto - qed - then obtain th - where th_in: "th \ threads s" and eq_l: "?l = cp s th" by auto - have "\ \ ?r" by (rule cp_le[OF th_in]) - moreover have "?r \ cp s th" (is "Max (?f ` ?A) \ cp s th") - proof - - have "?r \ (?f ` ?A)" - proof(rule Max_in) - from finite_threads - show " finite ((\th. preced th s) ` threads s)" by auto - next - from False show " (\th. preced th s) ` threads s \ {}" by auto - qed - then obtain th' where - th_in': "th' \ ?A " and eq_r: "?r = ?f th'" by auto - from le_cp [of th'] eq_r - have "?r \ cp s th'" by auto - moreover have "\ \ cp s th" - proof(fold eq_l) - show " cp s th' \ Max (cp s ` threads s)" - proof(rule Max_ge) - from th_in' show "cp s th' \ cp s ` threads s" - by auto - next - from finite_threads - show "finite (cp s ` threads s)" by auto - qed - qed - ultimately show ?thesis by auto - qed - ultimately show ?thesis using eq_l by auto -qed - -lemma max_cp_eq_the_preced: - shows "Max ((cp s) ` threads s) = Max (the_preced s ` threads s)" - using max_cp_eq using the_preced_def by presburger - -end - -lemma preced_v [simp]: "preced th' (V th cs#s) = preced th' s" - by (unfold preced_def, simp) - -lemma the_preced_v[simp]: "the_preced (V th cs#s) = the_preced s" -proof - fix th' - show "the_preced (V th cs # s) th' = the_preced s th'" - by (unfold the_preced_def preced_def, simp) -qed - -locale valid_trace_v = valid_trace_e + - fixes th cs - assumes is_v: "e = V th cs" context valid_trace_v begin -definition "rest = tl (wq s cs)" - -definition "wq' = (SOME q. distinct q \ set q = set rest)" - lemma distinct_rest: "distinct rest" by (simp add: distinct_tl rest_def wq_distinct) -lemma runing_th_s: - shows "th \ runing s" -proof - - from pip_e[unfolded is_v] - show ?thesis by (cases, simp) -qed - lemma holding_cs_eq_th: assumes "holding s t cs" shows "t = th" @@ -930,38 +763,6 @@ qed qed -lemma th_not_waiting: - "\ waiting s th c" -proof - - have "th \ readys s" - using runing_ready runing_th_s by blast - thus ?thesis - by (unfold readys_def, auto) -qed - -lemma waiting_neq_th: - assumes "waiting s t c" - shows "t \ th" - using assms using th_not_waiting by blast - -lemma wq_s_cs: - "wq s cs = th#rest" -proof - - from pip_e[unfolded is_v] - show ?thesis - proof(cases) - case (thread_V) - from this(2) show ?thesis - by (unfold rest_def s_holding_def, fold wq_def, - metis empty_iff list.collapse list.set(1)) - qed -qed - -lemma wq_es_cs: - "wq (e#s) cs = wq'" - using wq_s_cs[unfolded wq_def] - by (auto simp:Let_def wq_def rest_def wq'_def is_v, simp) - lemma distinct_wq': "distinct wq'" by (metis (mono_tags, lifting) distinct_rest some_eq_ex wq'_def) @@ -1020,10 +821,19 @@ show ?thesis . qed +lemma holding_esI1: + assumes "holding s t c" + and "t \ th" + shows "holding (e#s) t c" +proof - + have "c \ cs" using assms using holding_cs_eq_th by blast + from holding_esI2[OF this assms(1)] + show ?thesis . +qed + end -locale valid_trace_v_n = valid_trace_v + - assumes rest_nnl: "rest \ []" +context valid_trace_v_n begin lemma neq_wq': "wq' \ []" @@ -1148,8 +958,8 @@ end -locale valid_trace_v_e = valid_trace_v + - assumes rest_nil: "rest = []" + +context valid_trace_v_e begin lemma nil_wq': "wq' = []" @@ -1200,6 +1010,16 @@ show ?thesis by auto qed +lemma waiting_esI2: + assumes "waiting s t c" + shows "waiting (e#s) t c" +proof - + have "c \ cs" using assms + using cs_waiting_def rest_nil waiting_eq wq_s_cs by auto + from waiting_esI1[OF assms this] + show ?thesis . +qed + lemma waiting_esE: assumes "waiting (e#s) t c" obtains "c \ cs" "waiting s t c" @@ -1230,7 +1050,7 @@ from that[OF False this] show ?thesis . qed -end (* ccc *) +end lemma rel_eqI: assumes "\ x y. (x,y) \ A \ (x,y) \ B" @@ -1248,7 +1068,7 @@ context valid_trace_v begin -lemma +lemma RAG_es: "RAG (e # s) = RAG s - {(Cs cs, Th th)} - {(Th th', Cs cs) |th'. next_th s th cs th'} \ @@ -1356,16 +1176,83 @@ thus ?thesis proof(cases rule:in_RAG_E) case (waiting th' cs') - thus ?thesis + from h and this(1,2) + have "th' \ h_n.taker \ cs' \ cs" by auto + hence "waiting (e#s) th' cs'" + proof + assume "cs' \ cs" + from waiting_esI1[OF waiting(3) this] + show ?thesis . + next + assume neq_th': "th' \ h_n.taker" + show ?thesis + proof(cases "cs' = cs") + case False + from waiting_esI1[OF waiting(3) this] + show ?thesis . + next + case True + from h_n.waiting_esI2[OF waiting(3)[unfolded True] neq_th', folded True] + show ?thesis . + qed + qed + thus ?thesis using waiting(1,2) + by (unfold s_RAG_def, fold waiting_eq, auto) + next + case (holding th' cs') + from h this(1,2) + have "cs' \ cs \ th' \ th" by auto + hence "holding (e#s) th' cs'" + proof + assume "cs' \ cs" + from holding_esI2[OF this holding(3)] + show ?thesis . + next + assume "th' \ th" + from holding_esI1[OF holding(3) this] + show ?thesis . + qed + thus ?thesis using holding(1,2) + by (unfold s_RAG_def, fold holding_eq, auto) qed qed - qed + next + case True + interpret h_e: valid_trace_v_e s e th cs + by (unfold_locales, insert True, simp) + from h[unfolded h_e.waiting_set_eq h_e.holding_set_eq] + have h_s: "(n1, n2) \ RAG s" "(n1, n2) \ (Cs cs, Th th)" + by auto + from h_s(1) + show ?thesis + proof(cases rule:in_RAG_E) + case (waiting th' cs') + from h_e.waiting_esI2[OF this(3)] + show ?thesis using waiting(1,2) + by (unfold s_RAG_def, fold waiting_eq, auto) + next + case (holding th' cs') + with h_s(2) + have "cs' \ cs \ th' \ th" by auto + thus ?thesis + proof + assume neq_cs: "cs' \ cs" + from holding_esI2[OF this holding(3)] + show ?thesis using holding(1,2) + by (unfold s_RAG_def, fold holding_eq, auto) + next + assume "th' \ th" + from holding_esI1[OF holding(3) this] + show ?thesis using holding(1,2) + by (unfold s_RAG_def, fold holding_eq, auto) + qed + qed + qed qed end - -lemma step_RAG_v: (* ccc *) +lemma step_RAG_v: assumes vt: "vt (V th cs#s)" shows " @@ -1373,1385 +1260,115 @@ RAG s - {(Cs cs, Th th)} - {(Th th', Cs cs) |th'. next_th s th cs th'} \ {(Cs cs, Th th') |th'. next_th s th cs th'}" (is "?L = ?R") -proof(rule rel_eqI) - fix n1 n2 - assume "(n1, n2) \ ?L" - show "(n1, n2) \ ?R" sorry -next - fix n1 n2 - assume "(n1, n2) \ ?R" - show "(n1, n2) \ ?L" sorry +proof - + interpret vt_v: valid_trace_v s "V th cs" + using assms step_back_vt by (unfold_locales, auto) + show ?thesis using vt_v.RAG_es . +qed + +lemma (in valid_trace_create) + th_not_in_threads: "th \ threads s" +proof - + from pip_e[unfolded is_create] + show ?thesis by (cases, simp) qed - +lemma (in valid_trace_create) + threads_es [simp]: "threads (e#s) = threads s \ {th}" + by (unfold is_create, simp) -text {* (* ddd *) - The following @{text "step_RAG_v"} lemma charaterizes how @{text "RAG"} is changed - with the happening of @{text "V"}-events: -*} -lemma step_RAG_v: -assumes vt: - "vt (V th cs#s)" -shows " - RAG (V th cs # s) = - RAG s - {(Cs cs, Th th)} - - {(Th th', Cs cs) |th'. next_th s th cs th'} \ - {(Cs cs, Th th') |th'. next_th s th cs th'}" - apply (insert vt, unfold s_RAG_def) - apply (auto split:if_splits list.splits simp:Let_def) - apply (auto elim: step_v_waiting_mono step_v_hold_inv - step_v_release step_v_wait_inv - step_v_get_hold step_v_release_inv) - apply (erule_tac step_v_not_wait, auto) - done +lemma (in valid_trace_exit) + threads_es [simp]: "threads (e#s) = threads s - {th}" + by (unfold is_exit, simp) -text {* - The following @{text "step_RAG_p"} lemma charaterizes how @{text "RAG"} is changed - with the happening of @{text "P"}-events: -*} -lemma step_RAG_p: - "vt (P th cs#s) \ - RAG (P th cs # s) = (if (wq s cs = []) then RAG s \ {(Cs cs, Th th)} - else RAG s \ {(Th th, Cs cs)})" - apply(simp only: s_RAG_def wq_def) - apply (auto split:list.splits prod.splits simp:Let_def wq_def cs_waiting_def cs_holding_def) - apply(case_tac "csa = cs", auto) - apply(fold wq_def) - apply(drule_tac step_back_step) - apply(ind_cases " step s (P (hd (wq s cs)) cs)") - apply(simp add:s_RAG_def wq_def cs_holding_def) - apply(auto) - done +lemma (in valid_trace_p) + threads_es [simp]: "threads (e#s) = threads s" + by (unfold is_p, simp) - -lemma RAG_target_th: "(Th th, x) \ RAG (s::state) \ \ cs. x = Cs cs" - by (unfold s_RAG_def, auto) - -context valid_trace -begin +lemma (in valid_trace_v) + threads_es [simp]: "threads (e#s) = threads s" + by (unfold is_v, simp) -text {* - The following lemma shows that @{text "RAG"} is acyclic. - The overall structure is by induction on the formation of @{text "vt s"} - and then case analysis on event @{text "e"}, where the non-trivial cases - for those for @{text "V"} and @{text "P"} events. -*} -lemma acyclic_RAG: - shows "acyclic (RAG s)" -using vt -proof(induct) - case (vt_cons s e) - interpret vt_s: valid_trace s using vt_cons(1) - by (unfold_locales, simp) - assume ih: "acyclic (RAG s)" - and stp: "step s e" - and vt: "vt s" - show ?case - proof(cases e) - case (Create th prio) - with ih - show ?thesis by (simp add:RAG_create_unchanged) - next - case (Exit th) - with ih show ?thesis by (simp add:RAG_exit_unchanged) - next - case (V th cs) - from V vt stp have vtt: "vt (V th cs#s)" by auto - from step_RAG_v [OF this] - have eq_de: - "RAG (e # s) = - RAG s - {(Cs cs, Th th)} - {(Th th', Cs cs) |th'. next_th s th cs th'} \ - {(Cs cs, Th th') |th'. next_th s th cs th'}" - (is "?L = (?A - ?B - ?C) \ ?D") by (simp add:V) - from ih have ac: "acyclic (?A - ?B - ?C)" by (auto elim:acyclic_subset) - from step_back_step [OF vtt] - have "step s (V th cs)" . - thus ?thesis - proof(cases) - assume "holding s th cs" - hence th_in: "th \ set (wq s cs)" and - eq_hd: "th = hd (wq s cs)" unfolding s_holding_def wq_def by auto - then obtain rest where - eq_wq: "wq s cs = th#rest" - by (cases "wq s cs", auto) - show ?thesis - proof(cases "rest = []") - case False - let ?th' = "hd (SOME q. distinct q \ set q = set rest)" - from eq_wq False have eq_D: "?D = {(Cs cs, Th ?th')}" - by (unfold next_th_def, auto) - let ?E = "(?A - ?B - ?C)" - have "(Th ?th', Cs cs) \ ?E\<^sup>*" - proof - assume "(Th ?th', Cs cs) \ ?E\<^sup>*" - hence " (Th ?th', Cs cs) \ ?E\<^sup>+" by (simp add: rtrancl_eq_or_trancl) - from tranclD [OF this] - obtain x where th'_e: "(Th ?th', x) \ ?E" by blast - hence th_d: "(Th ?th', x) \ ?A" by simp - from RAG_target_th [OF this] - obtain cs' where eq_x: "x = Cs cs'" by auto - with th_d have "(Th ?th', Cs cs') \ ?A" by simp - hence wt_th': "waiting s ?th' cs'" - unfolding s_RAG_def s_waiting_def cs_waiting_def wq_def by simp - hence "cs' = cs" - proof(rule vt_s.waiting_unique) - from eq_wq vt_s.wq_distinct[of cs] - show "waiting s ?th' cs" - apply (unfold s_waiting_def wq_def, auto) - proof - - assume hd_in: "hd (SOME q. distinct q \ set q = set rest) \ set rest" - and eq_wq: "wq_fun (schs s) cs = th # rest" - have "(SOME q. distinct q \ set q = set rest) \ []" - proof(rule someI2) - from vt_s.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" unfolding wq_def by auto - next - fix x assume "distinct x \ set x = set rest" - with False show "x \ []" by auto - qed - hence "hd (SOME q. distinct q \ set q = set rest) \ - set (SOME q. distinct q \ set q = set rest)" by auto - moreover have "\ = set rest" - proof(rule someI2) - from vt_s.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" unfolding wq_def by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" by auto - qed - moreover note hd_in - ultimately show "hd (SOME q. distinct q \ set q = set rest) = th" by auto - next - assume hd_in: "hd (SOME q. distinct q \ set q = set rest) \ set rest" - and eq_wq: "wq s cs = hd (SOME q. distinct q \ set q = set rest) # rest" - have "(SOME q. distinct q \ set q = set rest) \ []" - proof(rule someI2) - from vt_s.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" by auto - next - fix x assume "distinct x \ set x = set rest" - with False show "x \ []" by auto - qed - hence "hd (SOME q. distinct q \ set q = set rest) \ - set (SOME q. distinct q \ set q = set rest)" by auto - moreover have "\ = set rest" - proof(rule someI2) - from vt_s.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" by auto - qed - moreover note hd_in - ultimately show False by auto - qed - qed - with th'_e eq_x have "(Th ?th', Cs cs) \ ?E" by simp - with False - show "False" by (auto simp: next_th_def eq_wq) - qed - with acyclic_insert[symmetric] and ac - and eq_de eq_D show ?thesis by auto - next - case True - with eq_wq - have eq_D: "?D = {}" - by (unfold next_th_def, auto) - with eq_de ac - show ?thesis by auto - qed - qed - next - case (P th cs) - from P vt stp have vtt: "vt (P th cs#s)" by auto - from step_RAG_p [OF this] P - have "RAG (e # s) = - (if wq s cs = [] then RAG s \ {(Cs cs, Th th)} else - RAG s \ {(Th th, Cs cs)})" (is "?L = ?R") - by simp - moreover have "acyclic ?R" - proof(cases "wq s cs = []") - case True - hence eq_r: "?R = RAG s \ {(Cs cs, Th th)}" by simp - have "(Th th, Cs cs) \ (RAG s)\<^sup>*" - proof - assume "(Th th, Cs cs) \ (RAG s)\<^sup>*" - hence "(Th th, Cs cs) \ (RAG s)\<^sup>+" by (simp add: rtrancl_eq_or_trancl) - from tranclD2 [OF this] - obtain x where "(x, Cs cs) \ RAG s" by auto - with True show False by (auto simp:s_RAG_def cs_waiting_def) - qed - with acyclic_insert ih eq_r show ?thesis by auto - next - case False - hence eq_r: "?R = RAG s \ {(Th th, Cs cs)}" by simp - have "(Cs cs, Th th) \ (RAG s)\<^sup>*" - proof - assume "(Cs cs, Th th) \ (RAG s)\<^sup>*" - hence "(Cs cs, Th th) \ (RAG s)\<^sup>+" by (simp add: rtrancl_eq_or_trancl) - moreover from step_back_step [OF vtt] have "step s (P th cs)" . - ultimately show False - proof - - show " \(Cs cs, Th th) \ (RAG s)\<^sup>+; step s (P th cs)\ \ False" - by (ind_cases "step s (P th cs)", simp) - qed - qed - with acyclic_insert ih eq_r show ?thesis by auto - qed - ultimately show ?thesis by simp - next - case (Set thread prio) - with ih - thm RAG_set_unchanged - show ?thesis by (simp add:RAG_set_unchanged) - qed - next - case vt_nil - show "acyclic (RAG ([]::state))" - by (auto simp: s_RAG_def cs_waiting_def - cs_holding_def wq_def acyclic_def) +lemma (in valid_trace_v) + th_not_in_rest[simp]: "th \ set rest" +proof + assume otherwise: "th \ set rest" + have "distinct (wq s cs)" by (simp add: wq_distinct) + from this[unfolded wq_s_cs] and otherwise + show False by auto +qed + +lemma (in valid_trace_v) + set_wq_es_cs [simp]: "set (wq (e#s) cs) = set (wq s cs) - {th}" +proof(unfold wq_es_cs wq'_def, rule someI2) + show "distinct rest \ set rest = set rest" + by (simp add: distinct_rest) +next + fix x + assume "distinct x \ set x = set rest" + thus "set x = set (wq s cs) - {th}" + by (unfold wq_s_cs, simp) qed - -lemma finite_RAG: - shows "finite (RAG s)" +lemma (in valid_trace_exit) + th_not_in_wq: "th \ set (wq s cs)" proof - - from vt show ?thesis - proof(induct) - case (vt_cons s e) - interpret vt_s: valid_trace s using vt_cons(1) - by (unfold_locales, simp) - assume ih: "finite (RAG s)" - and stp: "step s e" - and vt: "vt s" - show ?case - proof(cases e) - case (Create th prio) - with ih - show ?thesis by (simp add:RAG_create_unchanged) - next - case (Exit th) - with ih show ?thesis by (simp add:RAG_exit_unchanged) - next - case (V th cs) - from V vt stp have vtt: "vt (V th cs#s)" by auto - from step_RAG_v [OF this] - have eq_de: "RAG (e # s) = - RAG s - {(Cs cs, Th th)} - {(Th th', Cs cs) |th'. next_th s th cs th'} \ - {(Cs cs, Th th') |th'. next_th s th cs th'} -" - (is "?L = (?A - ?B - ?C) \ ?D") by (simp add:V) - moreover from ih have ac: "finite (?A - ?B - ?C)" by simp - moreover have "finite ?D" - proof - - have "?D = {} \ (\ a. ?D = {a})" - by (unfold next_th_def, auto) - thus ?thesis - proof - assume h: "?D = {}" - show ?thesis by (unfold h, simp) - next - assume "\ a. ?D = {a}" - thus ?thesis - by (metis finite.simps) - qed - qed - ultimately show ?thesis by simp - next - case (P th cs) - from P vt stp have vtt: "vt (P th cs#s)" by auto - from step_RAG_p [OF this] P - have "RAG (e # s) = - (if wq s cs = [] then RAG s \ {(Cs cs, Th th)} else - RAG s \ {(Th th, Cs cs)})" (is "?L = ?R") - by simp - moreover have "finite ?R" - proof(cases "wq s cs = []") - case True - hence eq_r: "?R = RAG s \ {(Cs cs, Th th)}" by simp - with True and ih show ?thesis by auto - next - case False - hence "?R = RAG s \ {(Th th, Cs cs)}" by simp - with False and ih show ?thesis by auto - qed - ultimately show ?thesis by auto - next - case (Set thread prio) - with ih - show ?thesis by (simp add:RAG_set_unchanged) - qed - next - case vt_nil - show "finite (RAG ([]::state))" - by (auto simp: s_RAG_def cs_waiting_def - cs_holding_def wq_def acyclic_def) - qed -qed - -text {* Several useful lemmas *} - -lemma wf_dep_converse: - shows "wf ((RAG s)^-1)" -proof(rule finite_acyclic_wf_converse) - from finite_RAG - show "finite (RAG s)" . -next - from acyclic_RAG - show "acyclic (RAG s)" . + from pip_e[unfolded is_exit] + show ?thesis + by (cases, unfold holdents_def s_holding_def, fold wq_def, + auto elim!:runing_wqE) qed -end - -lemma hd_np_in: "x \ set l \ hd l \ set l" - by (induct l, auto) - -lemma th_chasing: "(Th th, Cs cs) \ RAG (s::state) \ \ th'. (Cs cs, Th th') \ RAG s" - by (auto simp:s_RAG_def s_holding_def cs_holding_def cs_waiting_def wq_def dest:hd_np_in) - -context valid_trace -begin - -lemma wq_threads: - assumes h: "th \ set (wq s cs)" +lemma (in valid_trace) wq_threads: + assumes "th \ set (wq s cs)" shows "th \ threads s" -proof - - from vt and h show ?thesis - proof(induct arbitrary: th cs) - case (vt_cons s e) - interpret vt_s: valid_trace s - using vt_cons(1) by (unfold_locales, auto) - assume ih: "\th cs. th \ set (wq s cs) \ th \ threads s" - and stp: "step s e" - and vt: "vt s" - and h: "th \ set (wq (e # s) cs)" - show ?case - proof(cases e) - case (Create th' prio) - with ih h show ?thesis + using assms +proof(induct rule:ind) + case (Nil) + thus ?case by (auto simp:wq_def) +next + case (Cons s e) + interpret vt_e: valid_trace_e s e using Cons by simp + show ?case + proof(cases e) + case (Create th' prio') + interpret vt: valid_trace_create s e th' prio' + using Create by (unfold_locales, simp) + show ?thesis + using Cons.hyps(2) Cons.prems by auto + next + case (Exit th') + interpret vt: valid_trace_exit s e th' + using Exit by (unfold_locales, simp) + show ?thesis + using Cons.hyps(2) Cons.prems vt.th_not_in_wq by auto + next + case (P th' cs') + interpret vt: valid_trace_p s e th' cs' + using P by (unfold_locales, simp) + show ?thesis + using Cons.hyps(2) Cons.prems readys_threads + runing_ready vt.is_p vt.runing_th_s vt_e.wq_in_inv + by fastforce + next + case (V th' cs') + interpret vt: valid_trace_v s e th' cs' + using V by (unfold_locales, simp) + show ?thesis using Cons + using vt.is_v vt.threads_es vt_e.wq_in_inv by blast + next + case (Set th' prio) + interpret vt: valid_trace_set s e th' prio + using Set by (unfold_locales, simp) + show ?thesis using Cons.hyps(2) Cons.prems vt.is_set by (auto simp:wq_def Let_def) - next - case (Exit th') - with stp ih h show ?thesis - apply (auto simp:wq_def Let_def) - apply (ind_cases "step s (Exit th')") - apply (auto simp:runing_def readys_def s_holding_def s_waiting_def holdents_def - s_RAG_def s_holding_def cs_holding_def) - done - next - case (V th' cs') - show ?thesis - proof(cases "cs' = cs") - case False - with h - show ?thesis - apply(unfold wq_def V, auto simp:Let_def V split:prod.splits, fold wq_def) - by (drule_tac ih, simp) - next - case True - from h - show ?thesis - proof(unfold V wq_def) - assume th_in: "th \ set (wq_fun (schs (V th' cs' # s)) cs)" (is "th \ set ?l") - show "th \ threads (V th' cs' # s)" - proof(cases "cs = cs'") - case False - hence "?l = wq_fun (schs s) cs" by (simp add:Let_def) - with th_in have " th \ set (wq s cs)" - by (fold wq_def, simp) - from ih [OF this] show ?thesis by simp - next - case True - show ?thesis - proof(cases "wq_fun (schs s) cs'") - case Nil - with h V show ?thesis - apply (auto simp:wq_def Let_def split:if_splits) - by (fold wq_def, drule_tac ih, simp) - next - case (Cons a rest) - assume eq_wq: "wq_fun (schs s) cs' = a # rest" - with h V show ?thesis - apply (auto simp:Let_def wq_def split:if_splits) - proof - - assume th_in: "th \ set (SOME q. distinct q \ set q = set rest)" - have "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from vt_s.wq_distinct[of cs'] and eq_wq[folded wq_def] - show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" - by auto - qed - with eq_wq th_in have "th \ set (wq_fun (schs s) cs')" by auto - from ih[OF this[folded wq_def]] show "th \ threads s" . - next - assume th_in: "th \ set (wq_fun (schs s) cs)" - from ih[OF this[folded wq_def]] - show "th \ threads s" . - qed - qed - qed - qed - qed - next - case (P th' cs') - from h stp - show ?thesis - apply (unfold P wq_def) - apply (auto simp:Let_def split:if_splits, fold wq_def) - apply (auto intro:ih) - apply(ind_cases "step s (P th' cs')") - by (unfold runing_def readys_def, auto) - next - case (Set thread prio) - with ih h show ?thesis - by (auto simp:wq_def Let_def) - qed - next - case vt_nil - thus ?case by (auto simp:wq_def) qed -qed - -lemma range_in: "\(Th th) \ Range (RAG (s::state))\ \ th \ threads s" - apply(unfold s_RAG_def cs_waiting_def cs_holding_def) - by (auto intro:wq_threads) - -lemma readys_v_eq: - assumes neq_th: "th \ thread" - and eq_wq: "wq s cs = thread#rest" - and not_in: "th \ set rest" - shows "(th \ readys (V thread cs#s)) = (th \ readys s)" -proof - - from assms show ?thesis - apply (auto simp:readys_def) - apply(simp add:s_waiting_def[folded wq_def]) - apply (erule_tac x = csa in allE) - apply (simp add:s_waiting_def wq_def Let_def split:if_splits) - apply (case_tac "csa = cs", simp) - apply (erule_tac x = cs in allE) - apply(auto simp add: s_waiting_def[folded wq_def] Let_def split: list.splits) - apply(auto simp add: wq_def) - apply (auto simp:s_waiting_def wq_def Let_def split:list.splits) - proof - - assume th_nin: "th \ set rest" - and th_in: "th \ set (SOME q. distinct q \ set q = set rest)" - and eq_wq: "wq_fun (schs s) cs = thread # rest" - have "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from wq_distinct[of cs, unfolded wq_def] and eq_wq[unfolded wq_def] - show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" by auto - qed - with th_nin th_in show False by auto - qed -qed - -text {* \noindent - The following lemmas shows that: starting from any node in @{text "RAG"}, - by chasing out-going edges, it is always possible to reach a node representing a ready - thread. In this lemma, it is the @{text "th'"}. -*} - -lemma chain_building: - shows "node \ Domain (RAG s) \ (\ th'. th' \ readys s \ (node, Th th') \ (RAG s)^+)" -proof - - from wf_dep_converse - have h: "wf ((RAG s)\)" . - show ?thesis - proof(induct rule:wf_induct [OF h]) - fix x - assume ih [rule_format]: - "\y. (y, x) \ (RAG s)\ \ - y \ Domain (RAG s) \ (\th'. th' \ readys s \ (y, Th th') \ (RAG s)\<^sup>+)" - show "x \ Domain (RAG s) \ (\th'. th' \ readys s \ (x, Th th') \ (RAG s)\<^sup>+)" - proof - assume x_d: "x \ Domain (RAG s)" - show "\th'. th' \ readys s \ (x, Th th') \ (RAG s)\<^sup>+" - proof(cases x) - case (Th th) - from x_d Th obtain cs where x_in: "(Th th, Cs cs) \ RAG s" by (auto simp:s_RAG_def) - with Th have x_in_r: "(Cs cs, x) \ (RAG s)^-1" by simp - from th_chasing [OF x_in] obtain th' where "(Cs cs, Th th') \ RAG s" by blast - hence "Cs cs \ Domain (RAG s)" by auto - from ih [OF x_in_r this] obtain th' - where th'_ready: " th' \ readys s" and cs_in: "(Cs cs, Th th') \ (RAG s)\<^sup>+" by auto - have "(x, Th th') \ (RAG s)\<^sup>+" using Th x_in cs_in by auto - with th'_ready show ?thesis by auto - next - case (Cs cs) - from x_d Cs obtain th' where th'_d: "(Th th', x) \ (RAG s)^-1" by (auto simp:s_RAG_def) - show ?thesis - proof(cases "th' \ readys s") - case True - from True and th'_d show ?thesis by auto - next - case False - from th'_d and range_in have "th' \ threads s" by auto - with False have "Th th' \ Domain (RAG s)" - by (auto simp:readys_def wq_def s_waiting_def s_RAG_def cs_waiting_def Domain_def) - from ih [OF th'_d this] - obtain th'' where - th''_r: "th'' \ readys s" and - th''_in: "(Th th', Th th'') \ (RAG s)\<^sup>+" by auto - from th'_d and th''_in - have "(x, Th th'') \ (RAG s)\<^sup>+" by auto - with th''_r show ?thesis by auto - qed - qed - qed - qed -qed - -text {* \noindent - The following is just an instance of @{text "chain_building"}. -*} -lemma th_chain_to_ready: - assumes th_in: "th \ threads s" - shows "th \ readys s \ (\ th'. th' \ readys s \ (Th th, Th th') \ (RAG s)^+)" -proof(cases "th \ readys s") - case True - thus ?thesis by auto -next - case False - from False and th_in have "Th th \ Domain (RAG s)" - by (auto simp:readys_def s_waiting_def s_RAG_def wq_def cs_waiting_def Domain_def) - from chain_building [rule_format, OF this] - show ?thesis by auto -qed - -end - - - -lemma holding_unique: "\holding (s::state) th1 cs; holding s th2 cs\ \ th1 = th2" - by (unfold s_holding_def cs_holding_def, auto) - -context valid_trace -begin - -lemma unique_RAG: "\(n, n1) \ RAG s; (n, n2) \ RAG s\ \ n1 = n2" - apply(unfold s_RAG_def, auto, fold waiting_eq holding_eq) - by(auto elim:waiting_unique holding_unique) - -end - - -lemma trancl_split: "(a, b) \ r^+ \ \ c. (a, c) \ r" -by (induct rule:trancl_induct, auto) +qed context valid_trace begin -lemma dchain_unique: - assumes th1_d: "(n, Th th1) \ (RAG s)^+" - and th1_r: "th1 \ readys s" - and th2_d: "(n, Th th2) \ (RAG s)^+" - and th2_r: "th2 \ readys s" - shows "th1 = th2" -proof - - { assume neq: "th1 \ th2" - hence "Th th1 \ Th th2" by simp - from unique_chain [OF _ th1_d th2_d this] and unique_RAG - have "(Th th1, Th th2) \ (RAG s)\<^sup>+ \ (Th th2, Th th1) \ (RAG s)\<^sup>+" by auto - hence "False" - proof - assume "(Th th1, Th th2) \ (RAG s)\<^sup>+" - from trancl_split [OF this] - obtain n where dd: "(Th th1, n) \ RAG s" by auto - then obtain cs where eq_n: "n = Cs cs" - by (auto simp:s_RAG_def s_holding_def cs_holding_def cs_waiting_def wq_def dest:hd_np_in) - from dd eq_n have "th1 \ readys s" - by (auto simp:readys_def s_RAG_def wq_def s_waiting_def cs_waiting_def) - with th1_r show ?thesis by auto - next - assume "(Th th2, Th th1) \ (RAG s)\<^sup>+" - from trancl_split [OF this] - obtain n where dd: "(Th th2, n) \ RAG s" by auto - then obtain cs where eq_n: "n = Cs cs" - by (auto simp:s_RAG_def s_holding_def cs_holding_def cs_waiting_def wq_def dest:hd_np_in) - from dd eq_n have "th2 \ readys s" - by (auto simp:readys_def wq_def s_RAG_def s_waiting_def cs_waiting_def) - with th2_r show ?thesis by auto - qed - } thus ?thesis by auto -qed - -end - - -lemma step_holdents_p_add: - assumes vt: "vt (P th cs#s)" - and "wq s cs = []" - shows "holdents (P th cs#s) th = holdents s th \ {cs}" -proof - - from assms show ?thesis - unfolding holdents_test step_RAG_p[OF vt] by (auto) -qed - -lemma step_holdents_p_eq: - assumes vt: "vt (P th cs#s)" - and "wq s cs \ []" - shows "holdents (P th cs#s) th = holdents s th" -proof - - from assms show ?thesis - unfolding holdents_test step_RAG_p[OF vt] by auto -qed - - -lemma (in valid_trace) finite_holding : - shows "finite (holdents s th)" -proof - - let ?F = "\ (x, y). the_cs x" - from finite_RAG - have "finite (RAG s)" . - hence "finite (?F `(RAG s))" by simp - moreover have "{cs . (Cs cs, Th th) \ RAG s} \ \" - proof - - { have h: "\ a A f. a \ A \ f a \ f ` A" by auto - fix x assume "(Cs x, Th th) \ RAG s" - hence "?F (Cs x, Th th) \ ?F `(RAG s)" by (rule h) - moreover have "?F (Cs x, Th th) = x" by simp - ultimately have "x \ (\(x, y). the_cs x) ` RAG s" by simp - } thus ?thesis by auto - qed - ultimately show ?thesis by (unfold holdents_test, auto intro:finite_subset) -qed - -lemma cntCS_v_dec: - assumes vtv: "vt (V thread cs#s)" - shows "(cntCS (V thread cs#s) thread + 1) = cntCS s thread" -proof - - from vtv interpret vt_s: valid_trace s - by (cases, unfold_locales, simp) - from vtv interpret vt_v: valid_trace "V thread cs#s" - by (unfold_locales, simp) - from step_back_step[OF vtv] - have cs_in: "cs \ holdents s thread" - apply (cases, unfold holdents_test s_RAG_def, simp) - by (unfold cs_holding_def s_holding_def wq_def, auto) - moreover have cs_not_in: - "(holdents (V thread cs#s) thread) = holdents s thread - {cs}" - apply (insert vt_s.wq_distinct[of cs]) - apply (unfold holdents_test, unfold step_RAG_v[OF vtv], - auto simp:next_th_def) - proof - - fix rest - assume dst: "distinct (rest::thread list)" - and ne: "rest \ []" - and hd_ni: "hd (SOME q. distinct q \ set q = set rest) \ set rest" - moreover have "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from dst show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" by auto - qed - ultimately have "hd (SOME q. distinct q \ set q = set rest) \ - set (SOME q. distinct q \ set q = set rest)" by simp - moreover have "(SOME q. distinct q \ set q = set rest) \ []" - proof(rule someI2) - from dst show "distinct rest \ set rest = set rest" by auto - next - fix x assume " distinct x \ set x = set rest" with ne - show "x \ []" by auto - qed - ultimately - show "(Cs cs, Th (hd (SOME q. distinct q \ set q = set rest))) \ RAG s" - by auto - next - fix rest - assume dst: "distinct (rest::thread list)" - and ne: "rest \ []" - and hd_ni: "hd (SOME q. distinct q \ set q = set rest) \ set rest" - moreover have "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from dst show "distinct rest \ set rest = set rest" by auto - next - show "\x. distinct x \ set x = set rest \ set x = set rest" by auto - qed - ultimately have "hd (SOME q. distinct q \ set q = set rest) \ - set (SOME q. distinct q \ set q = set rest)" by simp - moreover have "(SOME q. distinct q \ set q = set rest) \ []" - proof(rule someI2) - from dst show "distinct rest \ set rest = set rest" by auto - next - fix x assume " distinct x \ set x = set rest" with ne - show "x \ []" by auto - qed - ultimately show "False" by auto - qed - ultimately - have "holdents s thread = insert cs (holdents (V thread cs#s) thread)" - by auto - moreover have "card \ = - Suc (card ((holdents (V thread cs#s) thread) - {cs}))" - proof(rule card_insert) - from vt_v.finite_holding - show " finite (holdents (V thread cs # s) thread)" . - qed - moreover from cs_not_in - have "cs \ (holdents (V thread cs#s) thread)" by auto - ultimately show ?thesis by (simp add:cntCS_def) -qed - -lemma count_rec1 [simp]: - assumes "Q e" - shows "count Q (e#es) = Suc (count Q es)" - using assms - by (unfold count_def, auto) - -lemma count_rec2 [simp]: - assumes "\Q e" - shows "count Q (e#es) = (count Q es)" - using assms - by (unfold count_def, auto) - -lemma count_rec3 [simp]: - shows "count Q [] = 0" - by (unfold count_def, auto) - -lemma cntP_diff_inv: - assumes "cntP (e#s) th \ cntP s th" - shows "isP e \ actor e = th" -proof(cases e) - case (P th' pty) - show ?thesis - by (cases "(\e. \cs. e = P th cs) (P th' pty)", - insert assms P, auto simp:cntP_def) -qed (insert assms, auto simp:cntP_def) - -lemma cntV_diff_inv: - assumes "cntV (e#s) th \ cntV s th" - shows "isV e \ actor e = th" -proof(cases e) - case (V th' pty) - show ?thesis - by (cases "(\e. \cs. e = V th cs) (V th' pty)", - insert assms V, auto simp:cntV_def) -qed (insert assms, auto simp:cntV_def) - -context valid_trace -begin - -text {* (* ddd *) \noindent - The relationship between @{text "cntP"}, @{text "cntV"} and @{text "cntCS"} - of one particular thread. -*} - -lemma cnp_cnv_cncs: - shows "cntP s th = cntV s th + (if (th \ readys s \ th \ threads s) - then cntCS s th else cntCS s th + 1)" -proof - - from vt show ?thesis - proof(induct arbitrary:th) - case (vt_cons s e) - interpret vt_s: valid_trace s using vt_cons(1) by (unfold_locales, simp) - assume vt: "vt s" - and ih: "\th. cntP s th = cntV s th + - (if (th \ readys s \ th \ threads s) then cntCS s th else cntCS s th + 1)" - and stp: "step s e" - from stp show ?case - proof(cases) - case (thread_create thread prio) - assume eq_e: "e = Create thread prio" - and not_in: "thread \ threads s" - show ?thesis - proof - - { fix cs - assume "thread \ set (wq s cs)" - from vt_s.wq_threads [OF this] have "thread \ threads s" . - with not_in have "False" by simp - } with eq_e have eq_readys: "readys (e#s) = readys s \ {thread}" - by (auto simp:readys_def threads.simps s_waiting_def - wq_def cs_waiting_def Let_def) - from eq_e have eq_cnp: "cntP (e#s) th = cntP s th" by (simp add:cntP_def count_def) - from eq_e have eq_cnv: "cntV (e#s) th = cntV s th" by (simp add:cntV_def count_def) - have eq_cncs: "cntCS (e#s) th = cntCS s th" - unfolding cntCS_def holdents_test - by (simp add:RAG_create_unchanged eq_e) - { assume "th \ thread" - with eq_readys eq_e - have "(th \ readys (e # s) \ th \ threads (e # s)) = - (th \ readys (s) \ th \ threads (s))" - by (simp add:threads.simps) - with eq_cnp eq_cnv eq_cncs ih not_in - have ?thesis by simp - } moreover { - assume eq_th: "th = thread" - with not_in ih have " cntP s th = cntV s th + cntCS s th" by simp - moreover from eq_th and eq_readys have "th \ readys (e#s)" by simp - moreover note eq_cnp eq_cnv eq_cncs - ultimately have ?thesis by auto - } ultimately show ?thesis by blast - qed - next - case (thread_exit thread) - assume eq_e: "e = Exit thread" - and is_runing: "thread \ runing s" - and no_hold: "holdents s thread = {}" - from eq_e have eq_cnp: "cntP (e#s) th = cntP s th" by (simp add:cntP_def count_def) - from eq_e have eq_cnv: "cntV (e#s) th = cntV s th" by (simp add:cntV_def count_def) - have eq_cncs: "cntCS (e#s) th = cntCS s th" - unfolding cntCS_def holdents_test - by (simp add:RAG_exit_unchanged eq_e) - { assume "th \ thread" - with eq_e - have "(th \ readys (e # s) \ th \ threads (e # s)) = - (th \ readys (s) \ th \ threads (s))" - apply (simp add:threads.simps readys_def) - apply (subst s_waiting_def) - apply (simp add:Let_def) - apply (subst s_waiting_def, simp) - done - with eq_cnp eq_cnv eq_cncs ih - have ?thesis by simp - } moreover { - assume eq_th: "th = thread" - with ih is_runing have " cntP s th = cntV s th + cntCS s th" - by (simp add:runing_def) - moreover from eq_th eq_e have "th \ threads (e#s)" - by simp - moreover note eq_cnp eq_cnv eq_cncs - ultimately have ?thesis by auto - } ultimately show ?thesis by blast - next - case (thread_P thread cs) - assume eq_e: "e = P thread cs" - and is_runing: "thread \ runing s" - and no_dep: "(Cs cs, Th thread) \ (RAG s)\<^sup>+" - from thread_P vt stp ih have vtp: "vt (P thread cs#s)" by auto - then interpret vt_p: valid_trace "(P thread cs#s)" - by (unfold_locales, simp) - show ?thesis - proof - - { have hh: "\ A B C. (B = C) \ (A \ B) = (A \ C)" by blast - assume neq_th: "th \ thread" - with eq_e - have eq_readys: "(th \ readys (e#s)) = (th \ readys (s))" - apply (simp add:readys_def s_waiting_def wq_def Let_def) - apply (rule_tac hh) - apply (intro iffI allI, clarify) - apply (erule_tac x = csa in allE, auto) - apply (subgoal_tac "wq_fun (schs s) cs \ []", auto) - apply (erule_tac x = cs in allE, auto) - by (case_tac "(wq_fun (schs s) cs)", auto) - moreover from neq_th eq_e have "cntCS (e # s) th = cntCS s th" - apply (simp add:cntCS_def holdents_test) - by (unfold step_RAG_p [OF vtp], auto) - moreover from eq_e neq_th have "cntP (e # s) th = cntP s th" - by (simp add:cntP_def count_def) - moreover from eq_e neq_th have "cntV (e#s) th = cntV s th" - by (simp add:cntV_def count_def) - moreover from eq_e neq_th have "threads (e#s) = threads s" by simp - moreover note ih [of th] - ultimately have ?thesis by simp - } moreover { - assume eq_th: "th = thread" - have ?thesis - proof - - from eq_e eq_th have eq_cnp: "cntP (e # s) th = 1 + (cntP s th)" - by (simp add:cntP_def count_def) - from eq_e eq_th have eq_cnv: "cntV (e#s) th = cntV s th" - by (simp add:cntV_def count_def) - show ?thesis - proof (cases "wq s cs = []") - case True - with is_runing - have "th \ readys (e#s)" - apply (unfold eq_e wq_def, unfold readys_def s_RAG_def) - apply (simp add: wq_def[symmetric] runing_def eq_th s_waiting_def) - by (auto simp:readys_def wq_def Let_def s_waiting_def wq_def) - moreover have "cntCS (e # s) th = 1 + cntCS s th" - proof - - have "card {csa. csa = cs \ (Cs csa, Th thread) \ RAG s} = - Suc (card {cs. (Cs cs, Th thread) \ RAG s})" (is "card ?L = Suc (card ?R)") - proof - - have "?L = insert cs ?R" by auto - moreover have "card \ = Suc (card (?R - {cs}))" - proof(rule card_insert) - from vt_s.finite_holding [of thread] - show " finite {cs. (Cs cs, Th thread) \ RAG s}" - by (unfold holdents_test, simp) - qed - moreover have "?R - {cs} = ?R" - proof - - have "cs \ ?R" - proof - assume "cs \ {cs. (Cs cs, Th thread) \ RAG s}" - with no_dep show False by auto - qed - thus ?thesis by auto - qed - ultimately show ?thesis by auto - qed - thus ?thesis - apply (unfold eq_e eq_th cntCS_def) - apply (simp add: holdents_test) - by (unfold step_RAG_p [OF vtp], auto simp:True) - qed - moreover from is_runing have "th \ readys s" - by (simp add:runing_def eq_th) - moreover note eq_cnp eq_cnv ih [of th] - ultimately show ?thesis by auto - next - case False - have eq_wq: "wq (e#s) cs = wq s cs @ [th]" - by (unfold eq_th eq_e wq_def, auto simp:Let_def) - have "th \ readys (e#s)" - proof - assume "th \ readys (e#s)" - hence "\cs. \ waiting (e # s) th cs" by (simp add:readys_def) - from this[rule_format, of cs] have " \ waiting (e # s) th cs" . - hence "th \ set (wq (e#s) cs) \ th = hd (wq (e#s) cs)" - by (simp add:s_waiting_def wq_def) - moreover from eq_wq have "th \ set (wq (e#s) cs)" by auto - ultimately have "th = hd (wq (e#s) cs)" by blast - with eq_wq have "th = hd (wq s cs @ [th])" by simp - hence "th = hd (wq s cs)" using False by auto - with False eq_wq vt_p.wq_distinct [of cs] - show False by (fold eq_e, auto) - qed - moreover from is_runing have "th \ threads (e#s)" - by (unfold eq_e, auto simp:runing_def readys_def eq_th) - moreover have "cntCS (e # s) th = cntCS s th" - apply (unfold cntCS_def holdents_test eq_e step_RAG_p[OF vtp]) - by (auto simp:False) - moreover note eq_cnp eq_cnv ih[of th] - moreover from is_runing have "th \ readys s" - by (simp add:runing_def eq_th) - ultimately show ?thesis by auto - qed - qed - } ultimately show ?thesis by blast - qed - next - case (thread_V thread cs) - from assms vt stp ih thread_V have vtv: "vt (V thread cs # s)" by auto - then interpret vt_v: valid_trace "(V thread cs # s)" by (unfold_locales, simp) - assume eq_e: "e = V thread cs" - and is_runing: "thread \ runing s" - and hold: "holding s thread cs" - from hold obtain rest - where eq_wq: "wq s cs = thread # rest" - by (case_tac "wq s cs", auto simp: wq_def s_holding_def) - have eq_threads: "threads (e#s) = threads s" by (simp add: eq_e) - have eq_set: "set (SOME q. distinct q \ set q = set rest) = set rest" - proof(rule someI2) - from vt_v.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" - by (metis distinct.simps(2) vt_s.wq_distinct) - next - show "\x. distinct x \ set x = set rest \ set x = set rest" - by auto - qed - show ?thesis - proof - - { assume eq_th: "th = thread" - from eq_th have eq_cnp: "cntP (e # s) th = cntP s th" - by (unfold eq_e, simp add:cntP_def count_def) - moreover from eq_th have eq_cnv: "cntV (e#s) th = 1 + cntV s th" - by (unfold eq_e, simp add:cntV_def count_def) - moreover from cntCS_v_dec [OF vtv] - have "cntCS (e # s) thread + 1 = cntCS s thread" - by (simp add:eq_e) - moreover from is_runing have rd_before: "thread \ readys s" - by (unfold runing_def, simp) - moreover have "thread \ readys (e # s)" - proof - - from is_runing - have "thread \ threads (e#s)" - by (unfold eq_e, auto simp:runing_def readys_def) - moreover have "\ cs1. \ waiting (e#s) thread cs1" - proof - fix cs1 - { assume eq_cs: "cs1 = cs" - have "\ waiting (e # s) thread cs1" - proof - - from eq_wq - have "thread \ set (wq (e#s) cs1)" - apply(unfold eq_e wq_def eq_cs s_holding_def) - apply (auto simp:Let_def) - proof - - assume "thread \ set (SOME q. distinct q \ set q = set rest)" - with eq_set have "thread \ set rest" by simp - with vt_v.wq_distinct[of cs] - and eq_wq show False - by (metis distinct.simps(2) vt_s.wq_distinct) - qed - thus ?thesis by (simp add:wq_def s_waiting_def) - qed - } moreover { - assume neq_cs: "cs1 \ cs" - have "\ waiting (e # s) thread cs1" - proof - - from wq_v_neq [OF neq_cs[symmetric]] - have "wq (V thread cs # s) cs1 = wq s cs1" . - moreover have "\ waiting s thread cs1" - proof - - from runing_ready and is_runing - have "thread \ readys s" by auto - thus ?thesis by (simp add:readys_def) - qed - ultimately show ?thesis - by (auto simp:wq_def s_waiting_def eq_e) - qed - } ultimately show "\ waiting (e # s) thread cs1" by blast - qed - ultimately show ?thesis by (simp add:readys_def) - qed - moreover note eq_th ih - ultimately have ?thesis by auto - } moreover { - assume neq_th: "th \ thread" - from neq_th eq_e have eq_cnp: "cntP (e # s) th = cntP s th" - by (simp add:cntP_def count_def) - from neq_th eq_e have eq_cnv: "cntV (e # s) th = cntV s th" - by (simp add:cntV_def count_def) - have ?thesis - proof(cases "th \ set rest") - case False - have "(th \ readys (e # s)) = (th \ readys s)" - apply (insert step_back_vt[OF vtv]) - by (simp add: False eq_e eq_wq neq_th vt_s.readys_v_eq) - moreover have "cntCS (e#s) th = cntCS s th" - apply (insert neq_th, unfold eq_e cntCS_def holdents_test step_RAG_v[OF vtv], auto) - proof - - have "{csa. (Cs csa, Th th) \ RAG s \ csa = cs \ next_th s thread cs th} = - {cs. (Cs cs, Th th) \ RAG s}" - proof - - from False eq_wq - have " next_th s thread cs th \ (Cs cs, Th th) \ RAG s" - apply (unfold next_th_def, auto) - proof - - assume ne: "rest \ []" - and ni: "hd (SOME q. distinct q \ set q = set rest) \ set rest" - and eq_wq: "wq s cs = thread # rest" - from eq_set ni have "hd (SOME q. distinct q \ set q = set rest) \ - set (SOME q. distinct q \ set q = set rest) - " by simp - moreover have "(SOME q. distinct q \ set q = set rest) \ []" - proof(rule someI2) - from vt_s.wq_distinct[ of cs] and eq_wq - show "distinct rest \ set rest = set rest" by auto - next - fix x assume "distinct x \ set x = set rest" - with ne show "x \ []" by auto - qed - ultimately show - "(Cs cs, Th (hd (SOME q. distinct q \ set q = set rest))) \ RAG s" - by auto - qed - thus ?thesis by auto - qed - thus "card {csa. (Cs csa, Th th) \ RAG s \ csa = cs \ next_th s thread cs th} = - card {cs. (Cs cs, Th th) \ RAG s}" by simp - qed - moreover note ih eq_cnp eq_cnv eq_threads - ultimately show ?thesis by auto - next - case True - assume th_in: "th \ set rest" - show ?thesis - proof(cases "next_th s thread cs th") - case False - with eq_wq and th_in have - neq_hd: "th \ hd (SOME q. distinct q \ set q = set rest)" (is "th \ hd ?rest") - by (auto simp:next_th_def) - have "(th \ readys (e # s)) = (th \ readys s)" - proof - - from eq_wq and th_in - have "\ th \ readys s" - apply (auto simp:readys_def s_waiting_def) - apply (rule_tac x = cs in exI, auto) - by (insert vt_s.wq_distinct[of cs], auto simp add: wq_def) - moreover - from eq_wq and th_in and neq_hd - have "\ (th \ readys (e # s))" - apply (auto simp:readys_def s_waiting_def eq_e wq_def Let_def split:list.splits) - by (rule_tac x = cs in exI, auto simp:eq_set) - ultimately show ?thesis by auto - qed - moreover have "cntCS (e#s) th = cntCS s th" - proof - - from eq_wq and th_in and neq_hd - have "(holdents (e # s) th) = (holdents s th)" - apply (unfold eq_e step_RAG_v[OF vtv], - auto simp:next_th_def eq_set s_RAG_def holdents_test wq_def - Let_def cs_holding_def) - by (insert vt_s.wq_distinct[of cs], auto simp:wq_def) - thus ?thesis by (simp add:cntCS_def) - qed - moreover note ih eq_cnp eq_cnv eq_threads - ultimately show ?thesis by auto - next - case True - let ?rest = " (SOME q. distinct q \ set q = set rest)" - let ?t = "hd ?rest" - from True eq_wq th_in neq_th - have "th \ readys (e # s)" - apply (auto simp:eq_e readys_def s_waiting_def wq_def - Let_def next_th_def) - proof - - assume eq_wq: "wq_fun (schs s) cs = thread # rest" - and t_in: "?t \ set rest" - show "?t \ threads s" - proof(rule vt_s.wq_threads) - from eq_wq and t_in - show "?t \ set (wq s cs)" by (auto simp:wq_def) - qed - next - fix csa - assume eq_wq: "wq_fun (schs s) cs = thread # rest" - and t_in: "?t \ set rest" - and neq_cs: "csa \ cs" - and t_in': "?t \ set (wq_fun (schs s) csa)" - show "?t = hd (wq_fun (schs s) csa)" - proof - - { assume neq_hd': "?t \ hd (wq_fun (schs s) csa)" - from vt_s.wq_distinct[of cs] and - eq_wq[folded wq_def] and t_in eq_wq - have "?t \ thread" by auto - with eq_wq and t_in - have w1: "waiting s ?t cs" - by (auto simp:s_waiting_def wq_def) - from t_in' neq_hd' - have w2: "waiting s ?t csa" - by (auto simp:s_waiting_def wq_def) - from vt_s.waiting_unique[OF w1 w2] - and neq_cs have "False" by auto - } thus ?thesis by auto - qed - qed - moreover have "cntP s th = cntV s th + cntCS s th + 1" - proof - - have "th \ readys s" - proof - - from True eq_wq neq_th th_in - show ?thesis - apply (unfold readys_def s_waiting_def, auto) - by (rule_tac x = cs in exI, auto simp add: wq_def) - qed - moreover have "th \ threads s" - proof - - from th_in eq_wq - have "th \ set (wq s cs)" by simp - from vt_s.wq_threads [OF this] - show ?thesis . - qed - ultimately show ?thesis using ih by auto - qed - moreover from True neq_th have "cntCS (e # s) th = 1 + cntCS s th" - apply (unfold cntCS_def holdents_test eq_e step_RAG_v[OF vtv], auto) - proof - - show "card {csa. (Cs csa, Th th) \ RAG s \ csa = cs} = - Suc (card {cs. (Cs cs, Th th) \ RAG s})" - (is "card ?A = Suc (card ?B)") - proof - - have "?A = insert cs ?B" by auto - hence "card ?A = card (insert cs ?B)" by simp - also have "\ = Suc (card ?B)" - proof(rule card_insert_disjoint) - have "?B \ ((\ (x, y). the_cs x) ` RAG s)" - apply (auto simp:image_def) - by (rule_tac x = "(Cs x, Th th)" in bexI, auto) - with vt_s.finite_RAG - show "finite {cs. (Cs cs, Th th) \ RAG s}" by (auto intro:finite_subset) - next - show "cs \ {cs. (Cs cs, Th th) \ RAG s}" - proof - assume "cs \ {cs. (Cs cs, Th th) \ RAG s}" - hence "(Cs cs, Th th) \ RAG s" by simp - with True neq_th eq_wq show False - by (auto simp:next_th_def s_RAG_def cs_holding_def) - qed - qed - finally show ?thesis . - qed - qed - moreover note eq_cnp eq_cnv - ultimately show ?thesis by simp - qed - qed - } ultimately show ?thesis by blast - qed - next - case (thread_set thread prio) - assume eq_e: "e = Set thread prio" - and is_runing: "thread \ runing s" - show ?thesis - proof - - from eq_e have eq_cnp: "cntP (e#s) th = cntP s th" by (simp add:cntP_def count_def) - from eq_e have eq_cnv: "cntV (e#s) th = cntV s th" by (simp add:cntV_def count_def) - have eq_cncs: "cntCS (e#s) th = cntCS s th" - unfolding cntCS_def holdents_test - by (simp add:RAG_set_unchanged eq_e) - from eq_e have eq_readys: "readys (e#s) = readys s" - by (simp add:readys_def cs_waiting_def s_waiting_def wq_def, - auto simp:Let_def) - { assume "th \ thread" - with eq_readys eq_e - have "(th \ readys (e # s) \ th \ threads (e # s)) = - (th \ readys (s) \ th \ threads (s))" - by (simp add:threads.simps) - with eq_cnp eq_cnv eq_cncs ih is_runing - have ?thesis by simp - } moreover { - assume eq_th: "th = thread" - with is_runing ih have " cntP s th = cntV s th + cntCS s th" - by (unfold runing_def, auto) - moreover from eq_th and eq_readys is_runing have "th \ readys (e#s)" - by (simp add:runing_def) - moreover note eq_cnp eq_cnv eq_cncs - ultimately have ?thesis by auto - } ultimately show ?thesis by blast - qed - qed - next - case vt_nil - show ?case - by (unfold cntP_def cntV_def cntCS_def, - auto simp:count_def holdents_test s_RAG_def wq_def cs_holding_def) - qed -qed - -lemma not_thread_cncs: - assumes not_in: "th \ threads s" - shows "cntCS s th = 0" -proof - - from vt not_in show ?thesis - proof(induct arbitrary:th) - case (vt_cons s e th) - interpret vt_s: valid_trace s using vt_cons(1) - by (unfold_locales, simp) - assume vt: "vt s" - and ih: "\th. th \ threads s \ cntCS s th = 0" - and stp: "step s e" - and not_in: "th \ threads (e # s)" - from stp show ?case - proof(cases) - case (thread_create thread prio) - assume eq_e: "e = Create thread prio" - and not_in': "thread \ threads s" - have "cntCS (e # s) th = cntCS s th" - apply (unfold eq_e cntCS_def holdents_test) - by (simp add:RAG_create_unchanged) - moreover have "th \ threads s" - proof - - from not_in eq_e show ?thesis by simp - qed - moreover note ih ultimately show ?thesis by auto - next - case (thread_exit thread) - assume eq_e: "e = Exit thread" - and nh: "holdents s thread = {}" - have eq_cns: "cntCS (e # s) th = cntCS s th" - apply (unfold eq_e cntCS_def holdents_test) - by (simp add:RAG_exit_unchanged) - show ?thesis - proof(cases "th = thread") - case True - have "cntCS s th = 0" by (unfold cntCS_def, auto simp:nh True) - with eq_cns show ?thesis by simp - next - case False - with not_in and eq_e - have "th \ threads s" by simp - from ih[OF this] and eq_cns show ?thesis by simp - qed - next - case (thread_P thread cs) - assume eq_e: "e = P thread cs" - and is_runing: "thread \ runing s" - from assms thread_P ih vt stp thread_P have vtp: "vt (P thread cs#s)" by auto - have neq_th: "th \ thread" - proof - - from not_in eq_e have "th \ threads s" by simp - moreover from is_runing have "thread \ threads s" - by (simp add:runing_def readys_def) - ultimately show ?thesis by auto - qed - hence "cntCS (e # s) th = cntCS s th " - apply (unfold cntCS_def holdents_test eq_e) - by (unfold step_RAG_p[OF vtp], auto) - moreover have "cntCS s th = 0" - proof(rule ih) - from not_in eq_e show "th \ threads s" by simp - qed - ultimately show ?thesis by simp - next - case (thread_V thread cs) - assume eq_e: "e = V thread cs" - and is_runing: "thread \ runing s" - and hold: "holding s thread cs" - have neq_th: "th \ thread" - proof - - from not_in eq_e have "th \ threads s" by simp - moreover from is_runing have "thread \ threads s" - by (simp add:runing_def readys_def) - ultimately show ?thesis by auto - qed - from assms thread_V vt stp ih - have vtv: "vt (V thread cs#s)" by auto - then interpret vt_v: valid_trace "(V thread cs#s)" - by (unfold_locales, simp) - from hold obtain rest - where eq_wq: "wq s cs = thread # rest" - by (case_tac "wq s cs", auto simp: wq_def s_holding_def) - from not_in eq_e eq_wq - have "\ next_th s thread cs th" - apply (auto simp:next_th_def) - proof - - assume ne: "rest \ []" - and ni: "hd (SOME q. distinct q \ set q = set rest) \ threads s" (is "?t \ threads s") - have "?t \ set rest" - proof(rule someI2) - from vt_v.wq_distinct[of cs] and eq_wq - show "distinct rest \ set rest = set rest" - by (metis distinct.simps(2) vt_s.wq_distinct) - next - fix x assume "distinct x \ set x = set rest" with ne - show "hd x \ set rest" by (cases x, auto) - qed - with eq_wq have "?t \ set (wq s cs)" by simp - from vt_s.wq_threads[OF this] and ni - show False - using `hd (SOME q. distinct q \ set q = set rest) \ set (wq s cs)` - ni vt_s.wq_threads by blast - qed - moreover note neq_th eq_wq - ultimately have "cntCS (e # s) th = cntCS s th" - by (unfold eq_e cntCS_def holdents_test step_RAG_v[OF vtv], auto) - moreover have "cntCS s th = 0" - proof(rule ih) - from not_in eq_e show "th \ threads s" by simp - qed - ultimately show ?thesis by simp - next - case (thread_set thread prio) - print_facts - assume eq_e: "e = Set thread prio" - and is_runing: "thread \ runing s" - from not_in and eq_e have "th \ threads s" by auto - from ih [OF this] and eq_e - show ?thesis - apply (unfold eq_e cntCS_def holdents_test) - by (simp add:RAG_set_unchanged) - qed - next - case vt_nil - show ?case - by (unfold cntCS_def, - auto simp:count_def holdents_test s_RAG_def wq_def cs_holding_def) - qed -qed - -end - - -context valid_trace -begin - -lemma dm_RAG_threads: +lemma dm_RAG_threads: assumes in_dom: "(Th th) \ Domain (RAG s)" shows "th \ threads s" proof - @@ -2763,360 +1380,7 @@ from wq_threads [OF this] show ?thesis . qed -end - -lemma cp_eq_cpreced: "cp s th = cpreced (wq s) s th" -unfolding cp_def wq_def -apply(induct s rule: schs.induct) -thm cpreced_initial -apply(simp add: Let_def cpreced_initial) -apply(simp add: Let_def) -apply(simp add: Let_def) -apply(simp add: Let_def) -apply(subst (2) schs.simps) -apply(simp add: Let_def) -apply(subst (2) schs.simps) -apply(simp add: Let_def) -done - -context valid_trace -begin - -lemma runing_unique: - assumes runing_1: "th1 \ runing s" - and runing_2: "th2 \ runing s" - shows "th1 = th2" -proof - - from runing_1 and runing_2 have "cp s th1 = cp s th2" - unfolding runing_def - apply(simp) - done - hence eq_max: "Max ((\th. preced th s) ` ({th1} \ dependants (wq s) th1)) = - Max ((\th. preced th s) ` ({th2} \ dependants (wq s) th2))" - (is "Max (?f ` ?A) = Max (?f ` ?B)") - unfolding cp_eq_cpreced - unfolding cpreced_def . - obtain th1' where th1_in: "th1' \ ?A" and eq_f_th1: "?f th1' = Max (?f ` ?A)" - proof - - have h1: "finite (?f ` ?A)" - proof - - have "finite ?A" - proof - - have "finite (dependants (wq s) th1)" - proof- - have "finite {th'. (Th th', Th th1) \ (RAG (wq s))\<^sup>+}" - proof - - let ?F = "\ (x, y). the_th x" - have "{th'. (Th th', Th th1) \ (RAG (wq s))\<^sup>+} \ ?F ` ((RAG (wq s))\<^sup>+)" - apply (auto simp:image_def) - by (rule_tac x = "(Th x, Th th1)" in bexI, auto) - moreover have "finite \" - proof - - from finite_RAG have "finite (RAG s)" . - hence "finite ((RAG (wq s))\<^sup>+)" - apply (unfold finite_trancl) - by (auto simp: s_RAG_def cs_RAG_def wq_def) - thus ?thesis by auto - qed - ultimately show ?thesis by (auto intro:finite_subset) - qed - thus ?thesis by (simp add:cs_dependants_def) - qed - thus ?thesis by simp - qed - thus ?thesis by auto - qed - moreover have h2: "(?f ` ?A) \ {}" - proof - - have "?A \ {}" by simp - thus ?thesis by simp - qed - from Max_in [OF h1 h2] - have "Max (?f ` ?A) \ (?f ` ?A)" . - thus ?thesis - thm cpreced_def - unfolding cpreced_def[symmetric] - unfolding cp_eq_cpreced[symmetric] - unfolding cpreced_def - using that[intro] by (auto) - qed - obtain th2' where th2_in: "th2' \ ?B" and eq_f_th2: "?f th2' = Max (?f ` ?B)" - proof - - have h1: "finite (?f ` ?B)" - proof - - have "finite ?B" - proof - - have "finite (dependants (wq s) th2)" - proof- - have "finite {th'. (Th th', Th th2) \ (RAG (wq s))\<^sup>+}" - proof - - let ?F = "\ (x, y). the_th x" - have "{th'. (Th th', Th th2) \ (RAG (wq s))\<^sup>+} \ ?F ` ((RAG (wq s))\<^sup>+)" - apply (auto simp:image_def) - by (rule_tac x = "(Th x, Th th2)" in bexI, auto) - moreover have "finite \" - proof - - from finite_RAG have "finite (RAG s)" . - hence "finite ((RAG (wq s))\<^sup>+)" - apply (unfold finite_trancl) - by (auto simp: s_RAG_def cs_RAG_def wq_def) - thus ?thesis by auto - qed - ultimately show ?thesis by (auto intro:finite_subset) - qed - thus ?thesis by (simp add:cs_dependants_def) - qed - thus ?thesis by simp - qed - thus ?thesis by auto - qed - moreover have h2: "(?f ` ?B) \ {}" - proof - - have "?B \ {}" by simp - thus ?thesis by simp - qed - from Max_in [OF h1 h2] - have "Max (?f ` ?B) \ (?f ` ?B)" . - thus ?thesis by (auto intro:that) - qed - from eq_f_th1 eq_f_th2 eq_max - have eq_preced: "preced th1' s = preced th2' s" by auto - hence eq_th12: "th1' = th2'" - proof (rule preced_unique) - from th1_in have "th1' = th1 \ (th1' \ dependants (wq s) th1)" by simp - thus "th1' \ threads s" - proof - assume "th1' \ dependants (wq s) th1" - hence "(Th th1') \ Domain ((RAG s)^+)" - apply (unfold cs_dependants_def cs_RAG_def s_RAG_def) - by (auto simp:Domain_def) - hence "(Th th1') \ Domain (RAG s)" by (simp add:trancl_domain) - from dm_RAG_threads[OF this] show ?thesis . - next - assume "th1' = th1" - with runing_1 show ?thesis - by (unfold runing_def readys_def, auto) - qed - next - from th2_in have "th2' = th2 \ (th2' \ dependants (wq s) th2)" by simp - thus "th2' \ threads s" - proof - assume "th2' \ dependants (wq s) th2" - hence "(Th th2') \ Domain ((RAG s)^+)" - apply (unfold cs_dependants_def cs_RAG_def s_RAG_def) - by (auto simp:Domain_def) - hence "(Th th2') \ Domain (RAG s)" by (simp add:trancl_domain) - from dm_RAG_threads[OF this] show ?thesis . - next - assume "th2' = th2" - with runing_2 show ?thesis - by (unfold runing_def readys_def, auto) - qed - qed - from th1_in have "th1' = th1 \ th1' \ dependants (wq s) th1" by simp - thus ?thesis - proof - assume eq_th': "th1' = th1" - from th2_in have "th2' = th2 \ th2' \ dependants (wq s) th2" by simp - thus ?thesis - proof - assume "th2' = th2" thus ?thesis using eq_th' eq_th12 by simp - next - assume "th2' \ dependants (wq s) th2" - with eq_th12 eq_th' have "th1 \ dependants (wq s) th2" by simp - hence "(Th th1, Th th2) \ (RAG s)^+" - by (unfold cs_dependants_def s_RAG_def cs_RAG_def, simp) - hence "Th th1 \ Domain ((RAG s)^+)" - apply (unfold cs_dependants_def cs_RAG_def s_RAG_def) - by (auto simp:Domain_def) - hence "Th th1 \ Domain (RAG s)" by (simp add:trancl_domain) - then obtain n where d: "(Th th1, n) \ RAG s" by (auto simp:Domain_def) - from RAG_target_th [OF this] - obtain cs' where "n = Cs cs'" by auto - with d have "(Th th1, Cs cs') \ RAG s" by simp - with runing_1 have "False" - apply (unfold runing_def readys_def s_RAG_def) - by (auto simp:waiting_eq) - thus ?thesis by simp - qed - next - assume th1'_in: "th1' \ dependants (wq s) th1" - from th2_in have "th2' = th2 \ th2' \ dependants (wq s) th2" by simp - thus ?thesis - proof - assume "th2' = th2" - with th1'_in eq_th12 have "th2 \ dependants (wq s) th1" by simp - hence "(Th th2, Th th1) \ (RAG s)^+" - by (unfold cs_dependants_def s_RAG_def cs_RAG_def, simp) - hence "Th th2 \ Domain ((RAG s)^+)" - apply (unfold cs_dependants_def cs_RAG_def s_RAG_def) - by (auto simp:Domain_def) - hence "Th th2 \ Domain (RAG s)" by (simp add:trancl_domain) - then obtain n where d: "(Th th2, n) \ RAG s" by (auto simp:Domain_def) - from RAG_target_th [OF this] - obtain cs' where "n = Cs cs'" by auto - with d have "(Th th2, Cs cs') \ RAG s" by simp - with runing_2 have "False" - apply (unfold runing_def readys_def s_RAG_def) - by (auto simp:waiting_eq) - thus ?thesis by simp - next - assume "th2' \ dependants (wq s) th2" - with eq_th12 have "th1' \ dependants (wq s) th2" by simp - hence h1: "(Th th1', Th th2) \ (RAG s)^+" - by (unfold cs_dependants_def s_RAG_def cs_RAG_def, simp) - from th1'_in have h2: "(Th th1', Th th1) \ (RAG s)^+" - by (unfold cs_dependants_def s_RAG_def cs_RAG_def, simp) - show ?thesis - proof(rule dchain_unique[OF h1 _ h2, symmetric]) - from runing_1 show "th1 \ readys s" by (simp add:runing_def) - from runing_2 show "th2 \ readys s" by (simp add:runing_def) - qed - qed - qed -qed - - -lemma "card (runing s) \ 1" -apply(subgoal_tac "finite (runing s)") -prefer 2 -apply (metis finite_nat_set_iff_bounded lessI runing_unique) -apply(rule ccontr) -apply(simp) -apply(case_tac "Suc (Suc 0) \ card (runing s)") -apply(subst (asm) card_le_Suc_iff) -apply(simp) -apply(auto)[1] -apply (metis insertCI runing_unique) -apply(auto) -done - -end - - -lemma create_pre: - assumes stp: "step s e" - and not_in: "th \ threads s" - and is_in: "th \ threads (e#s)" - obtains prio where "e = Create th prio" -proof - - from assms - show ?thesis - proof(cases) - case (thread_create thread prio) - with is_in not_in have "e = Create th prio" by simp - from that[OF this] show ?thesis . - next - case (thread_exit thread) - with assms show ?thesis by (auto intro!:that) - next - case (thread_P thread) - with assms show ?thesis by (auto intro!:that) - next - case (thread_V thread) - with assms show ?thesis by (auto intro!:that) - next - case (thread_set thread) - with assms show ?thesis by (auto intro!:that) - qed -qed - -context valid_trace -begin - -lemma cnp_cnv_eq: - assumes "th \ threads s" - shows "cntP s th = cntV s th" - using assms - using cnp_cnv_cncs not_thread_cncs by auto - -end - - -lemma eq_RAG: - "RAG (wq s) = RAG s" -by (unfold cs_RAG_def s_RAG_def, auto) - -context valid_trace -begin - -lemma count_eq_dependants: - assumes eq_pv: "cntP s th = cntV s th" - shows "dependants (wq s) th = {}" -proof - - from cnp_cnv_cncs and eq_pv - have "cntCS s th = 0" - by (auto split:if_splits) - moreover have "finite {cs. (Cs cs, Th th) \ RAG s}" - proof - - from finite_holding[of th] show ?thesis - by (simp add:holdents_test) - qed - ultimately have h: "{cs. (Cs cs, Th th) \ RAG s} = {}" - by (unfold cntCS_def holdents_test cs_dependants_def, auto) - show ?thesis - proof(unfold cs_dependants_def) - { assume "{th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} \ {}" - then obtain th' where "(Th th', Th th) \ (RAG (wq s))\<^sup>+" by auto - hence "False" - proof(cases) - assume "(Th th', Th th) \ RAG (wq s)" - thus "False" by (auto simp:cs_RAG_def) - next - fix c - assume "(c, Th th) \ RAG (wq s)" - with h and eq_RAG show "False" - by (cases c, auto simp:cs_RAG_def) - qed - } thus "{th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} = {}" by auto - qed -qed - -lemma dependants_threads: - shows "dependants (wq s) th \ threads s" -proof - { fix th th' - assume h: "th \ {th'a. (Th th'a, Th th') \ (RAG (wq s))\<^sup>+}" - have "Th th \ Domain (RAG s)" - proof - - from h obtain th' where "(Th th, Th th') \ (RAG (wq s))\<^sup>+" by auto - hence "(Th th) \ Domain ( (RAG (wq s))\<^sup>+)" by (auto simp:Domain_def) - with trancl_domain have "(Th th) \ Domain (RAG (wq s))" by simp - thus ?thesis using eq_RAG by simp - qed - from dm_RAG_threads[OF this] - have "th \ threads s" . - } note hh = this - fix th1 - assume "th1 \ dependants (wq s) th" - hence "th1 \ {th'a. (Th th'a, Th th) \ (RAG (wq s))\<^sup>+}" - by (unfold cs_dependants_def, simp) - from hh [OF this] show "th1 \ threads s" . -qed - -lemma finite_threads: - shows "finite (threads s)" -using vt by (induct) (auto elim: step.cases) - -end - -lemma Max_f_mono: - assumes seq: "A \ B" - and np: "A \ {}" - and fnt: "finite B" - shows "Max (f ` A) \ Max (f ` B)" -proof(rule Max_mono) - from seq show "f ` A \ f ` B" by auto -next - from np show "f ` A \ {}" by auto -next - from fnt and seq show "finite (f ` B)" by auto -qed - -context valid_trace -begin - -lemma cp_le: +lemma cp_le: assumes th_in: "th \ threads s" shows "cp s th \ Max ((\ th. (preced th s)) ` threads s)" proof(unfold cp_eq_cpreced cpreced_def cs_dependants_def) @@ -3138,46 +1402,6 @@ qed qed -lemma le_cp: - shows "preced th s \ cp s th" -proof(unfold cp_eq_cpreced preced_def cpreced_def, simp) - show "Prc (priority th s) (last_set th s) - \ Max (insert (Prc (priority th s) (last_set th s)) - ((\th. Prc (priority th s) (last_set th s)) ` dependants (wq s) th))" - (is "?l \ Max (insert ?l ?A)") - proof(cases "?A = {}") - case False - have "finite ?A" (is "finite (?f ` ?B)") - proof - - have "finite ?B" - proof- - have "finite {th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+}" - proof - - let ?F = "\ (x, y). the_th x" - have "{th'. (Th th', Th th) \ (RAG (wq s))\<^sup>+} \ ?F ` ((RAG (wq s))\<^sup>+)" - apply (auto simp:image_def) - by (rule_tac x = "(Th x, Th th)" in bexI, auto) - moreover have "finite \" - proof - - from finite_RAG have "finite (RAG s)" . - hence "finite ((RAG (wq s))\<^sup>+)" - apply (unfold finite_trancl) - by (auto simp: s_RAG_def cs_RAG_def wq_def) - thus ?thesis by auto - qed - ultimately show ?thesis by (auto intro:finite_subset) - qed - thus ?thesis by (simp add:cs_dependants_def) - qed - thus ?thesis by simp - qed - from Max_insert [OF this False, of ?l] show ?thesis by auto - next - case True - thus ?thesis by auto - qed -qed - lemma max_cp_eq: shows "Max ((cp s) ` threads s) = Max ((\ th. (preced th s)) ` threads s)" (is "?l = ?r") @@ -3225,998 +1449,198 @@ ultimately show ?thesis using eq_l by auto qed -lemma max_cp_readys_threads_pre: - assumes np: "threads s \ {}" - shows "Max (cp s ` readys s) = Max (cp s ` threads s)" -proof(unfold max_cp_eq) - show "Max (cp s ` readys s) = Max ((\th. preced th s) ` threads s)" - proof - - let ?p = "Max ((\th. preced th s) ` threads s)" - let ?f = "(\th. preced th s)" - have "?p \ ((\th. preced th s) ` threads s)" - proof(rule Max_in) - from finite_threads show "finite (?f ` threads s)" by simp - next - from np show "?f ` threads s \ {}" by simp - qed - then obtain tm where tm_max: "?f tm = ?p" and tm_in: "tm \ threads s" - by (auto simp:Image_def) - from th_chain_to_ready [OF tm_in] - have "tm \ readys s \ (\th'. th' \ readys s \ (Th tm, Th th') \ (RAG s)\<^sup>+)" . - thus ?thesis - proof - assume "\th'. th' \ readys s \ (Th tm, Th th') \ (RAG s)\<^sup>+ " - then obtain th' where th'_in: "th' \ readys s" - and tm_chain:"(Th tm, Th th') \ (RAG s)\<^sup>+" by auto - have "cp s th' = ?f tm" - proof(subst cp_eq_cpreced, subst cpreced_def, rule Max_eqI) - from dependants_threads finite_threads - show "finite ((\th. preced th s) ` ({th'} \ dependants (wq s) th'))" - by (auto intro:finite_subset) - next - fix p assume p_in: "p \ (\th. preced th s) ` ({th'} \ dependants (wq s) th')" - from tm_max have " preced tm s = Max ((\th. preced th s) ` threads s)" . - moreover have "p \ \" - proof(rule Max_ge) - from finite_threads - show "finite ((\th. preced th s) ` threads s)" by simp - next - from p_in and th'_in and dependants_threads[of th'] - show "p \ (\th. preced th s) ` threads s" - by (auto simp:readys_def) - qed - ultimately show "p \ preced tm s" by auto - next - show "preced tm s \ (\th. preced th s) ` ({th'} \ dependants (wq s) th')" - proof - - from tm_chain - have "tm \ dependants (wq s) th'" - by (unfold cs_dependants_def s_RAG_def cs_RAG_def, auto) - thus ?thesis by auto - qed - qed - with tm_max - have h: "cp s th' = Max ((\th. preced th s) ` threads s)" by simp - show ?thesis - proof (fold h, rule Max_eqI) - fix q - assume "q \ cp s ` readys s" - then obtain th1 where th1_in: "th1 \ readys s" - and eq_q: "q = cp s th1" by auto - show "q \ cp s th'" - apply (unfold h eq_q) - apply (unfold cp_eq_cpreced cpreced_def) - apply (rule Max_mono) - proof - - from dependants_threads [of th1] th1_in - show "(\th. preced th s) ` ({th1} \ dependants (wq s) th1) \ - (\th. preced th s) ` threads s" - by (auto simp:readys_def) - next - show "(\th. preced th s) ` ({th1} \ dependants (wq s) th1) \ {}" by simp - next - from finite_threads - show " finite ((\th. preced th s) ` threads s)" by simp - qed - next - from finite_threads - show "finite (cp s ` readys s)" by (auto simp:readys_def) - next - from th'_in - show "cp s th' \ cp s ` readys s" by simp - qed - next - assume tm_ready: "tm \ readys s" - show ?thesis - proof(fold tm_max) - have cp_eq_p: "cp s tm = preced tm s" - proof(unfold cp_eq_cpreced cpreced_def, rule Max_eqI) - fix y - assume hy: "y \ (\th. preced th s) ` ({tm} \ dependants (wq s) tm)" - show "y \ preced tm s" - proof - - { fix y' - assume hy' : "y' \ ((\th. preced th s) ` dependants (wq s) tm)" - have "y' \ preced tm s" - proof(unfold tm_max, rule Max_ge) - from hy' dependants_threads[of tm] - show "y' \ (\th. preced th s) ` threads s" by auto - next - from finite_threads - show "finite ((\th. preced th s) ` threads s)" by simp - qed - } with hy show ?thesis by auto - qed - next - from dependants_threads[of tm] finite_threads - show "finite ((\th. preced th s) ` ({tm} \ dependants (wq s) tm))" - by (auto intro:finite_subset) - next - show "preced tm s \ (\th. preced th s) ` ({tm} \ dependants (wq s) tm)" - by simp - qed - moreover have "Max (cp s ` readys s) = cp s tm" - proof(rule Max_eqI) - from tm_ready show "cp s tm \ cp s ` readys s" by simp - next - from finite_threads - show "finite (cp s ` readys s)" by (auto simp:readys_def) - next - fix y assume "y \ cp s ` readys s" - then obtain th1 where th1_readys: "th1 \ readys s" - and h: "y = cp s th1" by auto - show "y \ cp s tm" - apply(unfold cp_eq_p h) - apply(unfold cp_eq_cpreced cpreced_def tm_max, rule Max_mono) - proof - - from finite_threads - show "finite ((\th. preced th s) ` threads s)" by simp - next - show "(\th. preced th s) ` ({th1} \ dependants (wq s) th1) \ {}" - by simp - next - from dependants_threads[of th1] th1_readys - show "(\th. preced th s) ` ({th1} \ dependants (wq s) th1) - \ (\th. preced th s) ` threads s" - by (auto simp:readys_def) - qed - qed - ultimately show " Max (cp s ` readys s) = preced tm s" by simp - qed - qed - qed -qed - -text {* (* ccc *) \noindent - Since the current precedence of the threads in ready queue will always be boosted, - there must be one inside it has the maximum precedence of the whole system. -*} -lemma max_cp_readys_threads: - shows "Max (cp s ` readys s) = Max (cp s ` threads s)" -proof(cases "threads s = {}") - case True - thus ?thesis - by (auto simp:readys_def) -next - case False - show ?thesis by (rule max_cp_readys_threads_pre[OF False]) -qed - -end - -lemma eq_holding: "holding (wq s) th cs = holding s th cs" - apply (unfold s_holding_def cs_holding_def wq_def, simp) - done - -lemma f_image_eq: - assumes h: "\ a. a \ A \ f a = g a" - shows "f ` A = g ` A" -proof - show "f ` A \ g ` A" - by(rule image_subsetI, auto intro:h) -next - show "g ` A \ f ` A" - by (rule image_subsetI, auto intro:h[symmetric]) -qed - - -definition detached :: "state \ thread \ bool" - where "detached s th \ (\(\ cs. holding s th cs)) \ (\(\cs. waiting s th cs))" - -lemma detached_test: - shows "detached s th = (Th th \ Field (RAG s))" -apply(simp add: detached_def Field_def) -apply(simp add: s_RAG_def) -apply(simp add: s_holding_abv s_waiting_abv) -apply(simp add: Domain_iff Range_iff) -apply(simp add: wq_def) -apply(auto) -done - -context valid_trace -begin - -lemma detached_intro: - assumes eq_pv: "cntP s th = cntV s th" - shows "detached s th" -proof - - from cnp_cnv_cncs - have eq_cnt: "cntP s th = - cntV s th + (if th \ readys s \ th \ threads s then cntCS s th else cntCS s th + 1)" . - hence cncs_zero: "cntCS s th = 0" - by (auto simp:eq_pv split:if_splits) - with eq_cnt - have "th \ readys s \ th \ threads s" by (auto simp:eq_pv) - thus ?thesis - proof - assume "th \ threads s" - with range_in dm_RAG_threads - show ?thesis - by (auto simp add: detached_def s_RAG_def s_waiting_abv s_holding_abv wq_def Domain_iff Range_iff) - next - assume "th \ readys s" - moreover have "Th th \ Range (RAG s)" - proof - - from card_0_eq [OF finite_holding] and cncs_zero - have "holdents s th = {}" - by (simp add:cntCS_def) - thus ?thesis - apply(auto simp:holdents_test) - apply(case_tac a) - apply(auto simp:holdents_test s_RAG_def) - done - qed - ultimately show ?thesis - by (auto simp add: detached_def s_RAG_def s_waiting_abv s_holding_abv wq_def readys_def) - qed -qed - -lemma detached_elim: - assumes dtc: "detached s th" - shows "cntP s th = cntV s th" -proof - - from cnp_cnv_cncs - have eq_pv: " cntP s th = - cntV s th + (if th \ readys s \ th \ threads s then cntCS s th else cntCS s th + 1)" . - have cncs_z: "cntCS s th = 0" - proof - - from dtc have "holdents s th = {}" - unfolding detached_def holdents_test s_RAG_def - by (simp add: s_waiting_abv wq_def s_holding_abv Domain_iff Range_iff) - thus ?thesis by (auto simp:cntCS_def) - qed - show ?thesis - proof(cases "th \ threads s") - case True - with dtc - have "th \ readys s" - by (unfold readys_def detached_def Field_def Domain_def Range_def, - auto simp:waiting_eq s_RAG_def) - with cncs_z and eq_pv show ?thesis by simp - next - case False - with cncs_z and eq_pv show ?thesis by simp - qed -qed - -lemma detached_eq: - shows "(detached s th) = (cntP s th = cntV s th)" - by (insert vt, auto intro:detached_intro detached_elim) - -end - -text {* - The lemmas in this .thy file are all obvious lemmas, however, they still needs to be derived - from the concise and miniature model of PIP given in PrioGDef.thy. -*} - -lemma eq_dependants: "dependants (wq s) = dependants s" - by (simp add: s_dependants_abv wq_def) - -lemma next_th_unique: - assumes nt1: "next_th s th cs th1" - and nt2: "next_th s th cs th2" - shows "th1 = th2" -using assms by (unfold next_th_def, auto) - -lemma birth_time_lt: "s \ [] \ last_set th s < length s" - apply (induct s, simp) -proof - - fix a s - assume ih: "s \ [] \ last_set th s < length s" - and eq_as: "a # s \ []" - show "last_set th (a # s) < length (a # s)" - proof(cases "s \ []") - case False - from False show ?thesis - by (cases a, auto simp:last_set.simps) - next - case True - from ih [OF True] show ?thesis - by (cases a, auto simp:last_set.simps) - qed -qed - -lemma th_in_ne: "th \ threads s \ s \ []" - by (induct s, auto simp:threads.simps) - -lemma preced_tm_lt: "th \ threads s \ preced th s = Prc x y \ y < length s" - apply (drule_tac th_in_ne) - by (unfold preced_def, auto intro: birth_time_lt) - -lemma inj_the_preced: - "inj_on (the_preced s) (threads s)" - by (metis inj_onI preced_unique the_preced_def) - -lemma tRAG_alt_def: - "tRAG s = {(Th th1, Th th2) | th1 th2. - \ cs. (Th th1, Cs cs) \ RAG s \ (Cs cs, Th th2) \ RAG s}" - by (auto simp:tRAG_def RAG_split wRAG_def hRAG_def) - -lemma tRAG_Field: - "Field (tRAG s) \ Field (RAG s)" - by (unfold tRAG_alt_def Field_def, auto) - -lemma tRAG_ancestorsE: - assumes "x \ ancestors (tRAG s) u" - obtains th where "x = Th th" -proof - - from assms have "(u, x) \ (tRAG s)^+" - by (unfold ancestors_def, auto) - from tranclE[OF this] obtain c where "(c, x) \ tRAG s" by auto - then obtain th where "x = Th th" - by (unfold tRAG_alt_def, auto) - from that[OF this] show ?thesis . -qed - -lemma tRAG_mono: - assumes "RAG s' \ RAG s" - shows "tRAG s' \ tRAG s" - using assms - by (unfold tRAG_alt_def, auto) - -lemma holding_next_thI: - assumes "holding s th cs" - and "length (wq s cs) > 1" - obtains th' where "next_th s th cs th'" -proof - - from assms(1)[folded eq_holding, unfolded cs_holding_def] - have " th \ set (wq s cs) \ th = hd (wq s cs)" . - then obtain rest where h1: "wq s cs = th#rest" - by (cases "wq s cs", auto) - with assms(2) have h2: "rest \ []" by auto - let ?th' = "hd (SOME q. distinct q \ set q = set rest)" - have "next_th s th cs ?th'" using h1(1) h2 - by (unfold next_th_def, auto) - from that[OF this] show ?thesis . -qed - -lemma RAG_tRAG_transfer: - assumes "vt s'" - assumes "RAG s = RAG s' \ {(Th th, Cs cs)}" - and "(Cs cs, Th th'') \ RAG s'" - shows "tRAG s = tRAG s' \ {(Th th, Th th'')}" (is "?L = ?R") -proof - - interpret vt_s': valid_trace "s'" using assms(1) - by (unfold_locales, simp) - interpret rtree: rtree "RAG s'" - proof - show "single_valued (RAG s')" - apply (intro_locales) - by (unfold single_valued_def, - auto intro:vt_s'.unique_RAG) - - show "acyclic (RAG s')" - by (rule vt_s'.acyclic_RAG) - qed - { fix n1 n2 - assume "(n1, n2) \ ?L" - from this[unfolded tRAG_alt_def] - obtain th1 th2 cs' where - h: "n1 = Th th1" "n2 = Th th2" - "(Th th1, Cs cs') \ RAG s" - "(Cs cs', Th th2) \ RAG s" by auto - from h(4) and assms(2) have cs_in: "(Cs cs', Th th2) \ RAG s'" by auto - from h(3) and assms(2) - have "(Th th1, Cs cs') = (Th th, Cs cs) \ - (Th th1, Cs cs') \ RAG s'" by auto - hence "(n1, n2) \ ?R" - proof - assume h1: "(Th th1, Cs cs') = (Th th, Cs cs)" - hence eq_th1: "th1 = th" by simp - moreover have "th2 = th''" - proof - - from h1 have "cs' = cs" by simp - from assms(3) cs_in[unfolded this] rtree.sgv - show ?thesis - by (unfold single_valued_def, auto) - qed - ultimately show ?thesis using h(1,2) by auto - next - assume "(Th th1, Cs cs') \ RAG s'" - with cs_in have "(Th th1, Th th2) \ tRAG s'" - by (unfold tRAG_alt_def, auto) - from this[folded h(1, 2)] show ?thesis by auto - qed - } moreover { - fix n1 n2 - assume "(n1, n2) \ ?R" - hence "(n1, n2) \tRAG s' \ (n1, n2) = (Th th, Th th'')" by auto - hence "(n1, n2) \ ?L" - proof - assume "(n1, n2) \ tRAG s'" - moreover have "... \ ?L" - proof(rule tRAG_mono) - show "RAG s' \ RAG s" by (unfold assms(2), auto) - qed - ultimately show ?thesis by auto - next - assume eq_n: "(n1, n2) = (Th th, Th th'')" - from assms(2, 3) have "(Cs cs, Th th'') \ RAG s" by auto - moreover have "(Th th, Cs cs) \ RAG s" using assms(2) by auto - ultimately show ?thesis - by (unfold eq_n tRAG_alt_def, auto) - qed - } ultimately show ?thesis by auto -qed - -context valid_trace -begin - -lemmas RAG_tRAG_transfer = RAG_tRAG_transfer[OF vt] +lemma max_cp_eq_the_preced: + shows "Max ((cp s) ` threads s) = Max (the_preced s ` threads s)" + using max_cp_eq using the_preced_def by presburger end -lemma cp_alt_def: - "cp s th = - Max ((the_preced s) ` {th'. Th th' \ (subtree (RAG s) (Th th))})" -proof - - have "Max (the_preced s ` ({th} \ dependants (wq s) th)) = - Max (the_preced s ` {th'. Th th' \ subtree (RAG s) (Th th)})" - (is "Max (_ ` ?L) = Max (_ ` ?R)") - proof - - have "?L = ?R" - by (auto dest:rtranclD simp:cs_dependants_def cs_RAG_def s_RAG_def subtree_def) - thus ?thesis by simp - qed - thus ?thesis by (unfold cp_eq_cpreced cpreced_def, fold the_preced_def, simp) -qed - -lemma cp_gen_alt_def: - "cp_gen s = (Max \ (\x. (the_preced s \ the_thread) ` subtree (tRAG s) x))" - by (auto simp:cp_gen_def) - -lemma tRAG_nodeE: - assumes "(n1, n2) \ tRAG s" - obtains th1 th2 where "n1 = Th th1" "n2 = Th th2" - using assms - by (auto simp: tRAG_def wRAG_def hRAG_def tRAG_def) +lemma preced_v [simp]: "preced th' (V th cs#s) = preced th' s" + by (unfold preced_def, simp) -lemma subtree_nodeE: - assumes "n \ subtree (tRAG s) (Th th)" - obtains th1 where "n = Th th1" -proof - - show ?thesis - proof(rule subtreeE[OF assms]) - assume "n = Th th" - from that[OF this] show ?thesis . - next - assume "Th th \ ancestors (tRAG s) n" - hence "(n, Th th) \ (tRAG s)^+" by (auto simp:ancestors_def) - hence "\ th1. n = Th th1" - proof(induct) - case (base y) - from tRAG_nodeE[OF this] show ?case by metis - next - case (step y z) - thus ?case by auto - qed - with that show ?thesis by auto - qed -qed +lemma (in valid_trace_v) + preced_es: "preced th (e#s) = preced th s" + by (unfold is_v preced_def, simp) -lemma tRAG_star_RAG: "(tRAG s)^* \ (RAG s)^*" -proof - - have "(wRAG s O hRAG s)^* \ (RAG s O RAG s)^*" - by (rule rtrancl_mono, auto simp:RAG_split) - also have "... \ ((RAG s)^*)^*" - by (rule rtrancl_mono, auto) - also have "... = (RAG s)^*" by simp - finally show ?thesis by (unfold tRAG_def, simp) -qed - -lemma tRAG_subtree_RAG: "subtree (tRAG s) x \ subtree (RAG s) x" -proof - - { fix a - assume "a \ subtree (tRAG s) x" - hence "(a, x) \ (tRAG s)^*" by (auto simp:subtree_def) - with tRAG_star_RAG[of s] - have "(a, x) \ (RAG s)^*" by auto - hence "a \ subtree (RAG s) x" by (auto simp:subtree_def) - } thus ?thesis by auto +lemma the_preced_v[simp]: "the_preced (V th cs#s) = the_preced s" +proof + fix th' + show "the_preced (V th cs # s) th' = the_preced s th'" + by (unfold the_preced_def preced_def, simp) qed -lemma tRAG_trancl_eq: - "{th'. (Th th', Th th) \ (tRAG s)^+} = - {th'. (Th th', Th th) \ (RAG s)^+}" - (is "?L = ?R") -proof - - { fix th' - assume "th' \ ?L" - hence "(Th th', Th th) \ (tRAG s)^+" by auto - from tranclD[OF this] - obtain z where h: "(Th th', z) \ tRAG s" "(z, Th th) \ (tRAG s)\<^sup>*" by auto - from tRAG_subtree_RAG[of s] and this(2) - have "(z, Th th) \ (RAG s)^*" by (meson subsetCE tRAG_star_RAG) - moreover from h(1) have "(Th th', z) \ (RAG s)^+" using tRAG_alt_def by auto - ultimately have "th' \ ?R" by auto - } moreover - { fix th' - assume "th' \ ?R" - hence "(Th th', Th th) \ (RAG s)^+" by (auto) - from plus_rpath[OF this] - obtain xs where rp: "rpath (RAG s) (Th th') xs (Th th)" "xs \ []" by auto - hence "(Th th', Th th) \ (tRAG s)^+" - proof(induct xs arbitrary:th' th rule:length_induct) - case (1 xs th' th) - then obtain x1 xs1 where Cons1: "xs = x1#xs1" by (cases xs, auto) - show ?case - proof(cases "xs1") - case Nil - from 1(2)[unfolded Cons1 Nil] - have rp: "rpath (RAG s) (Th th') [x1] (Th th)" . - hence "(Th th', x1) \ (RAG s)" by (cases, simp) - then obtain cs where "x1 = Cs cs" - by (unfold s_RAG_def, auto) - from rpath_nnl_lastE[OF rp[unfolded this]] - show ?thesis by auto - next - case (Cons x2 xs2) - from 1(2)[unfolded Cons1[unfolded this]] - have rp: "rpath (RAG s) (Th th') (x1 # x2 # xs2) (Th th)" . - from rpath_edges_on[OF this] - have eds: "edges_on (Th th' # x1 # x2 # xs2) \ RAG s" . - have "(Th th', x1) \ edges_on (Th th' # x1 # x2 # xs2)" - by (simp add: edges_on_unfold) - with eds have rg1: "(Th th', x1) \ RAG s" by auto - then obtain cs1 where eq_x1: "x1 = Cs cs1" by (unfold s_RAG_def, auto) - have "(x1, x2) \ edges_on (Th th' # x1 # x2 # xs2)" - by (simp add: edges_on_unfold) - from this eds - have rg2: "(x1, x2) \ RAG s" by auto - from this[unfolded eq_x1] - obtain th1 where eq_x2: "x2 = Th th1" by (unfold s_RAG_def, auto) - from rg1[unfolded eq_x1] rg2[unfolded eq_x1 eq_x2] - have rt1: "(Th th', Th th1) \ tRAG s" by (unfold tRAG_alt_def, auto) - from rp have "rpath (RAG s) x2 xs2 (Th th)" - by (elim rpath_ConsE, simp) - from this[unfolded eq_x2] have rp': "rpath (RAG s) (Th th1) xs2 (Th th)" . - show ?thesis - proof(cases "xs2 = []") - case True - from rpath_nilE[OF rp'[unfolded this]] - have "th1 = th" by auto - from rt1[unfolded this] show ?thesis by auto - next - case False - from 1(1)[rule_format, OF _ rp' this, unfolded Cons1 Cons] - have "(Th th1, Th th) \ (tRAG s)\<^sup>+" by simp - with rt1 show ?thesis by auto - qed - qed - qed - hence "th' \ ?L" by auto - } ultimately show ?thesis by blast -qed - -lemma tRAG_trancl_eq_Th: - "{Th th' | th'. (Th th', Th th) \ (tRAG s)^+} = - {Th th' | th'. (Th th', Th th) \ (RAG s)^+}" - using tRAG_trancl_eq by auto +lemma (in valid_trace_v) + the_preced_es: "the_preced (e#s) = the_preced s" + by (unfold is_v preced_def, simp) -lemma dependants_alt_def: - "dependants s th = {th'. (Th th', Th th) \ (tRAG s)^+}" - by (metis eq_RAG s_dependants_def tRAG_trancl_eq) - -context valid_trace -begin - -lemma count_eq_tRAG_plus: - assumes "cntP s th = cntV s th" - shows "{th'. (Th th', Th th) \ (tRAG s)^+} = {}" - using assms count_eq_dependants dependants_alt_def eq_dependants by auto - -lemma count_eq_RAG_plus: - assumes "cntP s th = cntV s th" - shows "{th'. (Th th', Th th) \ (RAG s)^+} = {}" - using assms count_eq_dependants cs_dependants_def eq_RAG by auto - -lemma count_eq_RAG_plus_Th: - assumes "cntP s th = cntV s th" - shows "{Th th' | th'. (Th th', Th th) \ (RAG s)^+} = {}" - using count_eq_RAG_plus[OF assms] by auto - -lemma count_eq_tRAG_plus_Th: - assumes "cntP s th = cntV s th" - shows "{Th th' | th'. (Th th', Th th) \ (tRAG s)^+} = {}" - using count_eq_tRAG_plus[OF assms] by auto - -end - -lemma tRAG_subtree_eq: - "(subtree (tRAG s) (Th th)) = {Th th' | th'. Th th' \ (subtree (RAG s) (Th th))}" - (is "?L = ?R") -proof - - { fix n - assume h: "n \ ?L" - hence "n \ ?R" - by (smt mem_Collect_eq subsetCE subtree_def subtree_nodeE tRAG_subtree_RAG) - } moreover { - fix n - assume "n \ ?R" - then obtain th' where h: "n = Th th'" "(Th th', Th th) \ (RAG s)^*" - by (auto simp:subtree_def) - from rtranclD[OF this(2)] - have "n \ ?L" - proof - assume "Th th' \ Th th \ (Th th', Th th) \ (RAG s)\<^sup>+" - with h have "n \ {Th th' | th'. (Th th', Th th) \ (RAG s)^+}" by auto - thus ?thesis using subtree_def tRAG_trancl_eq by fastforce - qed (insert h, auto simp:subtree_def) - } ultimately show ?thesis by auto -qed - -lemma threads_set_eq: - "the_thread ` (subtree (tRAG s) (Th th)) = - {th'. Th th' \ (subtree (RAG s) (Th th))}" (is "?L = ?R") - by (auto intro:rev_image_eqI simp:tRAG_subtree_eq) - -lemma cp_alt_def1: - "cp s th = Max ((the_preced s o the_thread) ` (subtree (tRAG s) (Th th)))" -proof - - have "(the_preced s ` the_thread ` subtree (tRAG s) (Th th)) = - ((the_preced s \ the_thread) ` subtree (tRAG s) (Th th))" - by auto - thus ?thesis by (unfold cp_alt_def, fold threads_set_eq, auto) -qed - -lemma cp_gen_def_cond: - assumes "x = Th th" - shows "cp s th = cp_gen s (Th th)" -by (unfold cp_alt_def1 cp_gen_def, simp) - -lemma cp_gen_over_set: - assumes "\ x \ A. \ th. x = Th th" - shows "cp_gen s ` A = (cp s \ the_thread) ` A" -proof(rule f_image_eq) - fix a - assume "a \ A" - from assms[rule_format, OF this] - obtain th where eq_a: "a = Th th" by auto - show "cp_gen s a = (cp s \ the_thread) a" - by (unfold eq_a, simp, unfold cp_gen_def_cond[OF refl[of "Th th"]], simp) -qed - - -context valid_trace +context valid_trace_p begin -lemma RAG_threads: - assumes "(Th th) \ Field (RAG s)" - shows "th \ threads s" - using assms - by (metis Field_def UnE dm_RAG_threads range_in vt) - -lemma subtree_tRAG_thread: - assumes "th \ threads s" - shows "subtree (tRAG s) (Th th) \ Th ` threads s" (is "?L \ ?R") -proof - - have "?L = {Th th' |th'. Th th' \ subtree (RAG s) (Th th)}" - by (unfold tRAG_subtree_eq, simp) - also have "... \ ?R" - proof - fix x - assume "x \ {Th th' |th'. Th th' \ subtree (RAG s) (Th th)}" - then obtain th' where h: "x = Th th'" "Th th' \ subtree (RAG s) (Th th)" by auto - from this(2) - show "x \ ?R" - proof(cases rule:subtreeE) - case 1 - thus ?thesis by (simp add: assms h(1)) - next - case 2 - thus ?thesis by (metis ancestors_Field dm_RAG_threads h(1) image_eqI) - qed - qed - finally show ?thesis . -qed - -lemma readys_root: - assumes "th \ readys s" - shows "root (RAG s) (Th th)" -proof - - { fix x - assume "x \ ancestors (RAG s) (Th th)" - hence h: "(Th th, x) \ (RAG s)^+" by (auto simp:ancestors_def) - from tranclD[OF this] - obtain z where "(Th th, z) \ RAG s" by auto - with assms(1) have False - apply (case_tac z, auto simp:readys_def s_RAG_def s_waiting_def cs_waiting_def) - by (fold wq_def, blast) - } thus ?thesis by (unfold root_def, auto) -qed - -lemma readys_in_no_subtree: - assumes "th \ readys s" - and "th' \ th" - shows "Th th \ subtree (RAG s) (Th th')" -proof - assume "Th th \ subtree (RAG s) (Th th')" - thus False - proof(cases rule:subtreeE) - case 1 - with assms show ?thesis by auto - next - case 2 - with readys_root[OF assms(1)] - show ?thesis by (auto simp:root_def) - qed -qed - -lemma not_in_thread_isolated: - assumes "th \ threads s" - shows "(Th th) \ Field (RAG s)" -proof - assume "(Th th) \ Field (RAG s)" - with dm_RAG_threads and range_in assms - show False by (unfold Field_def, blast) -qed - -lemma wf_RAG: "wf (RAG s)" -proof(rule finite_acyclic_wf) - from finite_RAG show "finite (RAG s)" . -next - from acyclic_RAG show "acyclic (RAG s)" . -qed - -lemma sgv_wRAG: "single_valued (wRAG s)" - using waiting_unique - by (unfold single_valued_def wRAG_def, auto) - -lemma sgv_hRAG: "single_valued (hRAG s)" - using holding_unique - by (unfold single_valued_def hRAG_def, auto) - -lemma sgv_tRAG: "single_valued (tRAG s)" - by (unfold tRAG_def, rule single_valued_relcomp, - insert sgv_wRAG sgv_hRAG, auto) - -lemma acyclic_tRAG: "acyclic (tRAG s)" -proof(unfold tRAG_def, rule acyclic_compose) - show "acyclic (RAG s)" using acyclic_RAG . -next - show "wRAG s \ RAG s" unfolding RAG_split by auto -next - show "hRAG s \ RAG s" unfolding RAG_split by auto -qed - -lemma sgv_RAG: "single_valued (RAG s)" - using unique_RAG by (auto simp:single_valued_def) - -lemma rtree_RAG: "rtree (RAG s)" - using sgv_RAG acyclic_RAG - by (unfold rtree_def rtree_axioms_def sgv_def, auto) - -end - -sublocale valid_trace < rtree_RAG: rtree "RAG s" +lemma not_holding_es_th_cs: "\ holding s th cs" proof - show "single_valued (RAG s)" - apply (intro_locales) - by (unfold single_valued_def, - auto intro:unique_RAG) - - show "acyclic (RAG s)" - by (rule acyclic_RAG) -qed - -sublocale valid_trace < rtree_s: rtree "tRAG s" -proof(unfold_locales) - from sgv_tRAG show "single_valued (tRAG s)" . -next - from acyclic_tRAG show "acyclic (tRAG s)" . -qed - -sublocale valid_trace < fsbtRAGs : fsubtree "RAG s" -proof - - show "fsubtree (RAG s)" - proof(intro_locales) - show "fbranch (RAG s)" using finite_fbranchI[OF finite_RAG] . - next - show "fsubtree_axioms (RAG s)" - proof(unfold fsubtree_axioms_def) - from wf_RAG show "wf (RAG s)" . - qed - qed -qed - -sublocale valid_trace < fsbttRAGs: fsubtree "tRAG s" -proof - - have "fsubtree (tRAG s)" - proof - - have "fbranch (tRAG s)" - proof(unfold tRAG_def, rule fbranch_compose) - show "fbranch (wRAG s)" - proof(rule finite_fbranchI) - from finite_RAG show "finite (wRAG s)" - by (unfold RAG_split, auto) - qed - next - show "fbranch (hRAG s)" - proof(rule finite_fbranchI) - from finite_RAG - show "finite (hRAG s)" by (unfold RAG_split, auto) - qed - qed - moreover have "wf (tRAG s)" - proof(rule wf_subset) - show "wf (RAG s O RAG s)" using wf_RAG - by (fold wf_comp_self, simp) - next - show "tRAG s \ (RAG s O RAG s)" - by (unfold tRAG_alt_def, auto) - qed - ultimately show ?thesis - by (unfold fsubtree_def fsubtree_axioms_def,auto) - qed - from this[folded tRAG_def] show "fsubtree (tRAG s)" . -qed - -lemma Max_UNION: - assumes "finite A" - and "A \ {}" - and "\ M \ f ` A. finite M" - and "\ M \ f ` A. M \ {}" - shows "Max (\x\ A. f x) = Max (Max ` f ` A)" (is "?L = ?R") - using assms[simp] -proof - - have "?L = Max (\(f ` A))" - by (fold Union_image_eq, simp) - also have "... = ?R" - by (subst Max_Union, simp+) - finally show ?thesis . -qed - -lemma max_Max_eq: - assumes "finite A" - and "A \ {}" - and "x = y" - shows "max x (Max A) = Max ({y} \ A)" (is "?L = ?R") -proof - - have "?R = Max (insert y A)" by simp - also from assms have "... = ?L" - by (subst Max.insert, simp+) - finally show ?thesis by simp -qed - -context valid_trace -begin - -(* ddd *) -lemma cp_gen_rec: - assumes "x = Th th" - shows "cp_gen s x = Max ({the_preced s th} \ (cp_gen s) ` children (tRAG s) x)" -proof(cases "children (tRAG s) x = {}") - case True - show ?thesis - by (unfold True cp_gen_def subtree_children, simp add:assms) -next - case False - hence [simp]: "children (tRAG s) x \ {}" by auto - note fsbttRAGs.finite_subtree[simp] - have [simp]: "finite (children (tRAG s) x)" - by (intro rev_finite_subset[OF fsbttRAGs.finite_subtree], - rule children_subtree) - { fix r x - have "subtree r x \ {}" by (auto simp:subtree_def) - } note this[simp] - have [simp]: "\x\children (tRAG s) x. subtree (tRAG s) x \ {}" - proof - - from False obtain q where "q \ children (tRAG s) x" by blast - moreover have "subtree (tRAG s) q \ {}" by simp - ultimately show ?thesis by blast - qed - have h: "Max ((the_preced s \ the_thread) ` - ({x} \ \(subtree (tRAG s) ` children (tRAG s) x))) = - Max ({the_preced s th} \ cp_gen s ` children (tRAG s) x)" - (is "?L = ?R") - proof - - let "Max (?f ` (?A \ \ (?g ` ?B)))" = ?L - let "Max (_ \ (?h ` ?B))" = ?R - let ?L1 = "?f ` \(?g ` ?B)" - have eq_Max_L1: "Max ?L1 = Max (?h ` ?B)" - proof - - have "?L1 = ?f ` (\ x \ ?B.(?g x))" by simp - also have "... = (\ x \ ?B. ?f ` (?g x))" by auto - finally have "Max ?L1 = Max ..." by simp - also have "... = Max (Max ` (\x. ?f ` subtree (tRAG s) x) ` ?B)" - by (subst Max_UNION, simp+) - also have "... = Max (cp_gen s ` children (tRAG s) x)" - by (unfold image_comp cp_gen_alt_def, simp) - finally show ?thesis . - qed - show ?thesis - proof - - have "?L = Max (?f ` ?A \ ?L1)" by simp - also have "... = max (the_preced s (the_thread x)) (Max ?L1)" - by (subst Max_Un, simp+) - also have "... = max (?f x) (Max (?h ` ?B))" - by (unfold eq_Max_L1, simp) - also have "... =?R" - by (rule max_Max_eq, (simp)+, unfold assms, simp) - finally show ?thesis . - qed - qed thus ?thesis - by (fold h subtree_children, unfold cp_gen_def, simp) -qed - -lemma cp_rec: - "cp s th = Max ({the_preced s th} \ - (cp s o the_thread) ` children (tRAG s) (Th th))" -proof - - have "Th th = Th th" by simp - note h = cp_gen_def_cond[OF this] cp_gen_rec[OF this] - show ?thesis - proof - - have "cp_gen s ` children (tRAG s) (Th th) = - (cp s \ the_thread) ` children (tRAG s) (Th th)" - proof(rule cp_gen_over_set) - show " \x\children (tRAG s) (Th th). \th. x = Th th" - by (unfold tRAG_alt_def, auto simp:children_def) - qed - thus ?thesis by (subst (1) h(1), unfold h(2), simp) + assume otherwise: "holding s th cs" + from pip_e[unfolded is_p] + show False + proof(cases) + case (thread_P) + moreover have "(Cs cs, Th th) \ RAG s" + using otherwise cs_holding_def + holding_eq th_not_in_wq by auto + ultimately show ?thesis by auto qed qed end -(* keep *) -lemma next_th_holding: - assumes vt: "vt s" - and nxt: "next_th s th cs th'" - shows "holding (wq s) th cs" -proof - - from nxt[unfolded next_th_def] - obtain rest where h: "wq s cs = th # rest" - "rest \ []" - "th' = hd (SOME q. distinct q \ set q = set rest)" by auto - thus ?thesis - by (unfold cs_holding_def, auto) -qed +locale valid_trace_p_h = valid_trace_p + + assumes we: "wq s cs = []" -context valid_trace +locale valid_trace_p_w = valid_trace_p + + assumes we: "wq s cs \ []" begin -lemma next_th_waiting: - assumes nxt: "next_th s th cs th'" - shows "waiting (wq s) th' cs" -proof - - from nxt[unfolded next_th_def] - obtain rest where h: "wq s cs = th # rest" - "rest \ []" - "th' = hd (SOME q. distinct q \ set q = set rest)" by auto - from wq_distinct[of cs, unfolded h] - have dst: "distinct (th # rest)" . - have in_rest: "th' \ set rest" - proof(unfold h, rule someI2) - show "distinct rest \ set rest = set rest" using dst by auto - next - fix x assume "distinct x \ set x = set rest" - with h(2) - show "hd x \ set (rest)" by (cases x, auto) - qed - hence "th' \ set (wq s cs)" by (unfold h(1), auto) - moreover have "th' \ hd (wq s cs)" - by (unfold h(1), insert in_rest dst, auto) - ultimately show ?thesis by (auto simp:cs_waiting_def) -qed +definition "holder = hd (wq s cs)" +definition "waiters = tl (wq s cs)" +definition "waiters' = waiters @ [th]" -lemma next_th_RAG: - assumes nxt: "next_th (s::event list) th cs th'" - shows "{(Cs cs, Th th), (Th th', Cs cs)} \ RAG s" - using vt assms next_th_holding next_th_waiting - by (unfold s_RAG_def, simp) +lemma wq_s_cs: "wq s cs = holder#waiters" + by (simp add: holder_def waiters_def we) + +lemma wq_es_cs': "wq (e#s) cs = holder#waiters@[th]" + by (simp add: wq_es_cs wq_s_cs) + +lemma waiting_es_th_cs: "waiting (e#s) th cs" + using cs_waiting_def th_not_in_wq waiting_eq wq_es_cs' wq_s_cs by auto + +lemma RAG_edge: "(Th th, Cs cs) \ RAG (e#s)" + by (unfold s_RAG_def, fold waiting_eq, insert waiting_es_th_cs, auto) end --- {* A useless definition *} -definition cps:: "state \ (thread \ precedence) set" -where "cps s = {(th, cp s th) | th . th \ threads s}" +context valid_trace_p_h +begin + +lemma wq_es_cs': "wq (e#s) cs = [th]" + using wq_es_cs[unfolded we] by simp + +lemma holding_es_th_cs: + shows "holding (e#s) th cs" +proof - + from wq_es_cs' + have "th \ set (wq (e#s) cs)" "th = hd (wq (e#s) cs)" by auto + thus ?thesis using cs_holding_def holding_eq by blast +qed + +lemma RAG_edge: "(Cs cs, Th th) \ RAG (e#s)" + by (unfold s_RAG_def, fold holding_eq, insert holding_es_th_cs, auto) + +lemma waiting_esE: + assumes "waiting (e#s) th' cs'" + obtains "waiting s th' cs'" + using assms + by (metis cs_waiting_def event.distinct(15) is_p list.sel(1) + set_ConsD waiting_eq we wq_es_cs' wq_neq_simp wq_out_inv) + +lemma holding_esE: + assumes "holding (e#s) th' cs'" + obtains "cs' \ cs" "holding s th' cs'" + | "cs' = cs" "th' = th" +proof(cases "cs' = cs") + case True + from held_unique[OF holding_es_th_cs assms[unfolded True]] + have "th' = th" by simp + from that(2)[OF True this] show ?thesis . +next + case False + have "holding s th' cs'" using assms + using False cs_holding_def holding_eq by auto + from that(1)[OF False this] show ?thesis . +qed -find_theorems release +lemma waiting_kept: + assumes "waiting s th' cs'" + shows "waiting (e#s) th' cs'" + using assms + by (metis cs_waiting_def list.sel(1) list.set_intros(2) + th_not_in_wq waiting_eq we wq_es_cs' wq_neq_simp) + -lemma "wq (V th cs # s) cs1 = ttt" - apply (unfold wq_def, auto simp:Let_def) +lemma RAG_es: "RAG (e # s) = RAG s \ {(Cs cs, Th th)}" (is "?L = ?R") +proof(rule rel_eqI) + fix n1 n2 + assume "(n1, n2) \ ?L" + thus "(n1, n2) \ ?R" + proof(cases rule:in_RAG_E) + case (waiting th' cs') + from this(3) + show ?thesis + proof(cases rule:waiting_esE) + case 1 + thus ?thesis using waiting(1,2) + by (unfold s_RAG_def, fold waiting_eq, auto) + qed + next + case (holding th' cs') + from this(3) + show ?thesis + proof(cases rule:holding_esE) + case 1 + with holding(1,2) + show ?thesis by (unfold s_RAG_def, fold holding_eq, auto) + next + case 2 + with holding(1,2) show ?thesis by auto + qed + qed +next + fix n1 n2 + assume "(n1, n2) \ ?R" + hence "(n1, n2) \ RAG s \ (n1 = Cs cs \ n2 = Th th)" by auto + thus "(n1, n2) \ ?L" + proof + assume "(n1, n2) \ RAG s" + thus ?thesis + proof(cases rule:in_RAG_E) + case (waiting th' cs') + find_theorems waiting e s + qed + qed +qed end + + +lemma "RAG (e # s) = (if (wq s cs = []) then RAG s \ {(Cs cs, Th th)} + else RAG s \ {(Th th, Cs cs)})" + proof(cases "wq s cs = []") + case True + from wq_es_cs[unfolded this] + have "th \ set (wq (e#s) cs)" "th = hd (wq (e#s) cs)" by auto + hence "holding (e#s) th cs" + using cs_holding_def holding_eq by blast + thus + qed +end + +text {* + The following @{text "step_RAG_p"} lemma charaterizes how @{text "RAG"} is changed + with the happening of @{text "P"}-events: +*} +lemma step_RAG_p: + "vt (P th cs#s) \ + RAG (P th cs # s) = (if (wq s cs = []) then RAG s \ {(Cs cs, Th th)} + else RAG s \ {(Th th, Cs cs)})" + apply(simp only: s_RAG_def wq_def) + apply (auto split:list.splits prod.splits simp:Let_def wq_def cs_waiting_def cs_holding_def) + apply(case_tac "csa = cs", auto) + apply(fold wq_def) + apply(drule_tac step_back_step) + apply(ind_cases " step s (P (hd (wq s cs)) cs)") + apply(simp add:s_RAG_def wq_def cs_holding_def) + apply(auto) + done + + + +end \ No newline at end of file