Theory Read_Write_CSPM_Laws
chapter ‹CSPM Laws›
theory Read_Write_CSPM_Laws
imports Step_CSPM_Laws_Extended
begin
subsection ‹The Throw Operator›
lemma Throw_read :
‹inj_on c A ⟹ (c❙?a ∈ A → P a) Θ a ∈ B. Q a =
c❙?a ∈ A → (if c a ∈ B then Q (c a) else P a Θ a ∈ B. Q a)›
by (auto simp add: read_def Throw_Mprefix intro: mono_Mprefix_eq)
lemma Throw_ndet_write :
‹inj_on c A ⟹ (c❙!❙!a ∈ A → P a) Θ a ∈ B. Q a =
c❙!❙!a ∈ A → (if c a ∈ B then Q (c a) else P a Θ a ∈ B. Q a)›
by (auto simp add: ndet_write_def Throw_Mndetprefix intro: mono_Mndetprefix_eq)
lemma Throw_write :
‹(c❙!a → P) Θ a ∈ B. Q a = c❙!a → (if c a ∈ B then Q (c a) else P Θ a ∈ B. Q a)›
by (auto simp add: write_def Throw_Mprefix intro: mono_Mprefix_eq)
lemma Throw_write0 :
‹(a → P) Θ a ∈ B. Q a = a → (if a ∈ B then Q a else P Θ a ∈ B. Q a)›
by (auto simp add: write0_def Throw_Mprefix intro: mono_Mprefix_eq)
subsection ‹The Interrupt Operator›
lemma Interrupt_read :
‹(c❙?a ∈ A → P a) △ Q = Q □ (c❙?a ∈ A → P a △ Q)›
by (auto simp add: read_def Interrupt_Mprefix
intro!: mono_Mprefix_eq arg_cong[where f = ‹λP. Q □ P›])
lemma Interrupt_ndet_write :
‹(c❙!❙!a ∈ A → P a) △ Q = Q □ (c❙!❙!a ∈ A → P a △ Q)›
by (auto simp add: ndet_write_def Interrupt_Mndetprefix
intro!: mono_Mndetprefix_eq arg_cong[where f = ‹λP. Q □ P›])
lemma Interrupt_write : ‹(c❙!a → P) △ Q = Q □ (c❙!a → P △ Q)›
by (auto simp add: write_def Interrupt_Mprefix intro: mono_Mprefix_eq)
lemma Interrupt_write0 : ‹(a → P) △ Q = Q □ (a → P △ Q)›
by (auto simp add: write0_def Interrupt_Mprefix intro: mono_Mprefix_eq)
subsection ‹Global Deterministic Choice›
lemma GlobalDet_read :
‹□a ∈ A. c❙?b ∈ B a → P a b = c❙?b ∈ (⋃a∈A. B a) → ⊓a∈{a ∈ A. b ∈ B a}. P a b›
if ‹inj_on c (⋃a∈A. B a)›
proof -
have * : ‹a ∈ A ⟹ b ∈ B a ⟹
{a ∈ A. inv_into (⋃ (B ` A)) c (c b) ∈ B a} = {a ∈ A. c b ∈ c ` B a}› for a b
by (metis (no_types, opaque_lifting) SUP_upper UN_iff
inj_on_image_mem_iff inv_into_f_eq ‹inj_on c (⋃a∈A. B a)›)
have ‹□a ∈ A. c❙?b ∈ B a → P a b =
□b∈(⋃x∈A. c ` B x) → ⊓a∈{a ∈ A. b ∈ c ` B a}. P a (inv_into (B a) c b)›
by (simp add: read_def GlobalDet_Mprefix)
also have ‹(⋃x∈A. c ` B x) = c ` (⋃a∈A. B a)› by blast
finally show ‹□a ∈ A. c❙?b ∈ B a → P a b = c❙?b ∈ (⋃a∈A. B a) → ⊓a∈{a ∈ A. b ∈ B a}. P a b›
by (auto simp add: read_def "*" intro!: mono_Mprefix_eq mono_GlobalNdet_eq)
(metis (lifting) SUP_upper UN_I inv_into_f_eq subset_inj_on ‹inj_on c (⋃a∈A. B a)›)
qed
lemma GlobalDet_write :
‹□a ∈ A. c❙!(b a) → P a = c❙?x ∈ b ` A → ⊓a∈{a ∈ A. x = b a}. P a› if ‹inj_on c (b ` A)›
proof -
from ‹inj_on c (b ` A)› have * : ‹x ∈ A ⟹ {a ∈ A. inv_into (b ` A) c (c (b x)) = b a} =
{a ∈ A. c (b x) = c (b a)}› for x
by (auto simp add: inj_on_eq_iff)
have ‹□a ∈ A. c❙!(b a) → P a = □x∈(⋃a∈A. {c (b a)}) → GlobalNdet {a ∈ A. x = c (b a)} P›
by (simp add: write_def GlobalDet_Mprefix)
also have ‹(⋃a∈A. {c (b a)}) = c ` b ` A› by blast
finally show ‹□a ∈ A. c❙!(b a) → P a = c❙?x ∈ b ` A → ⊓a∈{a ∈ A. x = b a}. P a›
by (auto simp add: read_def "*" intro: mono_Mprefix_eq)
qed
lemma GlobalDet_write0 :
‹□a∈A. b a → P a = □x ∈ (b ` A) → ⊓a ∈ {a ∈ A. x = b a}. P a›
by (auto simp add: GlobalDet_write[where c = ‹λx. x›, simplified write_is_write0] read_def
intro!: mono_Mprefix_eq) (metis (lifting) f_inv_into_f image_eqI)
subsection ‹Multiple Synchronization Product›
end