Theory Combining_Synchronization_Product_Generalized
chapter ‹Combining Automata for Generalized Synchronization Product›
theory Combining_Synchronization_Product_Generalized
imports Combining_Synchronization_Product
begin
section ‹Definitions›
subsection ‹Specializations›
definition combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ, 'e, 'r, 'α) A⇩d_scheme, 'e set, ('σ, 'e, 'r, 'β) A⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩d›
where ‹combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡
combine⇩d_Sync A⇩0 E A⇩1 hd (λσs. hd (tl σs)) (λs t. [s, t]) (λs t. ⌊[s, t]⌋)›
definition combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ, 'e, 'r, 'α) A⇩n⇩d_scheme, 'e set, ('σ, 'e, 'r, 'β) A⇩n⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩n⇩d›
where ‹combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡ combine⇩n⇩d_Sync A⇩0 E A⇩1 hd (λσs. hd (tl σs)) (λs t. [s, t]) (λs t. ⌊[s, t]⌋)›
definition combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ⇩0, 'e, 'r⇩0, 'α) A⇩d_scheme, 'e set, ('σ⇩1, 'e, 'r⇩1, 'β) A⇩d_scheme] ⇒ ('σ⇩0 × 'σ⇩1, 'e, 'r⇩0 × 'r⇩1) A⇩d›
where ‹combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡ combine⇩d_Sync A⇩0 E A⇩1 fst snd Pair (λs r. ⌊(s, r)⌋)›
definition combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ⇩0, 'e, 'r⇩0, 'α) A⇩n⇩d_scheme, 'e set, ('σ⇩1, 'e, 'r⇩1, 'β) A⇩n⇩d_scheme] ⇒ ('σ⇩0 × 'σ⇩1, 'e, 'r⇩0 × 'r⇩1) A⇩n⇩d›
where ‹combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡ combine⇩n⇩d_Sync A⇩0 E A⇩1 fst snd Pair (λs r. ⌊(s, r)⌋)›
definition combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ list, 'e, 'r list, 'α) A⇩d_scheme, nat, 'e set, ('σ list, 'e, 'r list, 'β) A⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩d›
where ‹combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 len⇩0 E A⇩1 ≡ combine⇩d_Sync A⇩0 E A⇩1 (take len⇩0) (drop len⇩0) (@) (λs r. ⌊s @ r⌋)›
definition combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ list, 'e, 'r list, 'α) A⇩n⇩d_scheme, nat, 'e set, ('σ list, 'e, 'r list, 'β) A⇩n⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩n⇩d›
where ‹combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 len⇩0 E A⇩1 ≡ combine⇩n⇩d_Sync A⇩0 E A⇩1 (take len⇩0) (drop len⇩0) (@) (λs r. ⌊s @ r⌋)›
definition combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ, 'e, 'r, 'α) A⇩d_scheme, 'e set, ('σ list, 'e, 'r list, 'β) A⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩d›
where ‹combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡ combine⇩d_Sync A⇩0 E A⇩1 hd tl (#) (λs r. ⌊s # r⌋)›
definition combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k ::
‹[('σ, 'e, 'r, 'α) A⇩n⇩d_scheme, 'e set, ('σ list, 'e, 'r list, 'β) A⇩n⇩d_scheme] ⇒ ('σ list, 'e, 'r list) A⇩n⇩d›
where ‹combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k A⇩0 E A⇩1 ≡ combine⇩n⇩d_Sync A⇩0 E A⇩1 hd tl (#) (λs r. ⌊s # r⌋)›
lemmas combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs = combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def
and combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs = combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_def
and combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs = combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_def
and combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs = combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def
lemmas combine_Sync⇩p⇩t⇩i⇩c⇩k_defs =
combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs
bundle combine⇩n⇩d_Sync⇩p⇩t⇩i⇩c⇩k_syntax begin
notation combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩d⊗⟦_⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t _⟫› [0, 0, 0])
notation combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩n⇩d⊗⟦_⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t _⟫› [0, 0, 0])
notation combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩d⊗⟦_⟧⇩✓⇩P⇩a⇩i⇩r _⟫› [0, 0, 0])
notation combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩n⇩d⊗⟦_⟧⇩✓⇩P⇩a⇩i⇩r _⟫› [0, 0, 0])
notation combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩d⊗⟦_, _⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L _⟫› [0, 0, 0, 0])
notation combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩n⇩d⊗⟦_, _⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L _⟫› [0, 0, 0, 0])
notation combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩d⊗⟦_⟧⇩✓⇩R⇩l⇩i⇩s⇩t _⟫› [0, 0, 0])
notation combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k (‹⟪_ ⇩n⇩d⊗⟦_⟧⇩✓⇩R⇩l⇩i⇩s⇩t _⟫› [0, 0, 0])
end
unbundle combine⇩n⇩d_Sync⇩p⇩t⇩i⇩c⇩k_syntax
section ‹First Properties›
lemma finite_trans_combine⇩n⇩d_Sync⇩p⇩t⇩i⇩c⇩k_simps [simp] :
‹finite_trans A⇩0 ⟹ finite_trans A⇩1 ⟹ finite_trans ⟪A⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫›
‹finite_trans B⇩0 ⟹ finite_trans B⇩1 ⟹ finite_trans ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r B⇩1⟫›
‹finite_trans C⇩0 ⟹ finite_trans C⇩1 ⟹ finite_trans ⟪C⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L C⇩1⟫›
‹finite_trans D⇩0 ⟹ finite_trans D⇩1 ⟹ finite_trans ⟪D⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t D⇩1⟫›
unfolding combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_def combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_def
by (simp_all add: finite_trans_def finite_image_set2)
lemma ε_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k:
‹ε ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫ σs = combine_Sync_ε A⇩0 E A⇩1 hd (hd ∘ tl) σs›
‹ε ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t B⇩1⟫ σs = combine_Sync_ε B⇩0 E B⇩1 hd (hd ∘ tl) σs›
by (auto simp add: combine_Sync_ε_def_bis combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs ε_simps)
lemma ε_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k:
‹ε ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫ σs = combine_Sync_ε A⇩0 E A⇩1 fst snd σs›
‹ε ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r B⇩1⟫ σs = combine_Sync_ε B⇩0 E B⇩1 fst snd σs›
by (auto simp add: combine_Sync_ε_def_bis combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs ε_simps)
lemma ε_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k:
‹ε ⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫ σs = combine_Sync_ε A⇩0 E A⇩1 (take len⇩0) (drop len⇩0) σs›
‹ε ⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫ σs = combine_Sync_ε B⇩0 E B⇩1 (take len⇩0) (drop len⇩0) σs›
by (auto simp add: combine_Sync_ε_def_bis combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs ε_simps)
lemma ε_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k:
‹ε ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫ σs = combine_Sync_ε A⇩0 E A⇩1 hd tl σs›
‹ε ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t B⇩1⟫ σs = combine_Sync_ε B⇩0 E B⇩1 hd tl σs›
by (auto simp add: combine_Sync_ε_def_bis combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs ε_simps)
lemma ρ_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k:
‹ρ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫ = {σs. hd σs ∈ ρ A⇩0 ∧ hd (tl σs) ∈ ρ A⇩1}›
‹ρ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t B⇩1⟫ = {σs. hd σs ∈ ρ B⇩0 ∧ hd (tl σs) ∈ ρ B⇩1}›
by (auto simp add: combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs ρ_simps split: option.split)
lemma ρ_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k:
‹ρ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫ = {(σ⇩0, σ⇩1). σ⇩0 ∈ ρ A⇩0 ∧ σ⇩1 ∈ ρ A⇩1}›
‹ρ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r B⇩1⟫ = {(σ⇩0, σ⇩1). σ⇩0 ∈ ρ B⇩0 ∧ σ⇩1 ∈ ρ B⇩1}›
by (auto simp add: combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs ρ_simps split: option.split)
lemma ρ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k:
‹ρ ⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫ = {σs. take len⇩0 σs ∈ ρ A⇩0 ∧ drop len⇩0 σs ∈ ρ A⇩1}›
‹ρ ⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫ = {σs. take len⇩0 σs ∈ ρ B⇩0 ∧ drop len⇩0 σs ∈ ρ B⇩1}›
by (auto simp add: combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs ρ_simps split: option.split)
lemma ρ_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k:
‹ρ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫ = {σs. hd σs ∈ ρ A⇩0 ∧ tl σs ∈ ρ A⇩1}›
‹ρ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t B⇩1⟫ = {σs. hd σs ∈ ρ B⇩0 ∧ tl σs ∈ ρ B⇩1}›
by (auto simp add: combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs ρ_simps split: option.split)
section ‹Transitions are unchanged in the Generalization›
text ‹
In the generalization, only the \<^const>‹ω› function is modified.
›
lemma τ_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k :
‹τ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫ = τ ⟪A⇩0 ⇩d⊗⟦E⟧⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫›
‹τ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t B⇩1⟫ = τ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t B⇩1⟫›
by (simp_all add: combine_Sync_defs combine_Sync⇩p⇩t⇩i⇩c⇩k_defs)
lemma τ_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k :
‹τ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫ = τ ⟪A⇩0 ⇩d⊗⟦E⟧⇩P⇩a⇩i⇩r A⇩1⟫›
‹τ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r B⇩1⟫ = τ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩P⇩a⇩i⇩r B⇩1⟫›
by (simp_all add: combine_Sync_defs combine_Sync⇩p⇩t⇩i⇩c⇩k_defs)
lemma τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k :
‹τ ⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫ = τ ⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫›
‹τ ⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫ = τ ⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫›
by (simp_all add: combine_Sync_defs combine_Sync⇩p⇩t⇩i⇩c⇩k_defs)
text ‹
\<^term>‹τ ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫› and \<^term>‹τ ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t B⇩1⟫›
cannot be obtained that easily because of the types of terminations.›
section ‹Reachability›
lemma ℛ⇩d_combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩d ⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫ (s⇩0 @ s⇩1) ⊆ {t⇩0 @ t⇩1| t⇩0 t⇩1. t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩d A⇩1 s⇩1}› (is ‹?S⇩A ⊆ _›)
if ‹⋀t⇩0. t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ⟹ length t⇩0 = len⇩0›
by (subst same_τ_implies_same_ℛ⇩d[of _ _ ‹⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫›])
(simp_all add: τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k ℛ⇩d_combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync_subset that)
lemma ℛ⇩n⇩d_combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩n⇩d ⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫ (s⇩0 @ s⇩1) ⊆ {t⇩0 @ t⇩1| t⇩0 t⇩1. t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩n⇩d B⇩1 s⇩1}› (is ‹?S⇩B ⊆ _›)
if ‹⋀t⇩0. t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ⟹ length t⇩0 = len⇩0›
by (subst same_τ_implies_same_ℛ⇩n⇩d[of _ _ ‹⟪B⇩0 ⇩n⇩d⊗⟦len⇩0, E⟧⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L B⇩1⟫›])
(simp_all add: τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k ℛ⇩n⇩d_combine⇩n⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync_subset that)
lemma ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩d ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫ [s⇩0, s⇩1] ⊆ {[t⇩0, t⇩1]| t⇩0 t⇩1. t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩d A⇩1 s⇩1}› (is ‹?S⇩A ⊆ _›)
and ℛ⇩n⇩d_combine⇩n⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩n⇩d ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t B⇩1⟫ [s⇩0, s⇩1] ⊆ {[t⇩0, t⇩1]| t⇩0 t⇩1. t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩n⇩d B⇩1 s⇩1}› (is ‹?S⇩B ⊆ _›)
proof safe
show ‹t ∈ ?S⇩A ⟹ ∃t⇩0 t⇩1. t = [t⇩0, t⇩1] ∧ t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩d A⇩1 s⇩1› for t
by (ℛ⇩d_subset_method defs: combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs)
show ‹t ∈ ?S⇩B ⟹ ∃t⇩0 t⇩1. t = [t⇩0, t⇩1] ∧ t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ t⇩1 ∈ ℛ⇩n⇩d B⇩1 s⇩1› for t
by (ℛ⇩n⇩d_subset_method defs: combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs)
qed
lemma ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩d ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫ (s⇩0, s⇩1) ⊆ ℛ⇩d A⇩0 s⇩0 × ℛ⇩d A⇩1 s⇩1› (is ‹?S⇩A ⊆ _›)
and ℛ⇩n⇩d_combine⇩n⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩n⇩d ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r B⇩1⟫ (s⇩0, s⇩1) ⊆ ℛ⇩n⇩d B⇩0 s⇩0 × ℛ⇩n⇩d B⇩1 s⇩1› (is ‹?S⇩B ⊆ _›)
proof -
have ‹t ∈ ?S⇩A ⟹ fst t ∈ ℛ⇩d A⇩0 s⇩0 ∧ snd t ∈ ℛ⇩d A⇩1 s⇩1› for t
by (ℛ⇩d_subset_method defs: combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs)
thus ‹?S⇩A ⊆ ℛ⇩d A⇩0 s⇩0 × ℛ⇩d A⇩1 s⇩1› by force
next
have ‹t ∈ ?S⇩B ⟹ fst t ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ snd t ∈ ℛ⇩n⇩d B⇩1 s⇩1› for t
by (ℛ⇩n⇩d_subset_method defs: combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs)
thus ‹?S⇩B ⊆ ℛ⇩n⇩d B⇩0 s⇩0 × ℛ⇩n⇩d B⇩1 s⇩1› by force
qed
lemma ℛ⇩d_combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩d ⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫ (s⇩0 # σs) ⊆ {t⇩0 # σt| t⇩0 σt. t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ∧ σt ∈ ℛ⇩d A⇩1 σs}› (is ‹?S⇩A ⊆ _›)
and ℛ⇩n⇩d_combine⇩n⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset:
‹ℛ⇩n⇩d ⟪B⇩0 ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t B⇩1⟫ (s⇩0 # σs) ⊆ {t⇩0 # σt| t⇩0 σt. t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ σt ∈ ℛ⇩n⇩d B⇩1 σs}› (is ‹?S⇩B ⊆ _›)
proof safe
show ‹t ∈ ?S⇩A ⟹ ∃t⇩0 σt. t = t⇩0 # σt ∧ t⇩0 ∈ ℛ⇩d A⇩0 s⇩0 ∧ σt ∈ ℛ⇩d A⇩1 σs› for t
by (ℛ⇩d_subset_method defs: combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs)
next
show ‹t ∈ ?S⇩B ⟹ ∃t⇩0 σt. t = t⇩0 # σt ∧ t⇩0 ∈ ℛ⇩n⇩d B⇩0 s⇩0 ∧ σt ∈ ℛ⇩n⇩d B⇩1 σs› for t
by (ℛ⇩n⇩d_subset_method defs: combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs)
qed
section ‹Normalization›
lemma ω_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour:
‹ω ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d⇩↪⇩n⇩d [s⇩0, s⇩1] = ω ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ [s⇩0, s⇩1]›
by (simp add: combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if)
lemma ω_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour:
‹ω ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫⟫⇩d⇩↪⇩n⇩d (s⇩0, s⇩1) = ω ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (s⇩0, s⇩1)›
by (simp add: combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if)
lemma ω_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour:
‹ω ⟪⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫⟫⇩d⇩↪⇩n⇩d (σs⇩0 @ σs⇩1) = ω ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (σs⇩0 @ σs⇩1)›
by (simp add: combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if)
lemma ω_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour:
‹ω ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d⇩↪⇩n⇩d (s⇩0 # σs⇩1) = ω ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (s⇩0 # σs⇩1)›
by (simp add: combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if)
lemma τ_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹ε A⇩0 s⇩0 ∩ ε A⇩1 s⇩1 ⊆ E ⟹
τ ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d⇩↪⇩n⇩d [s⇩0, s⇩1] e = τ ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ [s⇩0, s⇩1] e›
by (auto simp add: combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if ε_simps)
lemma τ_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹ε A⇩0 s⇩0 ∩ ε A⇩1 s⇩1 ⊆ E ⟹
τ ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫⟫⇩d⇩↪⇩n⇩d (s⇩0, s⇩1) e = τ ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (s⇩0, s⇩1) e›
by (auto simp add: combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if ε_simps)
lemma τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹ε A⇩0 σs⇩0 ∩ ε A⇩1 σs⇩1 ⊆ E ⟹ length σs⇩0 = len⇩0 ⟹
τ ⟪⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫⟫⇩d⇩↪⇩n⇩d (σs⇩0 @ σs⇩1) e = τ ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (σs⇩0 @ σs⇩1) e›
by (auto simp add: combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if ε_simps)
lemma τ_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹ε A⇩0 s⇩0 ∩ ε A⇩1 σs⇩1 ⊆ E ⟹
τ ⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d⇩↪⇩n⇩d (s⇩0 # σs⇩1) e = τ ⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫ (s⇩0 # σs⇩1) e›
by (auto simp add: combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_defs det_ndet_conv_defs option.case_eq_if ε_simps)
lemma P⇩S⇩K⇩I⇩P⇩S_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⇩S⇩K⇩I⇩P⇩S⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d [s⇩0, s⇩1] = P⇩S⇩K⇩I⇩P⇩S⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d [s⇩0, s⇩1]›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 s⇩1›
by (P⇩S⇩K⇩I⇩P⇩S_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp_all)
(metis τ_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that,
metis ω_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour)
lemma P_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d [s⇩0, s⇩1] = P⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d [s⇩0, s⇩1]›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 s⇩1›
by (P_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp_all)
(metis τ_combine⇩P⇩a⇩i⇩r⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that)
lemma P⇩S⇩K⇩I⇩P⇩S_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⇩S⇩K⇩I⇩P⇩S⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫⟫⇩d (s⇩0, s⇩1) = P⇩S⇩K⇩I⇩P⇩S⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (s⇩0, s⇩1)›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 s⇩1›
by (P⇩S⇩K⇩I⇩P⇩S_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_subset, all ‹elim SigmaE›)
(metis τ_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that,
auto simp add: ω_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour option.case_eq_if)
lemma P_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r A⇩1⟫⟫⇩d (s⇩0, s⇩1) = P⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩P⇩a⇩i⇩r ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (s⇩0, s⇩1)›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 s⇩1›
by (P_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_subset, elim SigmaE)
(metis τ_combine⇩P⇩a⇩i⇩r_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that)
lemma P⇩S⇩K⇩I⇩P⇩S_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⇩S⇩K⇩I⇩P⇩S⟪⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫⟫⇩d (σs⇩0 @ σs⇩1) = P⇩S⇩K⇩I⇩P⇩S⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (σs⇩0 @ σs⇩1)›
if ‹indep_enabl A⇩0 σs⇩0 E A⇩1 σs⇩1› and ‹⋀σt⇩0. σt⇩0 ∈ ℛ⇩d A⇩0 σs⇩0 ⟹ length σt⇩0 = len⇩0›
by (P⇩S⇩K⇩I⇩P⇩S_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp_all add: that(2))
(metis τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that,
metis ω_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour)
lemma P_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⟪⟪A⇩0 ⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L A⇩1⟫⟫⇩d (σs⇩0 @ σs⇩1) = P⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦len⇩0, E⟧⇩✓⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (σs⇩0 @ σs⇩1)›
if ‹indep_enabl A⇩0 σs⇩0 E A⇩1 σs⇩1› and ‹⋀σt⇩0. σt⇩0 ∈ ℛ⇩d A⇩0 σs⇩0 ⟹ length σt⇩0 = len⇩0›
by (P_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp_all add: that(2))
(metis τ_combine⇩L⇩i⇩s⇩t⇩s⇩l⇩e⇩n⇩L_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that)
lemma P⇩S⇩K⇩I⇩P⇩S_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⇩S⇩K⇩I⇩P⇩S⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d (s⇩0 # σs⇩1) = P⇩S⇩K⇩I⇩P⇩S⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (s⇩0 # σs⇩1)›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 σs⇩1›
by (P⇩S⇩K⇩I⇩P⇩S_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp_all)
(metis τ_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that,
metis ω_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour)
lemma P_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep:
‹P⟪⟪A⇩0 ⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t A⇩1⟫⟫⇩d (s⇩0 # σs⇩1) = P⟪⟪⟪A⇩0⟫⇩d⇩↪⇩n⇩d ⇩n⇩d⊗⟦E⟧⇩✓⇩R⇩l⇩i⇩s⇩t ⟪A⇩1⟫⇩d⇩↪⇩n⇩d⟫⟫⇩n⇩d (s⇩0 # σs⇩1)›
if ‹indep_enabl A⇩0 s⇩0 E A⇩1 σs⇩1›
by (P_when_indep_method R_d_subset: ℛ⇩d_combine⇩d⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_subset, simp)
(metis τ_combine⇩R⇩l⇩i⇩s⇩t_Sync⇩p⇩t⇩i⇩c⇩k_behaviour_when_indep indep_enablD that)
end