Theory Initial_Conditions
theory Initial_Conditions
imports
Local_Invariants_Lemmas
Global_Invariants_Lemmas
Tactics
begin
section‹Initial conditions \label{sec:initial-conditions-proofs}›
context gc_system
begin
lemma init_strong_tricolour_inv:
"⟦ obj_mark ` ran (sys_heap ⦇GST = s, HST = []⦈↓) ⊆ {gc_fM ⦇GST = s, HST = []⦈↓}; sys_fM ⦇GST = s, HST = []⦈↓ = gc_fM ⦇GST = s, HST = []⦈↓ ⟧
⟹ strong_tricolour_inv ⦇GST = s, HST = []⦈↓"
unfolding strong_tricolour_inv_def ran_def white_def by (auto split: obj_at_splits)
lemma init_no_grey_refs:
"⟦ gc_W ⦇GST = s, HST = []⦈↓ = {}; ∀m. W (⦇GST = s, HST = []⦈↓ (mutator m)) = {}; sys_W ⦇GST = s, HST = []⦈↓ = {};
gc_ghost_honorary_grey ⦇GST = s, HST = []⦈↓ = {}; ∀m. ghost_honorary_grey (⦇GST = s, HST = []⦈↓ (mutator m)) = {}; sys_ghost_honorary_grey ⦇GST = s, HST = []⦈↓ = {} ⟧
⟹ no_grey_refs ⦇GST = s, HST = []⦈↓"
unfolding no_grey_refs_def grey_def WL_def by (metis equals0D process_name.exhaust sup_bot.left_neutral)
lemma valid_refs_imp_valid_refs_inv:
"⟦ valid_refs s; no_grey_refs s; ∀p. sys_mem_store_buffers p s = []; ∀m. ghost_honorary_root (s (mutator m)) = {} ⟧
⟹ valid_refs_inv s"
unfolding valid_refs_inv_def valid_refs_def mut_m.reachable_def mut_m.tso_store_refs_def
using no_grey_refs_not_grey_reachableD by fastforce
lemma no_grey_refs_imp_valid_W_inv:
"⟦ no_grey_refs s; ∀p. sys_mem_store_buffers p s = [] ⟧
⟹ valid_W_inv s"
unfolding valid_W_inv_def no_grey_refs_def grey_def WL_def by auto
lemma valid_refs_imp_reachable_snapshot_inv:
"⟦ valid_refs s; obj_mark ` ran (sys_heap s) ⊆ {sys_fM s}; ∀p. sys_mem_store_buffers p s = []; ∀m. ghost_honorary_root (s (mutator m)) = {} ⟧
⟹ mut_m.reachable_snapshot_inv m s"
unfolding mut_m.reachable_snapshot_inv_def in_snapshot_def valid_refs_def black_def mut_m.reachable_def mut_m.tso_store_refs_def
apply clarsimp
apply (auto simp: image_subset_iff ran_def split: obj_at_splits)
done
lemma init_inv_sys: "∀s. initial_state gc_system s ⟶ invs ⦇GST = s, HST = []⦈↓"
apply (clarsimp dest!: initial_stateD
simp: gc_system_init_def invs_def gc_initial_state_def mut_initial_state_def sys_initial_state_def
inv
handshake_phase_rel_def handshake_phase_inv_def hp_step_rel_def phase_rel_inv_def phase_rel_def
tso_store_inv_def
init_no_grey_refs init_strong_tricolour_inv no_grey_refs_imp_valid_W_inv
valid_refs_imp_reachable_snapshot_inv
valid_refs_imp_valid_refs_inv
mut_m.marked_deletions_def mut_m.marked_insertions_def
fA_rel_inv_def fA_rel_def fM_rel_inv_def fM_rel_def
all_conj_distrib)
done
lemma init_inv_mut: "∀s. initial_state gc_system s ⟶ mut_m.invsL m ⦇GST = s, HST = []⦈"
apply (clarsimp dest!: initial_stateD)
apply (drule fun_cong[where x="mutator m"])
apply (clarsimp simp: all_com_interned_defs)
unfolding mut_m.invsL_def mut_m.mut_get_roots_mark_object_invL_def2 mut_m.mut_store_del_mark_object_invL_def2 mut_m.mut_store_ins_mark_object_invL_def2
mut_m.mark_object_invL_def mut_m.handshake_invL_def mut_m.tso_lock_invL_def
gc_system_init_def mut_initial_state_def sys_initial_state_def
apply (intro conjI; simp add: locset_cache atS_simps; simp add: mut_m.loc_defs)
done
lemma init_inv_gc: "∀s. initial_state gc_system s ⟶ gc.invsL ⦇GST = s, HST = []⦈"
apply (clarsimp dest!: initial_stateD)
apply (drule fun_cong[where x=gc])
apply (clarsimp simp: all_com_interned_defs)
unfolding gc.invsL_def gc.fM_fA_invL_def gc.handshake_invL_def gc.obj_fields_marked_invL_def gc.phase_invL_def gc.sweep_loop_invL_def
gc.tso_lock_invL_def gc.gc_W_empty_invL_def gc.gc_mark_mark_object_invL_def2
apply (intro conjI; simp add: locset_cache atS_simps init_no_grey_refs; simp add: gc.loc_defs)
apply (simp_all add: gc_system_init_def gc_initial_state_def mut_initial_state_def sys_initial_state_def
gc_system.init_no_grey_refs)
apply blast
apply (clarsimp simp: image_subset_iff ranI split: obj_at_splits)
done
end
definition I :: "('field, 'mut, 'payload, 'ref) gc_pred" where
"I = (invsL ❙∧ LSTP invs)"
lemmas I_defs = gc.invsL_def mut_m.invsL_def invsL_def invs_def I_def
context gc_system
begin
theorem init_inv: "∀s. initial_state gc_system s ⟶ I ⦇GST = s, HST = []⦈"
unfolding I_def invsL_def by (simp add: init_inv_sys init_inv_gc init_inv_mut)
end
end