system_responds_actionE: fixes l :: "char list"   and action :: "'d process_name \<times> ('a, 'd, 'b, 'c) request_op \<Rightarrow> ('a, 'd, 'b, 'c) Model.local_state \<Rightarrow> (('a, 'd, 'b, 'c) Model.local_state \<times> ('a, 'b, 'c) response) set"   and afts :: "('a, 'd, 'b, 'c) Model.local_state \<Rightarrow> char list set"   and p :: "'d process_name"   and v :: "('a, 'd, 'b, 'c) Model.local_state \<times> ('a, 'b, 'c) response"   and x :: "'d process_name \<times> ('a, 'd, 'b, 'c) request_op"   and s :: "('a, 'd, 'b, 'c) Model.local_state" assumes "(\<lbrace>l\<rbrace> Response action, afts) \<in> fragments (gc_coms p) {}"   and "v \<in> action x s" obtains "p = sys" and "l = sys.sys_hs_mut_done \<and> action = (\<lambda>req s. {(s\<lparr>hs_pending := (hs_pending s)(m := False), W := W s \<union> W', ghost_hs_in_sync := (ghost_hs_in_sync s)(m := True)\<rparr>, mv_Void) |m W'. req = (mutator m, ro_hs_mut_done W')}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>m W'. v = (s\<lparr>hs_pending := (hs_pending s)(m := False), W := W s \<union> W', ghost_hs_in_sync := (ghost_hs_in_sync s)(m := True)\<rparr>, mv_Void) \<and> x = (mutator m, ro_hs_mut_done W')) \<or> l = sys.sys_hs_mut \<and> action = (\<lambda>req s. {uu_. uu_ = (s, mv_hs_type (hs_type s)) \<and> (\<exists>m. req = (mutator m, ro_hs_mut_load_type))}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> v = (s, mv_hs_type (hs_type s)) \<and> (\<exists>m. x = (mutator m, ro_hs_mut_load_type)) \<or> l = sys.sys_hs_mut_pending \<and> action = (\<lambda>req s. {(s, mv_Bool (hs_pending s m)) |m. req = (mutator m, ro_hs_mut_load_pending)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>m. v = (s, mv_Bool (hs_pending s m)) \<and> x = (mutator m, ro_hs_mut_load_pending)) \<or> l = sys.sys_hs_gc_load_W \<and> action = (\<lambda>req s. {uu_. uu_ = (s\<lparr>W := {}\<rparr>, mv_Refs (W s)) \<and> req = (gc, ro_hs_gc_load_W)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> v = (s\<lparr>W := {}\<rparr>, mv_Refs (W s)) \<and> x = (gc, ro_hs_gc_load_W) \<or> l = sys.sys_hs_gc_done \<and> action = (\<lambda>req s. {(s, mv_Bool (\<not> hs_pending s m)) |m. req = (gc, ro_hs_gc_load_pending m)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>m. v = (s, mv_Bool (\<not> hs_pending s m)) \<and> x = (gc, ro_hs_gc_load_pending m)) \<or> l = sys.sys_hs_gc_mut_reqs \<and> action = (\<lambda>req s. {(s\<lparr>hs_pending := (hs_pending s)(m := True)\<rparr>, mv_Void) |m. req = (gc, ro_hs_gc_store_pending m)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>m. v = (s\<lparr>hs_pending := (hs_pending s)(m := True)\<rparr>, mv_Void) \<and> x = (gc, ro_hs_gc_store_pending m)) \<or> l = sys.sys_hs_gc_set_type \<and> action = (\<lambda>req s. {(s\<lparr>hs_type := ht, ghost_hs_in_sync := \<lambda>s. False, ghost_hs_phase := hp_step ht (ghost_hs_phase s)\<rparr>, mv_Void) |ht. req = (gc, ro_hs_gc_store_type ht)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>ht. v = (s\<lparr>hs_type := ht, ghost_hs_in_sync := \<lambda>s. False, ghost_hs_phase := hp_step ht (ghost_hs_phase s)\<rparr>, mv_Void) \<and> x = (gc, ro_hs_gc_store_type ht)) \<or> l = sys.sys_free \<and> action = (\<lambda>req s. {(s\<lparr>heap := (heap s)(r := None)\<rparr>, mv_Void) |r. snd req = ro_Free r}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>r. v = (s\<lparr>heap := (heap s)(r := None)\<rparr>, mv_Void) \<and> snd x = ro_Free r) \<or> l = Proofs_Basis.sys.alloc \<and> action = (\<lambda>req s. if {a. \<exists>y. heap s a = Some y} = UNIV then {uu_. \<exists>_. uu_ = (s, mv_Ref None) \<and> snd req = ro_Alloc} else {(s\<lparr>heap := heap s(r \<mapsto> \<lparr>obj_mark = fA s, obj_fields = Map.empty, obj_payload = Map.empty\<rparr>)\<rparr>, mv_Ref (Some r)) |r. r \<notin> dom (heap s) \<and> snd req = ro_Alloc}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> v \<in> (if {a. \<exists>y. heap s a = Some y} = UNIV then {uu_. \<exists>_. uu_ = (s, mv_Ref None) \<and> snd x = ro_Alloc} else {(s\<lparr>heap := heap s(r \<mapsto> \<lparr>obj_mark = fA s, obj_fields = Map.empty, obj_payload = Map.empty\<rparr>)\<rparr>, mv_Ref (Some r)) |r. r \<notin> dom (heap s) \<and> snd x = ro_Alloc}) \<or> l = sys.tso_unlock \<and> action = (\<lambda>req s. {uu_. uu_ = (mem_lock_update Map.empty s, mv_Void) \<and> (\<exists>p. req = (p, ro_Unlock) \<and> mem_lock s = Some p \<and> mem_store_buffers s p = [])}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> v = (mem_lock_update Map.empty s, mv_Void) \<and> (\<exists>p. x = (p, ro_Unlock) \<and> mem_lock s = Some p \<and> mem_store_buffers s p = []) \<or> l = sys.tso_lock \<and> action = (\<lambda>req s. {(s\<lparr>mem_lock := Some p\<rparr>, mv_Void) |p. req = (p, ro_Lock) \<and> mem_lock s = None}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>p. v = (s\<lparr>mem_lock := Some p\<rparr>, mv_Void) \<and> x = (p, ro_Lock) \<and> mem_lock s = None) \<or> l = sys.tso_mfence \<and> action = (\<lambda>req s. {uu_. uu_ = (s, mv_Void) \<and> (\<exists>p. req = (p, ro_MFENCE) \<and> mem_store_buffers s p = [])}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> v = (s, mv_Void) \<and> (\<exists>p. x = (p, ro_MFENCE) \<and> mem_store_buffers s p = []) \<or> l = sys.tso_store \<and> action = (\<lambda>req s. {(s\<lparr>mem_store_buffers := (mem_store_buffers s)(p := mem_store_buffers s p @ [w])\<rparr>, mv_Void) |p w. req = (p, ro_Store w)}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>p w. v = (s\<lparr>mem_store_buffers := (mem_store_buffers s)(p := mem_store_buffers s p @ [w])\<rparr>, mv_Void) \<and> x = (p, ro_Store w)) \<or> l = sys.tso_load \<and> action = (\<lambda>req s. {(s, sys_load p mr s) |p mr. req = (p, ro_Load mr) \<and> not_blocked s p}) \<and> afts = lconst {sys.sys_hs_mut_done, sys.sys_hs_mut, sys.sys_hs_mut_pending, sys.sys_hs_gc_load_W, sys.sys_hs_gc_done, sys.sys_hs_gc_mut_reqs, sys.sys_hs_gc_set_type, sys.sys_free, Proofs_Basis.sys.alloc, sys.tso_dequeue_store_buffer, sys.tso_unlock, sys.tso_lock, sys.tso_mfence, sys.tso_store, sys.tso_load} \<and> (\<exists>p mr. v = (s, sys_load p mr s) \<and> x = (p, ro_Load mr) \<and> not_blocked s p)"