lemma valid_W_invD0: "[ r ∈ W (s p); valid_W_inv s; p ≠ q ]==> r ∉ WL q s" "[ r ∈ W (s p); valid_W_inv s ]==> r ∉ ghost_honorary_grey (s q)" "[ r ∈ ghost_honorary_grey (s p); valid_W_inv s ]==> r ∉ W (s q)" "[ r ∈ ghost_honorary_grey (s p); valid_W_inv s; p ≠ q ]==> r ∉ WL q s" using marked_not_white unfolding valid_W_inv_def WL_def by (auto 05 split: obj_at_splits)
lemma valid_W_distinct_simps: "[r ∈ ghost_honorary_grey (s p); valid_W_inv s]==> (r ∈ ghost_honorary_grey (s q)) ⟷ (p = q)" "[r ∈ W (s p); valid_W_inv s]==> (r ∈ W (s q)) ⟷ (p = q)" "[r ∈ WL p s; valid_W_inv s]==> (r ∈ WL q s) ⟷ (p = q)" using valid_W_invD0(4) apply fastforce using valid_W_invD0(1) apply fastforce apply (metis UnE WL_def valid_W_invD0(1) valid_W_invD0(4)) done
lemma valid_W_inv_sys_mem_store_buffersD: "[ sys_mem_store_buffers p s = mw_Mutate r' f r'' # ws; mw_Mark r fl ∈ set ws; valid_W_inv s ] ==> fl = sys_fM s ∧ r ∈ ghost_honorary_grey (s p) ∧ tso_locked_by p s ∧ white r s ∧ filter is_mw_Mark ws = [mw_Mark r fl]" "[ sys_mem_store_buffers p s = mw_fA fl' # ws; mw_Mark r fl ∈ set ws; valid_W_inv s ] ==> fl = sys_fM s ∧ r ∈ ghost_honorary_grey (s p) ∧ tso_locked_by p s ∧ white r s ∧ filter is_mw_Mark ws = [mw_Mark r fl]" "[ sys_mem_store_buffers p s = mw_fM fl' # ws; mw_Mark r fl ∈ set ws; valid_W_inv s ] ==> fl = sys_fM s ∧ r ∈ ghost_honorary_grey (s p) ∧ tso_locked_by p s ∧ white r s ∧ filter is_mw_Mark ws = [mw_Mark r fl]" "[ sys_mem_store_buffers p s = mw_Phase ph # ws; mw_Mark r fl ∈ set ws; valid_W_inv s ] ==> fl = sys_fM s ∧ r ∈ ghost_honorary_grey (s p) ∧ tso_locked_by p s ∧ white r s ∧ filter is_mw_Mark ws = [mw_Mark r fl]" unfolding valid_W_inv_def white_def by (clarsimp dest!: spec[where x=p], blast)+
lemma valid_W_invE2: "[ r ∈ W (s p); valid_W_inv s; ∧obj. obj_mark obj = sys_fM s ==> P obj]==> obj_at P r s" "[ r ∈ ghost_honorary_grey (s p); sys_mem_lock s ≠ Some p; valid_W_inv s; ∧obj. obj_mark obj = sys_fM s ==> P obj ]==> obj_at P r s" unfolding valid_W_inv_def apply (simp_all add: split: obj_at_splits) apply blast+ done
lemma (in sys) valid_W_inv[intro]: notes if_split_asm[split del] notes fun_upd_apply[simp] shows "{ LSTP (fM_rel_inv \<and> sys_phase_inv \<and> tso_store_inv \<and> valid_refs_inv\<and> valid_W_inv) } sys { LSTP valid_W_inv }" proof(vcg_jackhammer (no_thin_post_inv), vcg_name_cases) case (tso_dequeue_store_buffer s s' p w ws) thenshow ?case proof(cases w) case (mw_Mark r fl) with tso_dequeue_store_buffer show ?thesis apply (subst valid_W_inv_def) apply clarsimp apply (frule (1) valid_W_invD(1)) apply (clarsimp simp: all_conj_distrib white_def valid_W_inv_sys_ghg_empty_iff filter_empty_conv obj_at_simps) apply (intro allI conjI impI) apply (auto elim: valid_W_invE2)[3] apply (meson Int_emptyI valid_W_distinct_simps(3)) apply (meson valid_W_invD0(2)) apply (meson valid_W_invD0(2)) using valid_W_invD(2) apply fastforce apply auto[1] using valid_W_invD(2) apply fastforce done nextcase (mw_fM fl) with tso_dequeue_store_buffer show ?thesis apply (clarsimp simp: fM_rel_inv_def fM_rel_def p_not_sys) apply (elim disjE; clarsimp) apply (frule (1) no_grey_refs_no_pending_marks) apply (subst valid_W_inv_def) apply clarsimp apply (meson Int_emptyI no_grey_refsD(1) no_grey_refsD(3) valid_W_distinct_simps(3) valid_W_invD(2) valid_W_inv_sys_ghg_empty_iff valid_W_inv_sys_mem_store_buffersD(3)) done qed simp_all qed
(* Lemmas for key mark_object transitions *)
lemma valid_W_inv_ghg_disjoint: "[ white y s; sys_mem_lock s = Some p; valid_W_inv s; p0 ≠ p1 ] ==> WL p0 (s(p := s p(ghost_honorary_grey := {y}))) ∩ WL p1 (s(p := s p(ghost_honorary_grey := {y}))) = {}" unfolding valid_W_inv_def WL_def by (auto 55 simp: fun_upd_apply)
lemma valid_W_inv_mo_co_mark: "[ valid_W_inv s; white y s; sys_mem_lock s = Some p; filter is_mw_Mark (sys_mem_store_buffers p s) = []; p ≠ sys ] ==> valid_W_inv (s(p := s p(ghost_honorary_grey := {y}), sys := s sys(mem_store_buffers := (mem_store_buffers (s sys))(p := sys_mem_store_buffers p s @ [mw_Mark y (sys_fM s)]))))" apply (subst valid_W_inv_def) apply (clarsimp simp: all_conj_distrib fun_upd_apply) apply (intro allI conjI impI) apply (auto simp: valid_W_invD valid_W_distinct_simps(3) valid_W_inv_sys_ghg_empty_iff valid_W_invD0 valid_W_inv_ghg_disjoint valid_W_inv_colours) done
lemma valid_W_inv_mo_co_lock: "[ valid_W_inv s; sys_mem_lock s = None ] ==> valid_W_inv (s(sys := s sys(mem_lock := Some p)))" by (auto simp: valid_W_inv_def fun_upd_apply) (* FIXME some eager rule expects valid_W_inv *)
lemma valid_W_inv_mo_co_W: "[ valid_W_inv s; marked y s; ghost_honorary_grey (s p) = {y}; p ≠ sys ] ==> valid_W_inv (s(p := s p(W := insert y (W (s p)), ghost_honorary_grey := {})))" apply (subst valid_W_inv_def) apply (clarsimp simp: all_conj_distrib valid_W_invD0(2) fun_upd_apply) apply (intro allI conjI impI) apply (auto simp: valid_W_invD valid_W_invD0(2) valid_W_distinct_simps(3)) using valid_W_distinct_simps(1) apply fastforce apply (metis marked_not_white singletonD valid_W_invD(2)) done
lemma valid_W_inv_mo_co_unlock: "[ sys_mem_lock s = Some p; sys_mem_store_buffers p s = []; ∧r. r ∈ ghost_honorary_grey (s p) ==> marked r s; valid_W_inv s ]==> valid_W_inv (s(sys := mem_lock_update Map.empty (s sys)))" unfolding valid_W_inv_def by (clarsimp simp: fun_upd_apply) (metis emptyE empty_set)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.