Theory Choices_Non_Destructive
section ‹Non Destructiveness of Choices›
theory Choices_Non_Destructive
imports Process_Restriction_Space "HOL-CSPM.CSPM_Laws"
begin
subsection ‹Equality›
lemma restriction_process⇩p⇩t⇩i⇩c⇩k_Ndet : ‹P ⊓ Q ↓ n = (P ↓ n) ⊓ (Q ↓ n)›
by (auto simp add: Process_eq_spec Ndet_projs restriction_process⇩p⇩t⇩i⇩c⇩k_projs)
lemma restriction_process⇩p⇩t⇩i⇩c⇩k_GlobalNdet :
‹(⊓a ∈ A. P a) ↓ n = (if n = 0 then ⊥ else ⊓a ∈ A. (P a ↓ n))›
by simp (auto simp add: Process_eq_spec GlobalNdet_projs restriction_process⇩p⇩t⇩i⇩c⇩k_projs)
lemma restriction_process⇩p⇩t⇩i⇩c⇩k_GlobalDet :
‹(□a ∈ A. P a) ↓ n = (if n = 0 then ⊥ else □a ∈ A. (P a ↓ n))›
(is ‹?lhs = (if n = 0 then ⊥ else ?rhs)›)
proof (split if_split, intro conjI impI)
show ‹n = 0 ⟹ ?lhs = ⊥› by simp
next
show ‹?lhs = ?rhs› if ‹n ≠ 0›
proof (rule Process_eq_optimized_bisI)
show ‹t ∈ 𝒟 ?lhs ⟹ t ∈ 𝒟 ?rhs› for t
by (auto simp add: GlobalDet_projs D_restriction_process⇩p⇩t⇩i⇩c⇩k ‹n ≠ 0› split: if_split_asm)
next
show ‹t ∈ 𝒟 ?rhs ⟹ t ∈ 𝒟 ?lhs› for t
by (auto simp add: GlobalDet_projs D_restriction_process⇩p⇩t⇩i⇩c⇩k)
next
show ‹([], X) ∈ ℱ ?lhs ⟹ ([], X) ∈ ℱ ?rhs› for X
by (auto simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_projs F_GlobalDet)
next
show ‹([], X) ∈ ℱ ?rhs ⟹ ([], X) ∈ ℱ ?lhs› for X
by (auto simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_projs F_GlobalDet)
(metis append_eq_Cons_conv event⇩p⇩t⇩i⇩c⇩k.disc(2) tickFree_Cons_iff)
next
show ‹(e # t, X) ∈ ℱ ?lhs ⟹ (e # t, X) ∈ ℱ ?rhs› for e t X
by (auto simp add: ‹n ≠ 0› F_restriction_process⇩p⇩t⇩i⇩c⇩k GlobalDet_projs split: if_split_asm)
next
show ‹(e # t, X) ∈ ℱ ?rhs ⟹ (e # t, X) ∈ ℱ ?lhs› for e t X
by (auto simp add: F_restriction_process⇩p⇩t⇩i⇩c⇩k GlobalDet_projs)
qed
qed
lemma restriction_process⇩p⇩t⇩i⇩c⇩k_Det: ‹P □ Q ↓ n = (P ↓ n) □ (Q ↓ n)› (is ‹?lhs = ?rhs›)
proof -
have ‹P □ Q ↓ n = □i ∈ {0, 1 :: nat}. (if i = 0 then P else Q) ↓ n›
by (simp add: GlobalDet_distrib_unit_bis)
also have ‹… = (if n = 0 then ⊥ else □i ∈ {0, 1 :: nat}. (if i = 0 then P ↓ n else Q ↓ n))›
by (simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_GlobalDet if_distrib if_distribR)
also have ‹… = (P ↓ n) □ (Q ↓ n)› by (simp add: GlobalDet_distrib_unit_bis)
finally show ‹P □ Q ↓ n = (P ↓ n) □ (Q ↓ n)› .
qed
corollary restriction_process⇩p⇩t⇩i⇩c⇩k_Sliding: ‹P ⊳ Q ↓ n = (P ↓ n) ⊳ (Q ↓ n)›
by (simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_Det restriction_process⇩p⇩t⇩i⇩c⇩k_Ndet Sliding_def)
subsection ‹Non Destructiveness›
lemma GlobalNdet_non_destructive : ‹non_destructive (λP. ⊓a ∈ A. P a)›
by (auto intro: non_destructiveI
simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_GlobalNdet restriction_fun_def)
lemma Ndet_non_destructive : ‹non_destructive (λ(P, Q). P ⊓ Q)›
by (auto intro: non_destructiveI
simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_Ndet restriction_prod_def)
lemma GlobalDet_non_destructive : ‹non_destructive (λP. □a ∈ A. P a)›
by (auto intro: non_destructiveI
simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_GlobalDet restriction_fun_def)
lemma Det_non_destructive : ‹non_destructive (λ(P, Q). P □ Q)›
by (auto intro: non_destructiveI
simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_Det restriction_prod_def)
corollary Sliding_non_destructive : ‹non_destructive (λ(P, Q). P ⊳ Q)›
by (auto intro: non_destructiveI
simp add: restriction_process⇩p⇩t⇩i⇩c⇩k_Sliding restriction_prod_def)
end