(*<*)
―‹ ********************************************************************
* Project : HOL-CSP - A Shallow Embedding of CSP in Isabelle/HOL
* Version : 2.0
*
* Author : Benoît Ballenghien, Safouan Taha, Burkhart Wolff, Lina Ye.
* (Based on HOL-CSP 1.0 by Haykal Tej and Burkhart Wolff)
*
* This file : Reference processes and properties
*
* Copyright (c) 2009 Université Paris-Sud, France
* Copyright (c) 2025 Université Paris-Saclay, France
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************› (*>*)
chapter‹CSP Assertions›
(*<*) theory CSP_Assertions imports Basic_CSP_Laws CSP_Monotonies Events_Ticks_CSP_Laws begin (*>*)
section‹Reference Processes›
definition DF :: ‹'a set ==> ('a, 'r) processptick› where‹DF A ≡ μ X. ⊓a∈A → X›
lemma DF_unfold : ‹DF A = ⊓a∈A → DF A› by (simp add: DF_def, rule trans, rule fix_eq, simp)
definition DFSKIPS :: ‹'a set ==> 'r set ==> ('a,'r) processptick› where‹DFSKIPS A R ≡ μ X. (⊓a ∈ A → X) ⊓ SKIPS R›
lemma DFSKIPS_unfold : ‹DFSKIPS A R = (⊓a ∈ A → DFSKIPS A R) ⊓ SKIPS R› by (simp add: DFSKIPS_def, rule trans, rule fix_eq, simp)
definition RUN :: ‹'a set ==> ('a,'r) processptick› where‹RUN A ≡ μ X. ◻x∈A → X›
lemma RUN_unfold : ‹RUN A = ◻a∈A → RUN A› by (simp add: RUN_def, rule trans, rule fix_eq, simp)
definition CHAOS :: ‹'a set ==> ('a,'r) processptick› where‹CHAOS A ≡ μ X. STOP ⊓ (◻a ∈ A → X)›
definition non_terminating :: ‹('a,'r) processptick==> bool› where‹non_terminating P ≡ RUN UNIV ⊑T P›
section‹Properties›
lemma DFSKIPS_FD_DF : ‹DFSKIPS A R ⊑FD DF A› proof (subst DFSKIPS_def, induct rule: fix_ind) show‹adm (λa. a ⊑FD DF A)›by simp next show‹⊥⊑FD DF A›by simp next show‹X ⊑FD DF A ==> (Λ X. (⊓a∈A → X) ⊓ SKIPS R)⋅X ⊑FD DF A›for X by (subst DF_unfold, simp)
(meson Ndet_FD_self_left mono_Mndetprefix_FD trans_FD) qed
lemma SKIPS_FD_SKIPS_iff : ‹SKIPS S ⊑FD SKIPS R ⟷ (if R = {} then S = {} else R ⊆ S)› by (auto simp add: failure_divergence_refine_def failure_refine_def
divergence_refine_def F_SKIPS D_SKIPS)
lemma SKIPS_F_SKIPS_iff : ‹SKIPS S ⊑F SKIPS R ⟷ (if R = {} then S = {} else R ⊆ S)› by (auto simp add: failure_refine_def F_SKIPS)
lemma SKIPS_T_SKIPS_iff : ‹SKIPS S ⊑T SKIPS R ⟷ (R ⊆ S)› by (auto simp add: trace_refine_def T_SKIPS subset_iff)
lemma DF_subset : ‹DF B ⊑FD DF A›if‹A ≠ {}›‹A ⊆ B›for A B :: ‹'a set› proof (subst DF_def, induct rule: fix_ind) show‹adm (λa. a ⊑FD DF A)›by simp next show‹⊥⊑FD DF A›by simp next show‹X ⊑FD DF A ==> (Λ X. ⊓b∈B → X)⋅X ⊑FD DF A›for X :: ‹('a, 'r) processptick› by (subst DF_unfold, simp)
(meson ‹A ≠ {}›‹A ⊆ B› Mndetprefix_FD_subset mono_Mndetprefix_FD trans_FD) qed
lemma DF_Univ_freeness : ‹A ≠ {} ==> DF A ⊑FD P ==> deadlock_free P› by (meson DF_subset deadlock_free_def subset_UNIV trans_FD)
lemma no_ticks_imp_tickFree_T : ‹🍋s(P) = {} ==> s ∈T P ==> tF s› by (simp add: ticks_of_def tickFree_def disjoint_iff image_iff)
(metis T_nonTickFree_imp_decomp eventptick.disc(2) split_list tickFree_Cons_iff tickFree_append_iff)
lemma events_of_DF : ‹α(DF A) = A› proof (intro subset_antisym subsetI) fix a assume‹a ∈ A› hence‹[ev a] ∈T (DF A)› by (subst DF_unfold) (auto simp add: T_Mndetprefix write0_def T_Mprefix) thus‹a ∈ α(DF A)›by (force simp add: events_of_def) next fix a assume‹a ∈ α((DF A) :: ('a, 'r) processptick)› thenobtain t :: ‹('a, 'r) traceptick›where‹ev a ∈ set t›‹t ∈T (DF A)› by (auto simp add: events_of_def) thus‹a ∈ A› by (induct t, simp, subst (asm) DF_unfold)
(auto simp add: T_Mndetprefix write0_def T_Mprefix split: if_split_asm) qed
lemma ticks_DF : ‹🍋s(DF A) = {}› proof (rule equals0I) fix r :: 'r assume‹r ∈🍋s(DF A)› thenobtain s where‹s @ [🍋(r)] ∈T (DF A)›unfolding ticks_of_def by blast thus False by (induct s; subst (asm) DF_unfold)
(simp_all add: T_Mndetprefix write0_def T_Mprefix split: if_split_asm) qed
lemma events_of_DFSKIPS : ‹α(DFSKIPS A R) = A› proof (intro subset_antisym subsetI) fix a assume‹a ∈ A› hence‹[ev a] ∈T (DFSKIPS A R)› by (subst DFSKIPS_unfold) (auto simp add: T_Ndet T_Mndetprefix write0_def T_Mprefix) thus‹a ∈ α(DFSKIPS A R)›by (force simp add: events_of_def) next fix a assume‹a ∈ α(DFSKIPS A R)› thenobtain t where‹ev a ∈ set t›‹t ∈T (DFSKIPS A R)› by (auto simp add: events_of_def) thus‹a ∈ A› by (induct t, simp, subst (asm) DFSKIPS_unfold)
(auto simp add: T_Ndet T_SKIPS T_Mndetprefix write0_def T_Mprefix split: if_split_asm) qed
lemma ticks_DFSKIPS : ‹🍋s(DFSKIPS A R) = R› proof (intro subset_antisym subsetI) fix r assume‹r ∈ R› hence‹[🍋(r)] ∈T (DFSKIPS A R)›by (subst DFSKIPS_unfold) (simp add: T_Ndet T_SKIPS) thus‹r ∈🍋s(DFSKIPS A R)› unfolding ticks_of_def by (metis (no_types, lifting) CollectI append_self_conv2) next fix r assume‹r ∈🍋s(DFSKIPS A R)› thenobtain s where‹s @ [🍋(r)] ∈T (DFSKIPS A R)›unfolding ticks_of_def by blast thus‹r ∈ R› by (induct s; subst (asm) DFSKIPS_unfold)
(simp_all add: T_Ndet T_SKIPS T_Mndetprefix write0_def T_Mprefix split: if_split_asm) qed
lemma events_of_RUN : ‹α(RUN A) = A› proof (intro subset_antisym subsetI) fix a assume‹a ∈ A› hence‹[ev a] ∈T (RUN A)› by (subst RUN_unfold) (auto simp add: T_Mprefix) thus‹a ∈ α(RUN A)›by (force simp add: events_of_def) next fix a assume‹a ∈ α((RUN A) :: ('a, 'r) processptick)› thenobtain t :: ‹('a, 'r) traceptick›where‹ev a ∈ set t›‹t ∈T (RUN A)› by (auto simp add: events_of_def) thus‹a ∈ A› by (induct t, simp, subst (asm) RUN_unfold) (auto simp add: T_Mprefix) qed
lemma ticks_RUN : ‹🍋s(RUN A) = {}› proof (rule equals0I) fix r :: 'r assume‹r ∈🍋s(RUN A)› thenobtain s where‹s @ [🍋(r)] ∈T (RUN A)›unfolding ticks_of_def by blast thus False by (induct s; subst (asm) RUN_unfold)
(auto simp add: T_Mprefix split: if_split_asm) qed
lemma events_of_CHAOS : ‹α(CHAOS A) = A› proof (intro subset_antisym subsetI) fix a assume‹a ∈ A› hence‹[ev a] ∈T (CHAOS A)› by (subst CHAOS_unfold) (auto simp add: T_Ndet T_Mprefix) thus‹a ∈ α(CHAOS A)›by (force simp add: events_of_def) next fix a assume‹a ∈ α((CHAOS A) :: ('a, 'r) processptick)› thenobtain t :: ‹('a, 'r) traceptick›where‹ev a ∈ set t›‹t ∈T (CHAOS A)› by (auto simp add: events_of_def) thus‹a ∈ A› by (induct t, simp, subst (asm) CHAOS_unfold) (auto simp add: T_Ndet T_STOP T_Mprefix) qed
lemma ticks_CHAOS : ‹🍋s(CHAOS A) = {}› proof (rule equals0I) fix r :: 'r assume‹r ∈🍋s(CHAOS A)› thenobtain s where‹s @ [🍋(r)] ∈T (CHAOS A)›unfolding ticks_of_def by blast thus False by (induct s; subst (asm) CHAOS_unfold)
(auto simp add: T_Ndet T_STOP T_Mprefix split: if_split_asm) qed
lemma events_of_CHAOSSKIPS : ‹α(CHAOSSKIPS A R) = A› proof (intro subset_antisym subsetI) fix a assume‹a ∈ A› hence‹[ev a] ∈T (CHAOSSKIPS A R)› by (subst CHAOSSKIPS_unfold) (auto simp add: T_Ndet T_Mprefix) thus‹a ∈ α(CHAOSSKIPS A R)›by (force simp add: events_of_def) next fix a assume‹a ∈ α(CHAOSSKIPS A R)› thenobtain t where‹ev a ∈ set t›‹t ∈T (CHAOSSKIPS A R)› by (auto simp add: events_of_def) thus‹a ∈ A› by (induct t, simp, subst (asm) CHAOSSKIPS_unfold)
(auto simp add: T_Ndet T_STOP T_SKIPS T_Mprefix) qed
lemma ticks_CHAOSSKIPS : ‹🍋s(CHAOSSKIPS A R) = R› proof (intro subset_antisym subsetI) fix r assume‹r ∈ R› hence‹[🍋(r)] ∈T (CHAOSSKIPS A R)›by (subst CHAOSSKIPS_unfold) (simp add: T_Ndet T_SKIPS) thus‹r ∈🍋s(CHAOSSKIPS A R)›by (metis append_Nil ticks_of_memI) next fix r assume‹r ∈🍋s(CHAOSSKIPS A R)› thenobtain s where‹s @ [🍋(r)] ∈T (CHAOSSKIPS A R)›unfolding ticks_of_def by blast thus‹r ∈ R› by (induct s; subst (asm) CHAOSSKIPS_unfold)
(auto simp add: T_Ndet T_STOP T_SKIPS T_Mprefix) qed
lemma RUN_subset_DT: ‹RUN B ⊑DT RUN A› if‹A ⊆ B›for A B :: ‹'a set› proof (subst RUN_def, induct rule: fix_ind) show‹adm (λa. a ⊑DT RUN A)›by simp next show‹⊥⊑DT RUN A›by simp next show‹X ⊑DT RUN A ==> (Λ X. ◻b∈B → X)⋅X ⊑DT RUN A›for X :: ‹('a, 'r) processptick› by (subst RUN_unfold, simp)
(meson Mprefix_DT_subset mono_Mprefix_DT ‹A ⊆ B› trans_DT) qed
lemma CHAOS_subset_FD : ‹CHAOS B ⊑FD CHAOS A› if‹A ⊆ B›for A B :: ‹'a set› proof (subst CHAOS_def, induct rule: fix_ind) show‹adm (λa. a ⊑FD CHAOS A)›by simp next show‹⊥⊑FD CHAOS A›by simp next from‹A ⊆ B›show‹X ⊑FD CHAOS A ==> (Λ X. STOP ⊓ (◻b∈B → X))⋅X ⊑FD CHAOS A› for X :: ‹('a, 'r) processptick› by (subst CHAOS_unfold)
(auto simp add: refine_defs Mprefix_projs Ndet_projs F_STOP D_STOP) qed
lemma CHAOSSKIPS_subset_FD : ‹CHAOSSKIPS B S ⊑FD CHAOSSKIPS A R› if‹A ⊆ B›‹R ≠ {}›‹R ⊆ S› proof (subst CHAOSSKIPS_def, induct rule: fix_ind) show‹adm (λa. a ⊑FD CHAOSSKIPS A R)›by simp next show‹⊥⊑FD CHAOSSKIPS A R›by simp next from‹A ⊆ B›‹R ≠ {}›‹R ⊆ S› show‹X ⊑FD CHAOSSKIPS A R ==> (Λ X. SKIPS S ⊓ STOP ⊓ (◻a∈B → X))⋅X ⊑FD CHAOSSKIPSA R›for X by (subst CHAOSSKIPS_unfold)
(auto simp add: refine_defs Mprefix_projs Ndet_projs F_STOP D_STOP F_SKIPS D_SKIPS) qed
section‹Relations between refinements on reference processes›
lemma CHAOS_has_all_tickFree_failures : ‹tF s ==> {a. ev a ∈ set s} ⊆ A ==> (s, X) ∈F (CHAOS A)› proof (induct s) show‹([], X) ∈F (CHAOS A)› by (subst CHAOS_unfold) (simp add: F_Ndet F_STOP) next fix e s assume hyp : ‹tF s ==> {a. ev a ∈ set s} ⊆ A ==> (s, X) ∈F (CHAOS A)› assume prems : ‹tF (e # s)›‹{a. ev a ∈ set (e # s)} ⊆ A› from prems have‹tF s›‹{a. ev a ∈ set s} ⊆ A›by auto hence‹(s, X) ∈F (CHAOS A)›by (fact hyp) with prems show‹(e # s, X) ∈F (CHAOS A)› by (subst CHAOS_unfold, cases e) (auto simp add: F_Ndet F_Mprefix) qed
lemma CHAOSSKIPS_superset_events_of_ticks_of_leF : ‹CHAOSSKIPS A R ⊑F P›if‹α(P) ⊆ A›and‹🍋s(P) ⊆ R› proof (unfold failure_refine_def) have‹ftF s ==> set s ⊆ (∪t∈T P. set t) ==> (s, X) ∈F (CHAOSSKIPS A R)›for s X proof (induct s) show‹([], X) ∈F (CHAOSSKIPS A R)› by (subst CHAOSSKIPS_unfold) (simp add: F_Ndet F_STOP) next fix e s assume prems : ‹ftF (e # s)›‹set (e # s) ⊆∪ (set ` T P)› assume hyp : ‹ftF s ==> set s ⊆∪ (set ` T P) ==> (s, X) ∈F (CHAOSSKIPS A R)› show‹(e # s, X) ∈F (CHAOSSKIPS A R)› proof (cases e) fix a assume‹e = ev a› with prems(2) have‹a ∈ α(P)›by (auto simp add: events_of_def) with‹α(P) ⊆ A›have‹a ∈ A›by fast from prems have‹ftF s›‹set s ⊆∪ (set ` T P)› by auto (metis front_tickFree_Cons_iff front_tickFree_Nil) hence‹(s, X) ∈F (CHAOSSKIPS A R)›by (fact hyp) thus‹(e # s, X) ∈F (CHAOSSKIPS A R)› by (subst CHAOSSKIPS_unfold) (simp add: F_Ndet F_Mprefix ‹e = ev a›‹a ∈ A›) next fix r assume‹e = 🍋(r)› with prems(2) have‹r ∈🍋s(P)› by (simp add: ticks_of_def)
(metis T_imp_front_tickFree front_tickFree_Cons_iff front_tickFree_append_iff
in_set_conv_decomp non_tickFree_tick tickFree_Cons_iff tickFree_Nil) with‹🍋s(P) ⊆ R›have‹r ∈ R›by fast moreoverfrom‹e = 🍋(r)› prems(1) have‹s = []›by (simp add: front_tickFree_Cons_iff) ultimatelyshow‹(e # s, X) ∈F (CHAOSSKIPS A R)› by (subst CHAOSSKIPS_unfold) (auto simp add: F_Ndet F_SKIPS ‹e = 🍋(r)›) qed qed thus‹F P ⊆F (CHAOSSKIPS A R)›by (meson F_T F_imp_front_tickFree SUP_upper subrelI) qed
corollary CHAOSSKIPS_events_of_ticks_of_leF: ‹CHAOSSKIPS α(P) 🍋s(P) ⊑F P› and CHAOSSKIPS_UNIV_UNIV_leF: ‹CHAOSSKIPS UNIV UNIV ⊑F P› by (simp_all add: CHAOSSKIPS_superset_events_of_ticks_of_leF)
lemma DFSKIPS_F_DF : ‹DFSKIPS A R ⊑F DF A› by (simp add: DFSKIPS_FD_DF leFD_imp_leF)
lemma DF_F_RUN : ‹DF A ⊑F RUN A›for A :: ‹'a set› proof (unfold DF_def, induct rule: fix_ind) show‹adm (λa. a ⊑F RUN A)›by simp next show‹⊥⊑F RUN A›by simp next show‹X ⊑F RUN A ==> (Λ X. ⊓a∈A → X)⋅X ⊑F RUN A›for X :: ‹('a, 'r) processptick› by (subst RUN_unfold, simp)
(meson Mndetprefix_F_Mprefix mono_Mprefix_F trans_F) qed
lemma CHAOS_F_DF : ‹CHAOS A ⊑F DF A› proof (unfold failure_refine_def, safe, rule CHAOS_has_all_tickFree_failures) show‹(s, X) ∈F (DF A) ==> tF s›for s :: ‹('a, 'r) traceptick›and X by (metis F_T no_ticks_imp_tickFree_T ticks_DF) next show‹(s, X) ∈F (DF A) ==> {a. ev a ∈ set s} ⊆ A›for s :: ‹('a, 'r) traceptick›and X by (drule F_T) (use events_of_DF[of A] in‹auto simp add: events_of_def›) qed
corollary CHAOSSKIPS_F_CHAOS : ‹CHAOSSKIPS A R ⊑F CHAOS A› and CHAOSSKIPS_F_DFSKIPS : ‹CHAOSSKIPS A R ⊑F DFSKIPS A R› by (rule CHAOSSKIPS_superset_events_of_ticks_of_leF;
simp add: events_of_CHAOS ticks_CHAOS events_of_DFSKIPS ticks_DFSKIPS)+
lemma div_free_CHAOSSKIPS: ‹D (CHAOSSKIPS A R) = {}› proof (rule equals0I) show‹s ∈D (CHAOSSKIPS A R) ==> False›for s by (induct s; subst (asm) CHAOSSKIPS_unfold)
(auto simp add: D_Ndet D_STOP D_SKIPS D_Mprefix) qed
lemma div_free_CHAOS: ‹D (CHAOS A) = {}› proof (rule equals0I) show‹s ∈D (CHAOS A) ==> False›for s :: ‹('a, 'r) traceptick› by (induct s; subst (asm) CHAOS_unfold)
(auto simp add: D_Ndet D_STOP D_Mprefix) qed
lemma div_free_RUN: ‹D (RUN A) = {}› proof (rule equals0I) show‹s ∈D (RUN A) ==> False›for s :: ‹('a, 'r) traceptick› by (induct s; subst (asm) RUN_unfold) (auto simp add: D_Mprefix) qed
(* DF\<^sub>S\<^sub>K\<^sub>I\<^sub>P\<^sub>S_FD_DF : "DF\<^sub>S\<^sub>K\<^sub>I\<^sub>P\<^sub>S A R \<sqsubseteq>\<^sub>F\<^sub>D DF A" *)
corollary DF_FD_RUN : ‹DF A ⊑FD RUN A› and CHAOS_FD_DF : ‹CHAOS A ⊑FD DF A› and CHAOSSKIPS_FD_CHAOS : ‹CHAOSSKIPS A R ⊑FD CHAOS A› and CHAOSSKIPS_FD_DFSKIPS : ‹CHAOSSKIPS A R ⊑FD DFSKIPS A R› by (simp_all add: DF_F_RUN div_free_RUN CHAOS_F_DF div_free_DF CHAOSSKIPS_F_CHAOS div_free_CHAOS
CHAOSSKIPS_F_DFSKIPS div_free_DFSKIPS divergence_refine_def leF_leD_imp_leFD)
lemma traces_CHAOS_subset : ‹T (CHAOS A) ⊆ {s. set s ⊆ ev ` A}› proof (rule subsetI) show‹s ∈T (CHAOS A) ==> s ∈ {s. set s ⊆ ev ` A}›for s :: ‹('a, 'r) traceptick› by (induct s; subst (asm) CHAOS_unfold) (auto simp add: T_Ndet T_STOP T_Mprefix) qed
lemma traces_RUN_superset : ‹{s. set s ⊆ ev ` A} ⊆T (RUN A)› proof (rule subsetI) show‹s ∈ {s. set s ⊆ ev ` A} ==> s ∈T (RUN A)›for s :: ‹('a, 'r) traceptick› by (induct s, simp) (subst RUN_unfold, auto simp add: T_Mprefix) qed
corollary RUN_all_tickfree_traces1 : ‹T (RUN A) = {s. set s ⊆ ev ` A}› and DF_all_tickfree_traces1 : ‹T (DF A) = {s. set s ⊆ ev ` A}› and CHAOS_all_tickfree_traces1 : ‹T (CHAOS A) = {s. set s ⊆ ev ` A}› using DF_F_RUN[THEN leF_imp_leT, simplified trace_refine_def]
CHAOS_F_DF[THEN leF_imp_leT,simplified trace_refine_def]
traces_CHAOS_subset traces_RUN_superset by blast+
lemma traces_CHAOSSKIPS_subset : ‹T (CHAOSSKIPS A R) ⊆ {s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R}› proof (rule subsetI) show‹s ∈T (CHAOSSKIPS A R) ==> s ∈ {s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R}›for s by (induct s; subst (asm) CHAOSSKIPS_unfold)
(auto simp add: T_Ndet T_STOP T_SKIPS T_Mprefix front_tickFree_Cons_iff) qed
lemma traces_DFSKIPS_superset : ‹{s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R} ⊆T (DFSKIPS A R)› proof (rule subsetI) show‹s ∈ {s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R} ==> s ∈T (DFSKIPS A R) ›for s by (induct s; subst DFSKIPS_unfold)
(auto simp add: T_Ndet T_SKIPS T_Mndetprefix write0_def T_Mprefix front_tickFree_Cons_iff) qed
corollary DFSKIPS_all_front_tickfree_traces1: ‹T (DFSKIPS A R) = {s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R}› and CHAOSSKIPS_all_front_tickfree_traces1: ‹T (CHAOSSKIPS A R) = {s. ftF s ∧ set s ⊆ ev ` A ∪ tick ` R}› using CHAOSSKIPS_F_DFSKIPS[THEN leF_imp_leT, simplified trace_refine_def]
traces_CHAOSSKIPS_subset traces_DFSKIPS_supersetby blast+
lemma deadlock_free_implies_lifelock_free: ‹deadlock_free P ==> lifelock_free P› unfolding deadlock_free_def lifelock_free_def using CHAOS_FD_DF trans_FD by blast
lemma deadlock_free_implies_non_terminating: ‹tF s›if‹deadlock_free P›‹s ∈T P› proof - from‹deadlock_free P›have‹T P ⊆T (DF UNIV)› by (simp add: deadlock_free_def le_ref2T) with‹s ∈T P›show‹tF s› by (meson no_ticks_imp_tickFree_T subsetD ticks_DF) qed
lemma deadlock_freeSKIPS_is_right: ‹deadlock_freeSKIPS (P :: ('a, 'r) processptick) ⟷
(∀s∈T P. tF s ⟶ (s, UNIV :: ('a, 'r) eventptick set) ∉F P)› proof (intro iffI ballI impI) have‹tF s ==> (s, UNIV) ∉F (DFSKIPS UNIV UNIV)›for s :: ‹('a, 'r) eventptick list› by (induct s; subst DFSKIPS_unfold)
(auto simp add: F_Ndet F_SKIPS F_Mndetprefix write0_def F_Mprefix) thus‹deadlock_freeSKIPS P ==> s ∈T P ==> tF s ==> (s, UNIV) ∉F P›for s using deadlock_freeSKIPS_def failure_refine_def by blast next assume as1 : ‹∀s∈T P. tF s ⟶ (s, UNIV) ∉F P› have as2 : ‹ftF s ==> (∃a ∈ UNIV. ev a ∉ X) ==>
(s, X) ∈F (DFSKIPS UNIV UNIV)›for s :: ‹('a, 'r) traceptick›and X proof(induct s) case Nil thenshow ?case by (subst DFSKIPS_unfold, auto simp add:F_Mndetprefix write0_def F_Mprefix F_Ndet F_SKIP) next case (Cons hds tls) thenshow ?case proof (simp add: DFSKIPS_def fix_def)
define Y where"Y ≡ λi. iterate i⋅(Λ x. (⊓xa∈(UNIV :: 'a set) → x) ⊓ SKIPS (UNIV :: 'r set))⋅⊥" assume a:"ftF (hds # tls)"and b:"ftF tls ==> (tls, X) ∈F (⊔i. Y i)" and c:"∃a. ev a ∉ X" from Y_def have cc:"chain Y"by simp from b have d:"ftF tls ==>∃a∈UNIV. ev a ∉ X ==>(tls, X) ∈F (Y i)"for i using F_LUB[OF cc] limproc_is_thelub[OF cc] by simp from Y_def have e:"F(Mndetprefix UNIV (λx. Y i) ⊓ SKIPS UNIV) ⊆F (Y (Suc i))"for i by(simp) from a have f:"tls ≠ [] ==> hds ∉ range tick""ftF tls" by (metis eventptick.disc(2) front_tickFree_Cons_iff imageE)
(metis a front_tickFree_Cons_iff front_tickFree_Nil) have g:"(hds#tls, X) ∈F (Y (Suc i))"for i using f c e[of i] d[of i] by (auto simp: F_Mndetprefix write0_def F_Mprefix Y_def F_Ndet F_SKIPS image_iff)
(meson eventptick.exhaust)+ have h:"(hds#tls, X) ∈F (Y 0)" using D_F cc g po_class.chainE proc_ord2a by blast from a b c show"(hds#tls, X) ∈F (⊔i. Y i)" using F_LUB[OF cc] is_ub_thelub[OF cc] by (metis D_LUB_2 cc g limproc_is_thelub po_class.chainE proc_ord2a process_charn) qed qed show"deadlock_freeSKIPS P" proof(unfold deadlock_freeSKIPS_def failure_refine_def, safe) fix s X assume as3:"(s, X) ∈F P" hence a1:"s ∈T P""ftF s" using F_T as3 is_processT2 by blast+ show"(s, X) ∈F (DFSKIPS UNIV UNIV)" proof(cases "tF s") case FT_True:True hence a2:"(s, UNIV) ∉F P" using a1 as1 by blast thenshow ?thesis by (metis DFSKIPS_all_front_tickfree_traces2 FT_True UNIV_I UNIV_eq_I a1(2) as2 as3
eventptick.exhaust is_processT6_TR_notin tickFree_imp_front_tickFree_snoc) next case FT_False: False thenshow ?thesis by (metis DFSKIPS_all_front_tickfree_traces2 a1(2) front_tickFree_append_iff
is_processT2_TR is_processT5_S7 list.distinct(1)) qed qed qed
lemma deadlock_freeSKIPS_implies_div_free: ‹deadlock_freeSKIPS P ==>D P = {}› by (metis D_T D_imp_front_tickFree T_nonTickFree_imp_decomp all_not_in_conv butlast_snoc
deadlock_freeSKIPS_is_right front_tickFree_iff_tickFree_butlast is_processT8 is_processT9)
corollary deadlock_freeSKIPS_FD: ‹deadlock_freeSKIPS P ⟷ DFSKIPS UNIV UNIV ⊑FD P› by (metis deadlock_freeSKIPS_def deadlock_freeSKIPS_implies_div_free
less_eq_processptick_def order_refl refine_defs(3))
lemma all_events_ticks_refusal: ‹(s, tick ` 🍋s(P) ∪ ev ` α(P)) ∈F P ==> (s, UNIV) ∈F P› proof (rule ccontr) assume‹(s, tick ` 🍋s(P) ∪ ev ` α(P)) ∈F P›and‹(s, UNIV) ∉F P› thenobtain c where‹c ∉ tick ` 🍋s(P) ∪ ev ` α(P) ∧ s @ [c] ∈T P› using is_processT5[of s ‹tick ` 🍋s(P) ∪ ev ` α(P)› P ‹UNIV - (tick ` 🍋s(P) ∪ ev ` α(P))›, simplified] F_T by blast thus False by (simp add: events_of_def ticks_of_def, cases c) fastforce+ qed
corollary deadlock_freeSKIPS_is_right_wrt_events: ‹deadlock_freeSKIPS P ⟷
(∀s∈T P. tF s ⟶ (s, tick ` 🍋s(P) ∪ ev ` α(P)) ∉F P)› unfolding deadlock_freeSKIPS_is_rightusing all_events_ticks_refusal is_processT4 by blast
lemma deadlock_free_imp_deadlock_freeSKIPS: ‹deadlock_free P ==> deadlock_freeSKIPS P› using DFSKIPS_FD_DF deadlock_freeSKIPS_FD deadlock_free_def trans_FD by blast
section‹const‹deadlock_free› and ‹deadlock_freeSKIPS› with const‹SKIP› and const‹STOP››
corollary non_terminating_F : ‹non_terminating P ⟷ CHAOS UNIV ⊑F P› by (auto simp add:non_terminating_implies_F non_terminating_refine_CHAOS leF_imp_leT)
corollary non_terminating_FD : ‹non_terminating P ⟷ CHAOS UNIV ⊑FD P› by (metis failure_refine_def less_eq_processptick_def non_terminating_F
nonterminating_implies_div_free order_refl)
corollary lifelock_free_is_non_terminating: ‹lifelock_free P = non_terminating P› unfolding lifelock_free_def non_terminating_FD by (fact refl)
lemma divergence_refine_div_free : ‹CHAOSSKIPS UNIV UNIV ⊑D P ⟷D P = {}› ‹CHAOS UNIV ⊑D P ⟷D P = {}› ‹RUN UNIV ⊑D P ⟷D P = {}› ‹DFSKIPS UNIV UNIV ⊑D P ⟷D P = {}› ‹DF UNIV ⊑D P ⟷D P = {}› by (simp_all add: div_free_CHAOS div_free_RUN div_free_DF div_free_DFSKIPS
div_free_CHAOSSKIPS divergence_refine_def)
lemma lifelock_freeSKIPS_iff_div_free : ‹lifelock_freeSKIPS P ⟷D P = {}› by (simp add: CHAOSSKIPS_UNIV_UNIV_leF divergence_refine_div_free(1)
failure_divergence_refine_def lifelock_freeSKIPS_def)
lemma lifelock_free_imp_lifelock_freeSKIPS : ‹lifelock_free P ==> lifelock_freeSKIPS P› by (simp add: lifelock_freeSKIPS_iff_div_free lifelock_free_is_non_terminating
nonterminating_implies_div_free)
corollary deadlock_freeSKIPS_imp_lifelock_freeSKIPS: ‹deadlock_freeSKIPS P ==> lifelock_freeSKIPS P› by (simp add: deadlock_freeSKIPS_implies_div_free lifelock_freeSKIPS_iff_div_free)
lemma non_terminating_Seq : ‹P ; Q = P›if‹non_terminating P› proof - from‹non_terminating P›have * : ‹s ∈T P ==> tF s›for s unfolding non_terminating_is_right .. show‹P ; Q = P› proof (subst Process_eq_spec_optimized, safe) from"*"show‹s ∈D (P ; Q) ==> s ∈D P›for s by (force simp add: D_Seq) next show‹s ∈D P ==> s ∈D (P ; Q)›for s by (simp add: D_Seq) next show‹(s, X) ∈F (P ; Q) ==> (s, X) ∈F P›for s X by (simp add: F_Seq)
(meson "*" is_processT4 is_processT8 non_tickFree_tick sup_ge1 tickFree_append_iff) next show‹(s, X) ∈F P ==> (s, X) ∈F (P ; Q)›for s X by (simp add: F_Seq)
(metis (mono_tags, lifting) "*" F_T f_inv_into_f is_processT5_S7'
non_tickFree_tick tickFree_append_iff) qed qed
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.