(*
Title : Psi - calculi
Author / Maintainer : Jesper Bengtson ( jebe @ itu . dk ) , 2012
*)
theory Tau_Chain
imports Semantics
begin
context env begin
abbreviation tauChain :: "'b ==> ('a, 'b, 'c) psi ==> ('a, 'b, 'c) psi ==> bool" (‹ _ ⊳ _ ==> ^ \ τ _ › [80 , 80 , 80 ] 80 )
where "Ψ ⊳ P ==> ^ \ <tau> P' ≡ (P, P') ∈ {(P, P'). Ψ ⊳ P ⟼ τ ≺ P'}^*"
abbreviation tauStepChain :: "'b ==> ('a, 'b, 'c) psi ==> ('a, 'b, 'c) psi ==> bool" (‹ _ ⊳ _ ==> \ τ _› [80 , 80 , 80 ] 80 )
where "Ψ ⊳ P ==> \ <tau> P' ≡ (P, P') ∈ {(P, P'). Ψ ⊳ P ⟼ τ ≺ P'}^+"
abbreviation tauContextChain :: "('a, 'b, 'c) psi ==> ('a, 'b, 'c) psi ==> bool" (‹ _ ==> ^ \ τ _ › [80 , 80 ] 80 )
where "P ==> ^ \ <tau> P' ≡ 1 ⊳ P ==> ^ \ <tau> P'"
abbreviation tauContextStepChain :: "('a, 'b, 'c) psi ==> ('a, 'b, 'c) psi ==> bool" (‹ _ ==> \ τ _› [80 , 80 ] 80 )
where "P ==> \ <tau> P' ≡ 1 ⊳ P ==> \ <tau> P'"
lemmas tauChainInduct[consumes 1 , case_names TauBase TauStep] = rtrancl.induct[of _ _ "{(P, P'). Ψ ⊳ P ⟼ τ ≺ P'}" , simplified] for Ψ
lemmas tauStepChainInduct[consumes 1 , case_names TauBase TauStep] = trancl.induct[of _ _ "{(P, P'). Ψ ⊳ P ⟼ τ ≺ P'}" , simplified] for Ψ
lemma tauActTauStepChain:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼ τ ≺ P'"
shows "Ψ ⊳ P ==> \ <tau> P'"
using assms by auto
lemma tauActTauChain:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼ τ ≺ P'"
shows "Ψ ⊳ P ==> ^ \ <tau> P'"
using assms by (auto simp add: rtrancl_eq_or_trancl)
lemma tauStepChainEqvt[eqvt]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
assumes "Ψ ⊳ P ==> \ <tau> P'"
shows "(p ∙ Ψ) ⊳ (p ∙ P) ==> \ <tau> (p ∙ P')"
using assms
proof (induct rule: tauStepChainInduct)
case (TauBase P P')
hence "Ψ ⊳ P ⟼ τ ≺ P'" by simp
thus ?case by (force dest: semantics.eqvt simp add: eqvts)
next
case (TauStep P P' P'')
hence "Ψ ⊳ P' ⟼ τ ≺ P''" by simp
hence "(p ∙ Ψ) ⊳ (p ∙ P') ⟼ τ ≺ (p ∙ P'')" by (force dest: semantics.eqvt simp add: eqvts)
with ‹ (p ∙ Ψ) ⊳ (p ∙ P) ==> \ τ (p ∙ P')› show ?case
by (subst trancl.trancl_into_trancl) auto
qed
lemma tauChainEqvt[eqvt]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
shows "(p ∙ Ψ) ⊳ (p ∙ P) ==> ^ \ <tau> (p ∙ P')"
using assms
by (auto simp add: rtrancl_eq_or_trancl eqvts)
lemma tauStepChainEqvt'[eqvt]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
shows "(p ∙ (Ψ ⊳ P ==> \ <tau> P')) = (p ∙ Ψ) ⊳ (p ∙ P) ==> \ <tau> (p ∙ P')"
apply (auto simp add: eqvts perm_set_def pt_bij[OF pt_name_inst, OF at_name_inst])
by (drule_tac p="rev p" in tauStepChainEqvt) auto
lemma tauChainEqvt'[eqvt]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
shows "(p ∙ (Ψ ⊳ P ==> ^ \ <tau> P')) = (p ∙ Ψ) ⊳ (p ∙ P) ==> ^ \ <tau> (p ∙ P')"
apply (auto simp add: eqvts perm_set_def pt_bij[OF pt_name_inst, OF at_name_inst] rtrancl_eq_or_trancl)
by (drule_tac p="rev p" in tauStepChainEqvt) auto
lemma tauStepChainFresh:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "x ♯ P"
shows "x ♯ P'"
using assms
by (induct rule: trancl.induct) (auto dest: tauFreshDerivative)
lemma tauChainFresh:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
and "x ♯ P"
shows "x ♯ P'"
using assms
by (auto simp add: rtrancl_eq_or_trancl intro: tauStepChainFresh)
lemma tauStepChainFreshChain:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and xvec :: "name list"
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "xvec ♯ * P"
shows "xvec ♯ * P'"
using assms
by (induct xvec) (auto intro: tauStepChainFresh)
lemma tauChainFreshChain:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and xvec :: "name list"
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
and "xvec ♯ * P"
shows "xvec ♯ * P'"
using assms
by (induct xvec) (auto intro: tauChainFresh)
lemma tauStepChainCase:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and φ :: 'c
and Cs :: "('c × ('a, 'b, 'c) psi) list"
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "(φ, P) mem Cs"
and "Ψ ⊨ φ"
and "guarded P"
shows "Ψ ⊳ (Cases Cs) ==> \ <tau> P'"
using assms
by (induct rule: trancl.induct) (auto intro: Case trancl_into_trancl)
lemma tauStepChainResPres:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "x ♯ Ψ"
shows "Ψ ⊳ ( νx) P ==> \ <tau> ( νx) P'"
using assms
by (induct rule: trancl.induct) (auto dest: Scope trancl_into_trancl)
lemma tauChainResPres:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
and "x ♯ Ψ"
shows "Ψ ⊳ ( νx) P ==> ^ \ <tau> ( νx) P'"
using assms
by (auto simp add: rtrancl_eq_or_trancl intro: tauStepChainResPres)
lemma tauStepChainResChainPres:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and xvec :: "name list"
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "xvec ♯ * Ψ"
shows "Ψ ⊳ ( ν*xvec) P ==> \ <tau> ( ν*xvec) P'"
using assms
by (induct xvec) (auto intro: tauStepChainResPres)
lemma tauChainResChainPres:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and xvec :: "name list"
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
and "xvec ♯ * Ψ"
shows "Ψ ⊳ ( ν*xvec) P ==> ^ \ <tau> ( ν*xvec) P'"
using assms
by (induct xvec) (auto intro: tauChainResPres)
lemma tauStepChainPar1:
fixes Ψ :: 'b
and ΨQ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and AQ :: "name list"
assumes "Ψ ⊗ ΨQ ⊳ P ==> \ <tau> P'"
and "extractFrame Q = ⟨ AQ , ΨQ ⟩ "
and "AQ ♯ * Ψ"
and "AQ ♯ * P"
shows "Ψ ⊳ P ∥ Q ==> \ <tau> P' ∥ Q"
using assms
by (induct rule: trancl.induct) (auto dest: Par1 tauStepChainFreshChain trancl_into_trancl)
lemma tauChainPar1:
fixes Ψ :: 'b
and ΨQ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and AQ :: "name list"
assumes "Ψ ⊗ ΨQ ⊳ P ==> ^ \ <tau> P'"
and "extractFrame Q = ⟨ AQ , ΨQ ⟩ "
and "AQ ♯ * Ψ"
and "AQ ♯ * P"
shows "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P' ∥ Q"
using assms
by (auto simp add: rtrancl_eq_or_trancl intro: tauStepChainPar1)
lemma tauStepChainPar2:
fixes Ψ :: 'b
and ΨP :: 'b
and Q :: "('a, 'b, 'c) psi"
and Q' :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and AP :: "name list"
assumes "Ψ ⊗ ΨP ⊳ Q ==> \ <tau> Q'"
and "extractFrame P = ⟨ AP , ΨP ⟩ "
and "AP ♯ * Ψ"
and "AP ♯ * Q"
shows "Ψ ⊳ P ∥ Q ==> \ <tau> P ∥ Q'"
using assms
by (induct rule: trancl.induct) (auto dest: Par2 trancl_into_trancl tauStepChainFreshChain)
lemma tauChainPar2:
fixes Ψ :: 'b
and ΨP :: 'b
and Q :: "('a, 'b, 'c) psi"
and Q' :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and AP :: "name list"
assumes "Ψ ⊗ ΨP ⊳ Q ==> ^ \ <tau> Q'"
and "extractFrame P = ⟨ AP , ΨP ⟩ "
and "AP ♯ * Ψ"
and "AP ♯ * Q"
shows "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P ∥ Q'"
using assms
by (auto simp add: rtrancl_eq_or_trancl intro: tauStepChainPar2)
lemma tauStepChainBang:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ∥ !P ==> \ <tau> P'"
and "guarded P"
shows "Ψ ⊳ !P ==> \ <tau> P'"
using assms
by (induct x1=="P ∥ !P" P' rule: trancl.induct) (auto intro: Bang dest: Bang trancl_into_trancl)
lemma tauStepChainStatEq:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and Ψ' :: 'b
assumes "Ψ ⊳ P ==> \ <tau> P'"
and "Ψ ≃ Ψ'"
shows "Ψ' ⊳ P ==> \ <tau> P'"
using assms
by (induct rule: trancl.induct) (auto dest: statEqTransition trancl_into_trancl)
lemma tauChainStatEq:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and Ψ' :: 'b
assumes "Ψ ⊳ P ==> ^ \ <tau> P'"
and "Ψ ≃ Ψ'"
shows "Ψ' ⊳ P ==> ^ \ <tau> P'"
using assms
by (auto simp add: rtrancl_eq_or_trancl intro: tauStepChainStatEq)
definition weakTransition :: "'b ==> ('a, 'b, 'c) psi ==> ('a, 'b, 'c) psi ==> 'a action ==> ('a, 'b, 'c) psi ==> bool" (‹ _ : _ ⊳ _ ==> _ ≺ _› [80 , 80 , 80 , 80 , 80 ] 80 )
where
"Ψ : Q ⊳ P ==> α ≺ P' ≡ ∃ P''. Ψ ⊳ P ==> ^ \ <tau> P'' ∧ (insertAssertion (extractFrame Q) Ψ) ↪ F (insertAssertion (extractFrame P'') Ψ) ∧
Ψ ⊳ P'' ⟼ α ≺ P'"
lemma weakTransitionI:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and P'' :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ==> ^ \ <tau> P''"
and "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and "Ψ ⊳ P'' ⟼ α ≺ P'"
shows "Ψ : Q ⊳ P ==> α ≺ P'"
using assms
by (auto simp add: weakTransition_def)
lemma weakTransitionE:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ : Q ⊳ P ==> α ≺ P'"
obtains P'' where "Ψ ⊳ P ==> ^ \ <tau> P''" and "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and "Ψ ⊳ P'' ⟼ α ≺ P'"
using assms
by (auto simp add: weakTransition_def)
lemma weakTransitionClosed[eqvt]:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
assumes "Ψ : Q ⊳ P ==> α ≺ P'"
shows "(p ∙ Ψ) : (p ∙ Q) ⊳ (p ∙ P) ==> (p ∙ α)≺ (p ∙ P')"
proof -
from assms obtain P'' where "Ψ ⊳ P ==> ^ \ <tau> P''" and "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
from ‹ Ψ ⊳ P ==> ^ \ τ P''› have "(p ∙ Ψ) ⊳ (p ∙ P) ==> ^ \ <tau> (p ∙ P'')"
by (rule tauChainEqvt)
moreover from ‹ insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ ›
have "(p ∙ (insertAssertion (extractFrame Q) Ψ)) ↪ F (p ∙ (insertAssertion (extractFrame P'') Ψ))"
by (rule FrameStatImpClosed)
hence "insertAssertion (extractFrame(p ∙ Q)) (p ∙ Ψ) ↪ F insertAssertion (extractFrame(p ∙ P'')) (p ∙ Ψ)" by (simp add: eqvts)
moreover from ‹ Ψ ⊳ P'' ⟼ α ≺ P'› have "(p ∙ Ψ) ⊳ (p ∙ P'') ⟼ (p ∙ (α ≺ P'))"
by (rule semantics.eqvt)
hence "(p ∙ Ψ) ⊳ (p ∙ P'') ⟼ (p ∙ α) ≺ (p ∙ P')" by (simp add: eqvts)
ultimately show ?thesis by (rule weakTransitionI)
qed
(*
lemma weakTransitionAlpha :
fixes \ < Psi > : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and yvec : : " name list "
assumes PTrans : " \ < Psi > : Q \ < rhd > P \ < Longrightarrow > \ < alpha > \ < prec > P ' "
and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
and " xvec \ < sharp > * ( p \ < bullet > xvec ) "
and " ( p \ < bullet > xvec ) \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * N "
shows " \ < Psi > : Q \ < rhd > P \ < Longrightarrow > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
proof -
from PTrans obtain P ' ' where PChain : " \ < Psi > \ < rhd > P \ < Longrightarrow > \ < ^ sup > ^ \ < ^ sub > \ < tau > P ' ' " and QeqP ' ' : " insertAssertion ( extractFrame Q ) \ < Psi > \ < hookrightarrow > \ < ^ sub > F insertAssertion ( extractFrame P ' ' ) \ < Psi > "
and P ' ' Trans : " \ < Psi > \ < rhd > P ' ' \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule weakTransitionE )
note PChain QeqP ' '
moreover from PChain ` ( p \ < bullet > xvec ) \ < sharp > * P ` have " ( p \ < bullet > xvec ) \ < sharp > * P ' ' " by ( rule tauChainFreshChain )
with P ' ' Trans ` xvec \ < sharp > * ( p \ < bullet > xvec ) ` ` ( p \ < bullet > xvec ) \ < sharp > * N ` have " ( p \ < bullet > xvec ) \ < sharp > * P ' "
by ( force intro : outputFreshChainDerivative )
with P ' ' Trans S ` ( p \ < bullet > xvec ) \ < sharp > * N ` have " \ < Psi > \ < rhd > P ' ' \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' )
ultimately show ? thesis by ( rule weakTransitionI )
qed
*)
lemma weakOutputAlpha:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
and yvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> M( ν*(p ∙ xvec)) ⟨ (p ∙ N)⟩ ≺ P'"
and S: "set p ⊆ set xvec × set(p ∙ xvec)"
and "distinctPerm p"
and "xvec ♯ * P"
and "xvec ♯ * (p ∙ xvec)"
and "(p ∙ xvec) ♯ * M"
and "distinct xvec"
shows "Ψ : Q ⊳ P ==> M( ν*xvec) ⟨ N⟩ ≺ (p ∙ P')"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ M( ν*(p ∙ xvec)) ⟨ (p ∙ N)⟩ ≺ P'"
by (rule weakTransitionE)
note PChain QeqP''
moreover from PChain ‹ xvec ♯ * P› have "xvec ♯ * P''" by (rule tauChainFreshChain)
with P''Trans ‹ xvec ♯ * (p ∙ xvec)› ‹ distinct xvec› ‹ (p ∙ xvec) ♯ * M› have "xvec ♯ * (p ∙ N)" and "xvec ♯ * P'"
by (force intro: outputFreshChainDerivative)+
hence "(p ∙ xvec) ♯ * (p ∙ p ∙ N)" and "(p ∙ xvec) ♯ * (p ∙ P')"
by (simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])+
with ‹ distinctPerm p› have "(p ∙ xvec) ♯ * N" and "(p ∙ xvec) ♯ * (p ∙ P')" by simp+
with P''Trans S ‹ distinctPerm p› have "Ψ ⊳ P'' ⟼ M( ν*xvec) ⟨ N⟩ ≺ (p ∙ P')"
apply (simp add: residualInject)
by (subst boundOutputChainAlpha) auto
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakFreshDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "x ♯ P"
and "x ♯ α"
and "bn α ♯ * subject α"
and "distinct(bn α)"
shows "x ♯ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and P''Trans: "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
from PChain ‹ x ♯ P› have "x ♯ P''" by (rule tauChainFresh)
with P''Trans show "x ♯ P'" using ‹ x ♯ α› ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
by (force intro: freeFreshDerivative)
qed
lemma weakFreshChainDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and yvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "yvec ♯ * P"
and "yvec ♯ * α"
and "bn α ♯ * subject α"
and "distinct(bn α)"
shows "yvec ♯ * P'"
using assms
by (induct yvec) (auto intro: weakFreshDerivative)
lemma weakInputFreshDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes PTrans: "Ψ : Q ⊳ P ==> M( N) ≺ P'"
and "x ♯ P"
and "x ♯ N"
shows "x ♯ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and P''Trans: "Ψ ⊳ P'' ⟼ M( N) ≺ P'"
by (rule weakTransitionE)
from PChain ‹ x ♯ P› have "x ♯ P''" by (rule tauChainFresh)
with P''Trans show "x ♯ P'" using ‹ x ♯ N›
by (force intro: inputFreshDerivative)
qed
lemma weakInputFreshChainDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and xvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> M( N) ≺ P'"
and "xvec ♯ * P"
and "xvec ♯ * N"
shows "xvec ♯ * P'"
using assms
by (induct xvec) (auto intro: weakInputFreshDerivative)
lemma weakOutputFreshDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and x :: name
assumes PTrans: "Ψ : Q ⊳ P ==> M( ν*xvec) ⟨ N⟩ ≺ P'"
and "x ♯ P"
and "x ♯ xvec"
and "xvec ♯ * M"
and "distinct xvec"
shows "x ♯ N"
and "x ♯ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and P''Trans: "Ψ ⊳ P'' ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
by (rule weakTransitionE)
from PChain ‹ x ♯ P› have "x ♯ P''" by (rule tauChainFresh)
with P''Trans show "x ♯ N" and "x ♯ P'" using ‹ x ♯ xvec› ‹ xvec ♯ * M› ‹ distinct xvec›
by (force intro: outputFreshDerivative)+
qed
lemma weakOutputFreshChainDerivative:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and yvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> M( ν*xvec) ⟨ N⟩ ≺ P'"
and "yvec ♯ * P"
and "xvec ♯ * yvec"
and "xvec ♯ * M"
and "distinct xvec"
shows "yvec ♯ * N"
and "yvec ♯ * P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and P''Trans: "Ψ ⊳ P'' ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
by (rule weakTransitionE)
from PChain ‹ yvec ♯ * P› have "yvec ♯ * P''" by (rule tauChainFreshChain)
with P''Trans show "yvec ♯ * N" and "yvec ♯ * P'" using ‹ xvec ♯ * yvec› ‹ xvec ♯ * M› ‹ distinct xvec ›
by (force intro: outputFreshChainDerivative)+
qed
lemma weakOutputPermSubject:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
and yvec :: "name list"
and zvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> M( ν*xvec) ⟨ N⟩ ≺ P'"
and S: "set p ⊆ set yvec × set zvec"
and "yvec ♯ * Ψ"
and "zvec ♯ * Ψ"
and "yvec ♯ * P"
and "zvec ♯ * P"
shows "Ψ : Q ⊳ P ==> (p ∙ M)( ν*xvec) ⟨ N⟩ ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
by (rule weakTransitionE)
from PChain ‹ yvec ♯ * P› ‹ zvec ♯ * P› have "yvec ♯ * P''" and "zvec ♯ * P''"
by (force intro: tauChainFreshChain)+
note PChain QeqP''
moreover from P''Trans S ‹ yvec ♯ * Ψ› ‹ zvec ♯ * Ψ› ‹ yvec ♯ * P''› ‹ zvec ♯ * P''› have "Ψ ⊳ P'' ⟼ (p ∙ M)( ν*xvec) ⟨ N⟩ ≺ P'"
by (rule_tac outputPermSubject) (assumption | auto)
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakInputPermSubject:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and p :: "name prm"
and yvec :: "name list"
and zvec :: "name list"
assumes PTrans: "Ψ : Q ⊳ P ==> M( N) ≺ P'"
and S: "set p ⊆ set yvec × set zvec"
and "yvec ♯ * Ψ"
and "zvec ♯ * Ψ"
and "yvec ♯ * P"
and "zvec ♯ * P"
shows "Ψ : Q ⊳ P ==> (p ∙ M)( N) ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ M( N) ≺ P'"
by (rule weakTransitionE)
from PChain ‹ yvec ♯ * P› ‹ zvec ♯ * P› have "yvec ♯ * P''" and "zvec ♯ * P''"
by (force intro: tauChainFreshChain)+
note PChain QeqP''
moreover from P''Trans S ‹ yvec ♯ * Ψ› ‹ zvec ♯ * Ψ› ‹ yvec ♯ * P''› ‹ zvec ♯ * P''› have "Ψ ⊳ P'' ⟼ (p ∙ M)( N) ≺ P'"
by (rule_tac inputPermSubject) auto
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakInput:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and M :: 'a
and K :: 'a
and xvec :: "name list"
and N :: 'a
and Tvec :: "'a list"
and P :: "('a, 'b, 'c) psi"
assumes "Ψ ⊨ M ↔ K"
and "distinct xvec"
and "set xvec ⊆ supp N"
and "length xvec = length Tvec"
and QeqΨ: "insertAssertion (extractFrame Q) Ψ ↪ F ⟨ ε, Ψ ⊗ 1 ⟩ "
shows "Ψ : Q ⊳ M( λ*xvec N) .P ==> K( (N[xvec::=Tvec])) ≺ P[xvec::=Tvec]"
proof -
have "Ψ ⊳ M( λ*xvec N) .P ==> ^ \ <tau> M( λ*xvec N) .P" by simp
moreover from QeqΨ have "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame(M( λ*xvec N) .P)) Ψ"
by auto
moreover from assms have "Ψ ⊳ M( λ*xvec N) .P ⟼ K( (N[xvec::=Tvec])) ≺ P[xvec::=Tvec]"
by (rule_tac Input)
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakOutput:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and M :: 'a
and K :: 'a
and N :: 'a
and P :: "('a, 'b, 'c) psi"
assumes "Ψ ⊨ M ↔ K"
and QeqΨ: "insertAssertion (extractFrame Q) Ψ ↪ F ⟨ ε, Ψ ⊗ 1 ⟩ "
shows "Ψ : Q ⊳ M⟨ N⟩ .P ==> K⟨ N⟩ ≺ P"
proof -
have "Ψ ⊳ M⟨ N⟩ .P ==> ^ \ <tau> M⟨ N⟩ .P" by simp
moreover from QeqΨ have "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame(M⟨ N⟩ .P)) Ψ"
by auto
moreover have "insertAssertion (extractFrame(M⟨ N⟩ .P)) Ψ ↪ F insertAssertion (extractFrame(M⟨ N⟩ .P)) Ψ" by simp
moreover from ‹ Ψ ⊨ M ↔ K› have "Ψ ⊳ M⟨ N⟩ .P ⟼ K⟨ N⟩ ≺ P"
by (rule Output )
ultimately show ?thesis by (rule_tac weakTransitionI) auto
qed
lemma insertGuardedAssertion:
fixes P :: "('a, 'b, 'c) psi"
assumes "guarded P"
shows "insertAssertion(extractFrame P) Ψ ≃ F ⟨ ε, Ψ ⊗ 1 ⟩ "
proof -
obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " and "AP ♯ * Ψ" by (rule freshFrame)
from ‹ guarded P› FrP have "ΨP ≃ 1 " and "supp ΨP = ({}::name set)"
by (blast dest: guardedStatEq)+
from FrP ‹ AP ♯ * Ψ› ‹ ΨP ≃ 1 › have "insertAssertion(extractFrame P) Ψ ≃ F ⟨ AP , Ψ ⊗ 1 ⟩ "
by simp (metis frameIntCompositionSym)
moreover from ‹ AP ♯ * Ψ› have "⟨ AP , Ψ ⊗ 1 ⟩ ≃ F ⟨ ε, Ψ ⊗ 1 ⟩ "
by (rule_tac frameResFreshChain) auto
ultimately show ?thesis by (rule FrameStatEqTrans)
qed
lemma weakCase:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "(φ, P) mem CsP"
and "Ψ ⊨ φ"
and "guarded P"
and RImpQ: "insertAssertion (extractFrame R) Ψ ↪ F insertAssertion (extractFrame Q) Ψ"
and ImpR: "insertAssertion (extractFrame R) Ψ ↪ F ⟨ ε, Ψ⟩ "
shows "Ψ : R ⊳ Cases CsP ==> α ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''"
and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
show ?thesis
proof (case_tac "P = P''" )
assume "P = P''"
have "Ψ ⊳ Cases CsP ==> ^ \ <tau> Cases CsP" by simp
moreover from ImpR AssertionStatEq_def have "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame(Cases CsP)) Ψ"
by (rule_tac FrameStatImpTrans) (auto intro: Identity)+
moreover from P''Trans ‹ (φ, P) mem CsP› ‹ Ψ ⊨ φ› ‹ guarded P› ‹ P = P''› have "Ψ ⊳ Cases CsP ⟼ α ≺ P'"
by (blast intro: Case )
ultimately show ?thesis
by (rule weakTransitionI)
next
assume "P ≠ P''"
with PChain have "Ψ ⊳ P ==> \ <tau> P''" by (simp add: rtrancl_eq_or_trancl)
hence "Ψ ⊳ Cases CsP ==> \ <tau> P''" using ‹ (φ, P) mem CsP› ‹ Ψ ⊨ φ› ‹ guarded P›
by (rule tauStepChainCase)
hence "Ψ ⊳ Cases CsP ==> ^ \ <tau> P''" by simp
moreover from RImpQ QeqP'' have "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame P'') Ψ"
by (rule FrameStatImpTrans)
ultimately show ?thesis using P''Trans by (rule weakTransitionI)
qed
qed
lemma weakOpen:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and yvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : Q ⊳ P ==> M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'"
and "x ∈ supp N"
and "x ♯ Ψ"
and "x ♯ M"
and "x ♯ xvec"
and "x ♯ yvec"
shows "Ψ : ( νx) Q ⊳ ( νx) P ==> M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'"
by (rule weakTransitionE)
from PChain ‹ x ♯ Ψ› have "Ψ ⊳ ( νx) P ==> ^ \ <tau> ( νx) P''" by (rule tauChainResPres)
moreover from QeqP'' ‹ x ♯ Ψ› have "insertAssertion (extractFrame(( νx) Q)) Ψ ↪ F insertAssertion (extractFrame(( νx) P'')) Ψ" by (force intro: frameImpResPres)
moreover from P''Trans ‹ x ∈ supp N› ‹ x ♯ Ψ› ‹ x ♯ M› ‹ x ♯ xvec› ‹ x ♯ yvec› have "Ψ ⊳ ( νx) P'' ⟼ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'"
by (rule Open )
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakScope:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "x ♯ Ψ"
and "x ♯ α"
shows "Ψ : ( νx) Q ⊳ ( νx) P ==> α ≺ ( νx) P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''" and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
from PChain ‹ x ♯ Ψ› have "Ψ ⊳ ( νx) P ==> ^ \ <tau> ( νx) P''" by (rule tauChainResPres)
moreover from QeqP'' ‹ x ♯ Ψ› have "insertAssertion (extractFrame(( νx) Q)) Ψ ↪ F insertAssertion (extractFrame(( νx) P'')) Ψ" by (force intro: frameImpResPres)
moreover from P''Trans ‹ x ♯ Ψ› ‹ x ♯ α› have "Ψ ⊳ ( νx) P'' ⟼ α ≺ ( νx) P'"
by (rule Scope)
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakPar1:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and AQ :: "name list"
and ΨQ :: 'b
assumes PTrans: "Ψ ⊗ ΨQ : R ⊳ P ==> α ≺ P'"
and FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ "
and "bn α ♯ * Q"
and "AQ ♯ * Ψ"
and "AQ ♯ * P"
and "AQ ♯ * α"
and "AQ ♯ * R"
shows "Ψ : R ∥ Q ⊳ P ∥ Q ==> α ≺ P' ∥ Q"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊗ ΨQ ⊳ P ==> ^ \ <tau> P''"
and ReqP'': "insertAssertion (extractFrame R) (Ψ ⊗ ΨQ ) ↪ F insertAssertion (extractFrame P'') (Ψ ⊗ ΨQ )"
and P''Trans: "Ψ ⊗ ΨQ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
from PChain ‹ AQ ♯ * P› have "AQ ♯ * P''" by (rule tauChainFreshChain)
from PChain FrQ ‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› have "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P'' ∥ Q" by (rule tauChainPar1)
moreover have "insertAssertion (extractFrame(R ∥ Q)) Ψ ↪ F insertAssertion (extractFrame(P'' ∥ Q)) Ψ"
proof -
obtain AR ΨR where FrR: "extractFrame R = ⟨ AR , ΨR ⟩ " and "AR ♯ * AQ " and "AR ♯ * ΨQ " and "AR ♯ * Ψ"
by (rule_tac C="(AQ , ΨQ , Ψ)" in freshFrame) auto
obtain AP '' ΨP '' where FrP'': "extractFrame P'' = ⟨ AP '', ΨP ''⟩ " and "AP '' ♯ * AQ " and "AP '' ♯ * ΨQ " and "AP '' ♯ * Ψ"
by (rule_tac C="(AQ , ΨQ , Ψ)" in freshFrame) auto
from FrR FrP'' ‹ AQ ♯ * R› ‹ AQ ♯ * P''› ‹ AR ♯ * AQ › ‹ AP '' ♯ * AQ › have "AQ ♯ * ΨR " and "AQ ♯ * ΨP ''"
by (force dest: extractFrameFreshChain)+
have "⟨ AR , Ψ ⊗ ΨR ⊗ ΨQ ⟩ ≃ F ⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ "
by (metis frameNilStatEq frameResChainPres Associativity Commutativity Composition AssertionStatEqTrans)
moreover from ReqP'' FrR FrP'' ‹ AR ♯ * Ψ› ‹ AR ♯ * ΨQ › ‹ AP '' ♯ * Ψ› ‹ AP '' ♯ * ΨQ ›
have "⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ ↪ F ⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ " using freshCompChain by auto
moreover have "⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ ≃ F ⟨ AP '', Ψ ⊗ ΨP '' ⊗ ΨQ ⟩ "
by (metis frameNilStatEq frameResChainPres Associativity Commutativity Composition AssertionStatEqTrans)
ultimately have "⟨ AR , Ψ ⊗ ΨR ⊗ ΨQ ⟩ ↪ F ⟨ AP '', Ψ ⊗ ΨP '' ⊗ ΨQ ⟩ "
by (force dest: FrameStatImpTrans simp add: FrameStatEq_def)
hence "⟨ (AR @AQ ), Ψ ⊗ ΨR ⊗ ΨQ ⟩ ↪ F ⟨ (AP ''@AQ ), Ψ ⊗ ΨP '' ⊗ ΨQ ⟩ "
apply (simp add: frameChainAppend)
apply (drule_tac xvec=AQ in frameImpResChainPres)
by (metis frameImpChainComm FrameStatImpTrans)
with FrR FrQ FrP'' ‹ AR ♯ * AQ › ‹ AR ♯ * ΨQ › ‹ AQ ♯ * ΨR › ‹ AP '' ♯ * AQ › ‹ AP '' ♯ * ΨQ › ‹ AQ ♯ * ΨP '' › ‹ AR ♯ * Ψ› ‹ AP '' ♯ * Ψ› ‹ AQ ♯ * Ψ› ReqP''
show ?thesis by simp
qed
moreover from P''Trans FrQ ‹ bn α ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * P''› ‹ AQ ♯ * α› have "Ψ ⊳ P'' ∥ Q ⟼ α ≺ (P' ∥ Q)"
by (rule Par1)
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakPar2:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and Q' :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and AP :: "name list"
and ΨP :: 'b
assumes QTrans: "Ψ ⊗ ΨP : R ⊳ Q ==> α ≺ Q'"
and FrP: "extractFrame P = ⟨ AP , ΨP ⟩ "
and "bn α ♯ * P"
and "AP ♯ * Ψ"
and "AP ♯ * Q"
and "AP ♯ * α"
and "AP ♯ * R"
shows "Ψ : P ∥ R ⊳ P ∥ Q ==> α ≺ P ∥ Q'"
proof -
from QTrans obtain Q'' where QChain: "Ψ ⊗ ΨP ⊳ Q ==> ^ \ <tau> Q''"
and ReqQ'': "insertAssertion (extractFrame R) (Ψ ⊗ ΨP ) ↪ F insertAssertion (extractFrame Q'') (Ψ ⊗ ΨP )"
and Q''Trans: "Ψ ⊗ ΨP ⊳ Q'' ⟼ α ≺ Q'"
by (rule weakTransitionE)
from QChain ‹ AP ♯ * Q› have "AP ♯ * Q''" by (rule tauChainFreshChain)
from QChain FrP ‹ AP ♯ * Ψ› ‹ AP ♯ * Q› have "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P ∥ Q''" by (rule tauChainPar2)
moreover have "insertAssertion (extractFrame(P ∥ R)) Ψ ↪ F insertAssertion (extractFrame(P ∥ Q'')) Ψ"
proof -
obtain AR ΨR where FrR: "extractFrame R = ⟨ AR , ΨR ⟩ " and "AR ♯ * AP " and "AR ♯ * ΨP " and "AR ♯ * Ψ"
by (rule_tac C="(AP , ΨP , Ψ)" in freshFrame) auto
obtain AQ '' ΨQ '' where FrQ'': "extractFrame Q'' = ⟨ AQ '', ΨQ ''⟩ " and "AQ '' ♯ * AP " and "AQ '' ♯ * ΨP " and "AQ '' ♯ * Ψ"
by (rule_tac C="(AP , ΨP , Ψ)" in freshFrame) auto
from FrR FrQ'' ‹ AP ♯ * R› ‹ AP ♯ * Q''› ‹ AR ♯ * AP › ‹ AQ '' ♯ * AP › have "AP ♯ * ΨR " and "AP ♯ * ΨQ ''"
by (force dest: extractFrameFreshChain)+
have "⟨ AR , Ψ ⊗ ΨP ⊗ ΨR ⟩ ≃ F ⟨ AR , (Ψ ⊗ ΨP ) ⊗ ΨR ⟩ "
by (metis frameNilStatEq frameResChainPres Associativity Commutativity Composition AssertionStatEqTrans)
moreover from ReqQ'' FrR FrQ'' ‹ AR ♯ * Ψ› ‹ AR ♯ * ΨP › ‹ AQ '' ♯ * Ψ› ‹ AQ '' ♯ * ΨP ›
have "⟨ AR , (Ψ ⊗ ΨP ) ⊗ ΨR ⟩ ↪ F ⟨ AQ '', (Ψ ⊗ ΨP ) ⊗ ΨQ ''⟩ " using freshCompChain by simp
moreover have "⟨ AQ '', (Ψ ⊗ ΨP ) ⊗ ΨQ ''⟩ ≃ F ⟨ AQ '', Ψ ⊗ ΨP ⊗ ΨQ ''⟩ "
by (metis frameNilStatEq frameResChainPres Associativity Commutativity Composition AssertionStatEqTrans)
ultimately have "⟨ AR , Ψ ⊗ ΨP ⊗ ΨR ⟩ ↪ F ⟨ AQ '', Ψ ⊗ ΨP ⊗ ΨQ ''⟩ "
by (force dest: FrameStatImpTrans simp add: FrameStatEq_def)
hence "⟨ (AP @AR ), Ψ ⊗ ΨP ⊗ ΨR ⟩ ↪ F ⟨ (AP @AQ ''), Ψ ⊗ ΨP ⊗ ΨQ ''⟩ "
apply (simp add: frameChainAppend)
apply (drule_tac xvec=AP in frameImpResChainPres)
by (metis frameImpChainComm FrameStatImpTrans)
with FrR FrP FrQ'' ‹ AR ♯ * AP › ‹ AR ♯ * ΨP › ‹ AP ♯ * ΨR › ‹ AQ '' ♯ * AP › ‹ AQ '' ♯ * ΨP › ‹ AP ♯ * ΨQ '' › ‹ AR ♯ * Ψ› ‹ AQ '' ♯ * Ψ› ‹ AP ♯ * Ψ› ReqQ''
show ?thesis by simp
qed
moreover from Q''Trans FrP ‹ bn α ♯ * P› ‹ AP ♯ * Ψ› ‹ AP ♯ * Q''› ‹ AP ♯ * α› have "Ψ ⊳ P ∥ Q'' ⟼ α ≺ (P ∥ Q')"
by (rule_tac Par2) auto
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma weakComm1:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and AQ :: "name list"
and ΨQ :: 'b
assumes PTrans: "Ψ ⊗ ΨQ : R ⊳ P ==> M( N) ≺ P'"
and FrR: "extractFrame R = ⟨ AR , ΨR ⟩ "
and QTrans: "Ψ ⊗ ΨR ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'"
and FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ "
and MeqK: "Ψ ⊗ ΨR ⊗ ΨQ ⊨ M ↔ K"
and "AR ♯ * Ψ"
and "AR ♯ * P"
and "AR ♯ * Q"
and "AR ♯ * R"
and "AR ♯ * M"
and "AR ♯ * AQ "
and "AQ ♯ * Ψ"
and "AQ ♯ * P"
and "AQ ♯ * Q"
and "AQ ♯ * R"
and "AQ ♯ * K"
and "xvec ♯ * P"
shows "Ψ ⊳ P ∥ Q ==> \ <tau> (( ν*xvec) (P' ∥ Q'))"
proof -
from ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ › ‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * R› ‹ AQ ♯ * K› ‹ AR ♯ * AQ ›
obtain AQ ' where FrQ': "extractFrame Q = ⟨ AQ ', ΨQ ⟩ " and "distinct AQ '" and "AQ ' ♯ * Ψ" and "AQ ' ♯ * P"
and "AQ ' ♯ * Q" and "AQ ' ♯ * R" and "AQ ' ♯ * K" and "AR ♯ * AQ '"
by (rule_tac C="(Ψ, P, Q, R, K, AR )" in distinctFrame) auto
from PTrans obtain P'' where PChain: "Ψ ⊗ ΨQ ⊳ P ==> ^ \ <tau> P''"
and RimpP'': "insertAssertion (extractFrame R) (Ψ ⊗ ΨQ ) ↪ F insertAssertion (extractFrame P'') (Ψ ⊗ ΨQ )"
and P''Trans: "Ψ ⊗ ΨQ ⊳ P'' ⟼ M( N) ≺ P'"
by (rule weakTransitionE)
from PChain ‹ AQ ' ♯ * P› have "AQ ' ♯ * P''" by (rule tauChainFreshChain)
obtain AP '' ΨP '' where FrP'': "extractFrame P'' = ⟨ AP '', ΨP ''⟩ " and "AP '' ♯ * (Ψ, AQ ', ΨQ , AR , ΨR , M, N, K, R, Q, P'', xvec)" and "distinct AP ''"
by (rule freshFrame)
hence "AP '' ♯ * Ψ" and "AP '' ♯ * AQ '" and "AP '' ♯ * ΨQ " and "AP '' ♯ * M" and "AP '' ♯ * R" and "AP '' ♯ * Q"
and "AP '' ♯ * N" and "AP '' ♯ * K" and "AP '' ♯ * AR " and "AP '' ♯ * P''" and "AP '' ♯ * xvec" and "AP '' ♯ * ΨR "
by simp+
from FrR ‹ AR ♯ * AQ '› ‹ AQ ' ♯ * R› have "AQ ' ♯ * ΨR " by (drule_tac extractFrameFreshChain) auto
from FrQ' ‹ AR ♯ * AQ '› ‹ AR ♯ * Q› have "AR ♯ * ΨQ " by (drule_tac extractFrameFreshChain) auto
from PChain ‹ xvec ♯ * P› have "xvec ♯ * P''" by (force intro: tauChainFreshChain)+
have "⟨ AR , (Ψ ⊗ ΨR ) ⊗ ΨQ ⟩ ≃ F ⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ "
by (metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
moreover with RimpP'' FrP'' FrR ‹ AP '' ♯ * Ψ› ‹ AR ♯ * Ψ› ‹ AP '' ♯ * ΨQ › ‹ AR ♯ * ΨQ ›
have "⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ ↪ F ⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ " using freshCompChain
by (simp add: freshChainSimps)
moreover have "⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ ≃ F ⟨ AP '', (Ψ ⊗ ΨP '') ⊗ ΨQ ⟩ "
by (metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
ultimately have RImpP'': "⟨ AR , (Ψ ⊗ ΨR ) ⊗ ΨQ ⟩ ↪ F ⟨ AP '', (Ψ ⊗ ΨP '') ⊗ ΨQ ⟩ "
by (rule FrameStatEqImpCompose)
from PChain FrQ' ‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P› have "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P'' ∥ Q" by (rule tauChainPar1)
moreover from QTrans FrR P''Trans MeqK RImpP'' FrP'' FrQ' ‹ distinct AP ''› ‹ distinct AQ '› ‹ AP '' ♯ * AQ '› ‹ AR ♯ * AQ '›
‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P''› ‹ AQ ' ♯ * Q› ‹ AQ ' ♯ * R› ‹ AQ ' ♯ * K› ‹ AP '' ♯ * Ψ› ‹ AP '' ♯ * R› ‹ AP '' ♯ * Q ›
‹ AP '' ♯ * P''› ‹ AP '' ♯ * M› ‹ AQ ♯ * R› ‹ AR ♯ * Q› ‹ AR ♯ * M›
obtain K' where "Ψ ⊗ ΨP '' ⊳ Q ⟼ K'( ν*xvec) ⟨ N⟩ ≺ Q'" and "Ψ ⊗ ΨP '' ⊗ ΨQ ⊨ M ↔ K'" and "AQ ' ♯ * K'"
by (rule_tac comm1Aux) (assumption | simp)+
with P''Trans FrP'' have "Ψ ⊳ P'' ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')" using FrQ' ‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P'' › ‹ AQ ' ♯ * Q›
‹ xvec ♯ * P''› ‹ AP '' ♯ * Ψ› ‹ AP '' ♯ * P''› ‹ AP '' ♯ * Q› ‹ AP '' ♯ * M› ‹ AP '' ♯ * AQ '›
by (rule_tac Comm1)
ultimately show ?thesis
by (drule_tac tauActTauStepChain) auto
qed
lemma weakComm2:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and AQ :: "name list"
and ΨQ :: 'b
assumes PTrans: "Ψ ⊗ ΨQ : R ⊳ P ==> M( ν*xvec) ⟨ N⟩ ≺ P'"
and FrR: "extractFrame R = ⟨ AR , ΨR ⟩ "
and QTrans: "Ψ ⊗ ΨR ⊳ Q ⟼ K( N) ≺ Q'"
and FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ "
and MeqK: "Ψ ⊗ ΨR ⊗ ΨQ ⊨ M ↔ K"
and "AR ♯ * Ψ"
and "AR ♯ * P"
and "AR ♯ * Q"
and "AR ♯ * R"
and "AR ♯ * M"
and "AR ♯ * AQ "
and "AQ ♯ * Ψ"
and "AQ ♯ * P"
and "AQ ♯ * Q"
and "AQ ♯ * R"
and "AQ ♯ * K"
and "xvec ♯ * Q"
and "xvec ♯ * M"
and "xvec ♯ * AQ "
and "xvec ♯ * AR "
shows "Ψ ⊳ P ∥ Q ==> \ <tau> (( ν*xvec) (P' ∥ Q'))"
proof -
from ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ › ‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * R› ‹ AQ ♯ * K› ‹ AR ♯ * AQ › ‹ xvec ♯ * AQ ›
obtain AQ ' where FrQ': "extractFrame Q = ⟨ AQ ', ΨQ ⟩ " and "distinct AQ '" and "AQ ' ♯ * Ψ" and "AQ ' ♯ * P"
and "AQ ' ♯ * Q" and "AQ ' ♯ * R" and "AQ ' ♯ * K" and "AR ♯ * AQ '" and "AQ ' ♯ * xvec"
by (rule_tac C="(Ψ, P, Q, R, K, AR , xvec)" in distinctFrame) auto
from PTrans obtain P'' where PChain: "Ψ ⊗ ΨQ ⊳ P ==> ^ \ <tau> P''"
and RimpP'': "insertAssertion (extractFrame R) (Ψ ⊗ ΨQ ) ↪ F insertAssertion (extractFrame P'') (Ψ ⊗ ΨQ )"
and P''Trans: "Ψ ⊗ ΨQ ⊳ P'' ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
by (rule weakTransitionE)
from PChain ‹ AQ ' ♯ * P› have "AQ ' ♯ * P''" by (rule tauChainFreshChain)
obtain AP '' ΨP '' where FrP'': "extractFrame P'' = ⟨ AP '', ΨP ''⟩ " and "AP '' ♯ * (Ψ, AQ ', ΨQ , AR , ΨR , M, N, K, R, Q, P'', xvec)" and "distinct AP ''"
by (rule freshFrame)
hence "AP '' ♯ * Ψ" and "AP '' ♯ * AQ '" and "AP '' ♯ * ΨQ " and "AP '' ♯ * M" and "AP '' ♯ * R" and "AP '' ♯ * Q"
and "AP '' ♯ * N" and "AP '' ♯ * K" and "AP '' ♯ * AR " and "AP '' ♯ * P''" and "AP '' ♯ * xvec" and "AP '' ♯ * ΨR "
by simp+
from FrR ‹ AR ♯ * AQ '› ‹ AQ ' ♯ * R› have "AQ ' ♯ * ΨR " by (drule_tac extractFrameFreshChain) auto
from FrQ' ‹ AR ♯ * AQ '› ‹ AR ♯ * Q› have "AR ♯ * ΨQ " by (drule_tac extractFrameFreshChain) auto
have "⟨ AR , (Ψ ⊗ ΨR ) ⊗ ΨQ ⟩ ≃ F ⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ "
by (metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
moreover with RimpP'' FrP'' FrR ‹ AP '' ♯ * Ψ› ‹ AR ♯ * Ψ› ‹ AP '' ♯ * ΨQ › ‹ AR ♯ * ΨQ ›
have "⟨ AR , (Ψ ⊗ ΨQ ) ⊗ ΨR ⟩ ↪ F ⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ " using freshCompChain
by (simp add: freshChainSimps)
moreover have "⟨ AP '', (Ψ ⊗ ΨQ ) ⊗ ΨP ''⟩ ≃ F ⟨ AP '', (Ψ ⊗ ΨP '') ⊗ ΨQ ⟩ "
by (metis frameResChainPres frameNilStatEq Commutativity AssertionStatEqTrans Composition Associativity)
ultimately have RImpP'': "⟨ AR , (Ψ ⊗ ΨR ) ⊗ ΨQ ⟩ ↪ F ⟨ AP '', (Ψ ⊗ ΨP '') ⊗ ΨQ ⟩ "
by (rule FrameStatEqImpCompose)
from PChain FrQ' ‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P› have "Ψ ⊳ P ∥ Q ==> ^ \ <tau> P'' ∥ Q" by (rule tauChainPar1)
moreover from QTrans FrR P''Trans MeqK RImpP'' FrP'' FrQ' ‹ distinct AP ''› ‹ distinct AQ '› ‹ AP '' ♯ * AQ '› ‹ AR ♯ * AQ '›
‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P''› ‹ AQ ' ♯ * Q› ‹ AQ ' ♯ * R› ‹ AQ ' ♯ * K› ‹ AP '' ♯ * Ψ› ‹ AP '' ♯ * R› ‹ AP '' ♯ * Q ›
‹ AP '' ♯ * P''› ‹ AP '' ♯ * M› ‹ AQ ♯ * R› ‹ AR ♯ * Q› ‹ AR ♯ * M› ‹ xvec ♯ * AR › ‹ xvec ♯ * M› ‹ AQ ' ♯ * xvec›
obtain K' where "Ψ ⊗ ΨP '' ⊳ Q ⟼ K'( N) ≺ Q'" and "Ψ ⊗ ΨP '' ⊗ ΨQ ⊨ M ↔ K'" and "AQ ' ♯ * K'"
by (rule_tac comm2Aux) (assumption | simp)+
with P''Trans FrP'' have "Ψ ⊳ P'' ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')" using FrQ' ‹ AQ ' ♯ * Ψ› ‹ AQ ' ♯ * P'' › ‹ AQ ' ♯ * Q›
‹ xvec ♯ * Q› ‹ AP '' ♯ * Ψ› ‹ AP '' ♯ * P''› ‹ AP '' ♯ * Q› ‹ AP '' ♯ * M› ‹ AP '' ♯ * AQ '›
by (rule_tac Comm2)
ultimately show ?thesis
by (drule_tac tauActTauStepChain) auto
qed
lemma frameImpIntComposition:
fixes Ψ :: 'b
and Ψ' :: 'b
and AF :: "name list"
and ΨF :: 'b
assumes "Ψ ≃ Ψ'"
shows "⟨ AF , Ψ ⊗ ΨF ⟩ ↪ F ⟨ AF , Ψ' ⊗ ΨF ⟩ "
proof -
from assms have "⟨ AF , Ψ ⊗ ΨF ⟩ ≃ F ⟨ AF , Ψ' ⊗ ΨF ⟩ " by (rule frameIntComposition)
thus ?thesis by (simp add: FrameStatEq_def)
qed
lemma insertAssertionStatImp:
fixes F :: "'b frame"
and Ψ :: 'b
and G :: "'b frame"
and Ψ' :: 'b
assumes FeqG: "insertAssertion F Ψ ↪ F insertAssertion G Ψ"
and "Ψ ≃ Ψ'"
shows "insertAssertion F Ψ' ↪ F insertAssertion G Ψ'"
proof -
obtain AF ΨF where FrF: "F = ⟨ AF , ΨF ⟩ " and "AF ♯ * Ψ" and "AF ♯ * Ψ'"
by (rule_tac C="(Ψ, Ψ')" in freshFrame) auto
obtain AG ΨG where FrG: "G = ⟨ AG , ΨG ⟩ " and "AG ♯ * Ψ" and "AG ♯ * Ψ'"
by (rule_tac C="(Ψ, Ψ')" in freshFrame) auto
from ‹ Ψ ≃ Ψ'› have "⟨ AF , Ψ' ⊗ ΨF ⟩ ≃ F ⟨ AF , Ψ ⊗ ΨF ⟩ " by (metis frameIntComposition FrameStatEqSym)
moreover from ‹ Ψ ≃ Ψ'› have "⟨ AG , Ψ ⊗ ΨG ⟩ ≃ F ⟨ AG , Ψ' ⊗ ΨG ⟩ " by (rule frameIntComposition)
ultimately have "⟨ AF , Ψ' ⊗ ΨF ⟩ ↪ F ⟨ AG , Ψ' ⊗ ΨG ⟩ " using FeqG FrF FrG ‹ AF ♯ * Ψ› ‹ AG ♯ * Ψ› ‹ Ψ ≃ Ψ'›
by (force simp add: FrameStatEq_def dest: FrameStatImpTrans)
with FrF FrG ‹ AF ♯ * Ψ'› ‹ AG ♯ * Ψ'› show ?thesis by simp
qed
lemma insertAssertionStatEq:
fixes F :: "'b frame"
and Ψ :: 'b
and G :: "'b frame"
and Ψ' :: 'b
assumes FeqG: "insertAssertion F Ψ ≃ F insertAssertion G Ψ"
and "Ψ ≃ Ψ'"
shows "insertAssertion F Ψ' ≃ F insertAssertion G Ψ'"
proof -
obtain AF ΨF where FrF: "F = ⟨ AF , ΨF ⟩ " and "AF ♯ * Ψ" and "AF ♯ * Ψ'"
by (rule_tac C="(Ψ, Ψ')" in freshFrame) auto
obtain AG ΨG where FrG: "G = ⟨ AG , ΨG ⟩ " and "AG ♯ * Ψ" and "AG ♯ * Ψ'"
by (rule_tac C="(Ψ, Ψ')" in freshFrame) auto
from FeqG FrF FrG ‹ AF ♯ * Ψ› ‹ AG ♯ * Ψ› ‹ Ψ ≃ Ψ'›
have "⟨ AF , Ψ' ⊗ ΨF ⟩ ≃ F ⟨ AG , Ψ' ⊗ ΨG ⟩ "
by simp (metis frameIntComposition FrameStatEqTrans FrameStatEqSym)
with FrF FrG ‹ AF ♯ * Ψ'› ‹ AG ♯ * Ψ'› show ?thesis by simp
qed
lemma weakTransitionStatEq:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Ψ' :: 'b
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "Ψ ≃ Ψ'"
shows "Ψ' : Q ⊳ P ==> α ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ==> ^ \ <tau> P''"
and QeqP'': "insertAssertion (extractFrame Q) Ψ ↪ F insertAssertion (extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
from PChain ‹ Ψ ≃ Ψ'› have "Ψ' ⊳ P ==> ^ \ <tau> P''" by (rule tauChainStatEq)
moreover from QeqP'' ‹ Ψ ≃ Ψ'› have "insertAssertion (extractFrame Q) Ψ' ↪ F insertAssertion (extractFrame P'') Ψ'"
by (rule insertAssertionStatImp)
moreover from P''Trans ‹ Ψ ≃ Ψ'› have "Ψ' ⊳ P'' ⟼ α ≺ P'"
by (rule statEqTransition)
ultimately show ?thesis by (rule weakTransitionI)
qed
lemma transitionWeakTransition:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼ α ≺ P'"
and "insertAssertion(extractFrame Q) Ψ ↪ F insertAssertion(extractFrame P) Ψ"
shows "Ψ : Q ⊳ P ==> α ≺ P'"
using assms
by (fastforce intro: weakTransitionI)
lemma weakPar1Guarded:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : R ⊳ P ==> α ≺ P'"
and "bn α ♯ * Q"
and "guarded Q"
shows "Ψ : (R ∥ Q) ⊳ P ∥ Q ==> α ≺ P' ∥ Q"
proof -
obtain AQ ΨQ where FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ " and "AQ ♯ * Ψ" and "AQ ♯ * P" and "AQ ♯ * α" and "AQ ♯ * R"
by (rule_tac C="(Ψ, P, α, R)" in freshFrame) auto
from ‹ guarded Q› FrQ have "ΨQ ≃ 1 " by (blast dest: guardedStatEq)
with PTrans have "Ψ ⊗ ΨQ : R ⊳ P ==> α ≺ P'" by (metis weakTransitionStatEq Identity AssertionStatEqSym compositionSym)
thus ?thesis using FrQ ‹ bn α ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * α› ‹ AQ ♯ * R›
by (rule weakPar1)
qed
lemma weakBang:
fixes Ψ :: 'b
and R :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : R ⊳ P ∥ !P ==> α ≺ P'"
and "guarded P"
shows "Ψ : R ⊳ !P ==> α ≺ P'"
proof -
from PTrans obtain P'' where PChain: "Ψ ⊳ P ∥ !P ==> ^ \ <tau> P''"
and RImpP'': "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame P'') Ψ"
and P''Trans: "Ψ ⊳ P'' ⟼ α ≺ P'"
by (rule weakTransitionE)
moreover obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " and "AP ♯ * Ψ" by (rule freshFrame)
moreover from ‹ guarded P› FrP have "ΨP ≃ 1 " by (blast dest: guardedStatEq)
ultimately show ?thesis
proof (auto simp add: rtrancl_eq_or_trancl)
have "Ψ ⊳ !P ==> ^ \ <tau> !P" by simp
moreover assume RimpP: "insertAssertion(extractFrame R) Ψ ↪ F ⟨ AP , Ψ ⊗ ΨP ⊗ 1 ⟩ "
have "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame(!P)) Ψ"
proof -
from ‹ ΨP ≃ 1 › have "⟨ AP , Ψ ⊗ ΨP ⊗ 1 ⟩ ≃ F ⟨ AP , Ψ ⊗ 1 ⟩ "
by (metis frameIntCompositionSym frameIntAssociativity frameIntCommutativity frameIntIdentity FrameStatEqTrans FrameStatEqSym)
moreover from ‹ AP ♯ * Ψ› have "⟨ AP , Ψ ⊗ 1 ⟩ ≃ F ⟨ ε, Ψ ⊗ 1 ⟩ "
by (force intro: frameResFreshChain)
ultimately show ?thesis using RimpP by (auto simp add: FrameStatEq_def dest: FrameStatImpTrans)
qed
moreover assume "Ψ ⊳ P ∥ !P ⟼ α ≺ P'"
hence "Ψ ⊳ !P ⟼ α ≺ P'" using ‹ guarded P› by (rule Bang)
ultimately show ?thesis by (rule weakTransitionI)
next
fix P'''
assume "Ψ ⊳ P ∥ !P ==> \ <tau> P''"
hence "Ψ ⊳ !P ==> \ <tau> P''" using ‹ guarded P› by (rule tauStepChainBang)
hence "Ψ ⊳ !P ==> ^ \ <tau> P''" by simp
moreover assume "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame P'') Ψ"
and "Ψ ⊳ P'' ⟼ α ≺ P'"
ultimately show ?thesis by (rule weakTransitionI)
qed
qed
lemma weakTransitionFrameImp:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "insertAssertion(extractFrame R) Ψ ↪ F insertAssertion(extractFrame Q) Ψ"
shows "Ψ : R ⊳ P ==> α ≺ P'"
using assms
by (auto simp add: weakTransition_def intro: FrameStatImpTrans)
lemma guardedFrameStatEq:
fixes P :: "('a, 'b, 'c) psi"
assumes "guarded P"
shows "extractFrame P ≃ F ⟨ ε, 1 ⟩ "
proof -
obtain AP ΨP where FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " by (rule freshFrame)
from ‹ guarded P› FrP have "ΨP ≃ 1 " by (blast dest: guardedStatEq)
hence "⟨ AP , ΨP ⟩ ≃ F ⟨ AP , 1 ⟩ " by (rule_tac frameResChainPres) auto
moreover have "⟨ AP , 1 ⟩ ≃ F ⟨ ε, 1 ⟩ " by (rule_tac frameResFreshChain) auto
ultimately show ?thesis using FrP by (force intro: FrameStatEqTrans)
qed
lemma weakGuardedTransition:
fixes Ψ :: 'b
and Q :: "('a, 'b, 'c) psi"
and P :: "('a, 'b, 'c) psi"
and α :: "'a action"
and P' :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes PTrans: "Ψ : Q ⊳ P ==> α ≺ P'"
and "guarded Q"
shows "Ψ : 0 ⊳ P ==> α ≺ P'"
proof -
obtain AQ ΨQ where FrQ: "extractFrame Q = ⟨ AQ , ΨQ ⟩ " and "AQ ♯ * Ψ" by (rule freshFrame)
moreover from ‹ guarded Q› FrQ have "ΨQ ≃ 1 " by (blast dest: guardedStatEq)
hence "⟨ AQ , Ψ ⊗ ΨQ ⟩ ≃ F ⟨ AQ , Ψ ⊗ 1 ⟩ " by (metis frameIntCompositionSym)
moreover from ‹ AQ ♯ * Ψ› have "⟨ AQ , Ψ ⊗ 1 ⟩ ≃ F ⟨ ε, Ψ ⊗ 1 ⟩ " by (rule_tac frameResFreshChain) auto
ultimately have "insertAssertion(extractFrame Q) Ψ ≃ F insertAssertion (extractFrame (0 )) Ψ"
using FrQ ‹ AQ ♯ * Ψ› by simp (blast intro: FrameStatEqTrans)
with PTrans show ?thesis by (rule_tac weakTransitionFrameImp) (auto simp add: FrameStatEq_def)
qed
lemma expandTauChainFrame:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and AP :: "name list"
and ΨP :: 'b
and C :: "'d::fs_name"
assumes PChain: "Ψ ⊳ P ==> ^ \ <tau> P'"
and FrP: "extractFrame P = ⟨ AP , ΨP ⟩ "
and "distinct AP "
and "AP ♯ * P"
and "AP ♯ * C"
obtains Ψ' AP ' ΨP ' where "extractFrame P' = ⟨ AP ', ΨP '⟩ " and "ΨP ⊗ Ψ' ≃ ΨP '" and "AP ' ♯ * P'" and "AP ' ♯ * C" and "distinct AP '"
using PChain FrP ‹ AP ♯ * P›
proof (induct arbitrary: thesis rule: tauChainInduct)
case (TauBase P)
have "ΨP ⊗ SBottom' ≃ ΨP " by (rule Identity)
with ‹ extractFrame P = ⟨ AP , ΨP ⟩ › show ?case using ‹ AP ♯ * P› ‹ AP ♯ * C› ‹ distinct AP › by (rule TauBase)
next
case (TauStep P P' P'')
from ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ AP ♯ * P›
obtain Ψ' AP ' ΨP ' where FrP': "extractFrame P' = ⟨ AP ', ΨP '⟩ " and "ΨP ⊗ Ψ' ≃ ΨP '"
and "AP ' ♯ * P'" and "AP ' ♯ * C" and "distinct AP '"
by (rule_tac TauStep)
from ‹ Ψ ⊳ P' ⟼ τ ≺ P''› FrP' ‹ distinct AP '› ‹ AP ' ♯ * P'› ‹ AP ' ♯ * C›
obtain Ψ'' AP '' ΨP '' where FrP'': "extractFrame P'' = ⟨ AP '', ΨP ''⟩ " and "ΨP ' ⊗ Ψ'' ≃ ΨP ''"
and "AP '' ♯ * P''" and "AP '' ♯ * C" and "distinct AP ''"
by (rule expandTauFrame)
from ‹ ΨP ⊗ Ψ' ≃ ΨP '› have "(ΨP ⊗ Ψ') ⊗ Ψ'' ≃ ΨP ' ⊗ Ψ''" by (rule Composition)
with ‹ ΨP ' ⊗ Ψ'' ≃ ΨP ''› have "ΨP ⊗ Ψ' ⊗ Ψ'' ≃ ΨP ''"
by (metis AssertionStatEqTrans Associativity Commutativity)
with FrP'' show ?case using ‹ AP '' ♯ * P''› ‹ AP '' ♯ * C› ‹ distinct AP ''›
by (rule TauStep)
qed
lemma frameIntImpComposition:
fixes Ψ :: 'b
and Ψ' :: 'b
and AF :: "name list"
and ΨF :: 'b
assumes "Ψ ≃ Ψ'"
shows "⟨ AF , Ψ ⊗ ΨF ⟩ ↪ F ⟨ AF , Ψ' ⊗ ΨF ⟩ "
using assms frameIntComposition
by (simp add: FrameStatEq_def)
lemma tauChainInduct2[consumes 1 , case_names TauBase TauStep]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes PChain: "Ψ ⊳ P ==> ^ \ <tau> P'"
and cBase: "∧ P. Prop P P"
and cStep: "∧ P P' P''. [ Ψ ⊳ P' ⟼ τ ≺ P''; Ψ ⊳ P ==> ^ \ <tau> P'; Prop P P'] ==> Prop P P''"
shows "Prop P P'"
using assms
by (rule tauChainInduct)
lemma tauStepChainInduct2[consumes 1 , case_names TauBase TauStep]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes PChain: "Ψ ⊳ P ==> \ <tau> P'"
and cBase: "∧ P P'. Ψ ⊳ P ⟼ τ ≺ P' ==> Prop P P'"
and cStep: "∧ P P' P''. [ Ψ ⊳ P' ⟼ τ ≺ P''; Ψ ⊳ P ==> \ <tau> P'; Prop P P'] ==> Prop P P''"
shows "Prop P P'"
using assms
by (rule tauStepChainInduct)
lemma weakTransferTauChainFrame:
fixes ΨF :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
and AP :: "name list"
and ΨP :: 'b
and AF :: "name list"
and AG :: "name list"
and ΨG :: 'b
assumes PChain: "ΨF ⊳ P ==> ^ \ <tau> P'"
and FrP: "extractFrame P = ⟨ AP , ΨP ⟩ "
and "distinct AP "
and FeqG: "∧ Ψ. insertAssertion (⟨ AF , ΨF ⊗ ΨP ⟩ ) Ψ ↪ F insertAssertion (⟨ AG , ΨG ⊗ ΨP ⟩ ) Ψ"
and "AF ♯ * ΨG "
and "AG ♯ * Ψ"
and "AG ♯ * ΨF "
and "AF ♯ * AG "
and "AF ♯ * P"
and "AG ♯ * P"
and "AP ♯ * AF "
and "AP ♯ * AG "
and "AP ♯ * ΨF "
and "AP ♯ * ΨG "
and "AP ♯ * P"
shows "ΨG ⊳ P ==> ^ \ <tau> P'"
using PChain FrP ‹ AF ♯ * P› ‹ AG ♯ * P› ‹ AP ♯ * P›
proof (induct rule: tauChainInduct2)
case TauBase
thus ?case by simp
next
case (TauStep P P' P'')
have FrP: "extractFrame P = ⟨ AP , ΨP ⟩ " by fact
then have PChain: "ΨG ⊳ P ==> ^ \ <tau> P'" using ‹ AF ♯ * P› ‹ AG ♯ * P› ‹ AP ♯ * P› by (rule TauStep)
then obtain AP ' ΨP ' Ψ' where FrP': "extractFrame P' = ⟨ AP ', ΨP '⟩ " and "ΨP ⊗ Ψ' ≃ ΨP '"
and "AP ' ♯ * AF " and "AP ' ♯ * AG " and "AP ' ♯ * ΨF " and "AP ' ♯ * ΨG "
and "distinct AP '"
using FrP ‹ distinct AP › ‹ AP ♯ * P› ‹ AP ♯ * AF › ‹ AP ♯ * AG › ‹ AP ♯ * ΨF › ‹ AP ♯ * ΨG ›
by (rule_tac C="(AF , AG , ΨF , ΨG )" in expandTauChainFrame) auto
from PChain ‹ AF ♯ * P› ‹ AG ♯ * P› have "AF ♯ * P'" and "AG ♯ * P'" by (blast dest: tauChainFreshChain)+
with ‹ AF ♯ * P› ‹ AG ♯ * P› ‹ AP ♯ * AF › ‹ AP ♯ * AG › \<open >AP ' ♯ * AF › ‹ AP ' ♯ * AG › FrP FrP'
have " A \ < ^ sub > F \ < sharp > * \ < Psi > \ < ^ sub > P " and " A \ < ^ sub > G \ < sharp > * \ < Psi > \ < ^ sub > P " and " A \ < ^ sub > F \ < sharp > * \ < Psi > \ < ^ sub > P ' " and " A \ < ^ sub > G \ < sharp > * \ < Psi > \ < ^ sub > P ' "
by ( auto dest : extractFrameFreshChain )
from FeqG have FeqG : " insertAssertion ( \ < langle > A \ < ^ sub > F , \ < Psi > \ < ^ sub > F \ < otimes > \ < Psi > \ < ^ sub > P \ < rangle > ) \ < Psi > ' \ < hookrightarrow > \ < ^ sub > F insertAssertion ( \ < langle > A \ < ^ sub > G , \ < Psi > \ < ^ sub > G \ < otimes > \ < Psi > \ < ^ sub > P \ < rangle > ) \ < Psi > ' "
by blast
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > F " and " ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > P ' " and " ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > ' "
and Sp : " ( set p ) \ < subseteq > set A \ < ^ sub > F \ < times > set ( p \ < bullet > A \ < ^ sub > F ) " and " distinctPerm p "
by ( rule_tac xvec = A \ < ^ sub > F and c = " ( \ < Psi > \ < ^ sub > F , \ < Psi > \ < ^ sub > P , \ < Psi > ' , \ < Psi > \ < ^ sub > P ' ) " in name_list_avoiding ) auto
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > G " and " ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > P ' " and " ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > ' "
and Sq : " ( set q ) \ < subseteq > set A \ < ^ sub > G \ < times > set ( q \ < bullet > A \ < ^ sub > G ) " and " distinctPerm q "
by ( rule_tac xvec = A \ < ^ sub > G and c = " ( \ < Psi > \ < ^ sub > G , \ < Psi > \ < ^ sub > P , \ < Psi > ' , \ < Psi > \ < ^ sub > P ' ) " in name_list_avoiding ) auto
from \ < open > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > ' \ < simeq > \ < Psi > \ < ^ sub > P ' \ < close > have " \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , ( ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ' ) \ < rangle > \ < simeq > \ < ^ sub > F \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > ' ) \ < rangle > "
by ( rule frameIntCompositionSym [ OF AssertionStatEqSym ] )
hence " \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > \ < simeq > \ < ^ sub > F \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , \ < Psi > ' \ < otimes > ( ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( metis frameIntAssociativity FrameStatEqTrans frameIntCommutativity FrameStatEqSym )
moreover from FeqG \ < open > A \ < ^ sub > F \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > F \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > ' \ < close > Sp
have " \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , \ < Psi > ' \ < otimes > ( ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rangle > \ < hookrightarrow > \ < ^ sub > F insertAssertion ( \ < langle > A \ < ^ sub > G , \ < Psi > \ < ^ sub > G \ < otimes > \ < Psi > \ < ^ sub > P \ < rangle > ) \ < Psi > ' "
apply ( erule_tac rev_mp ) by ( subst frameChainAlpha ) ( auto simp add : eqvts )
hence " \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , \ < Psi > ' \ < otimes > ( ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rangle > \ < hookrightarrow > \ < ^ sub > F ( \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , \ < Psi > ' \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P \ < rangle > ) "
using \ < open > A \ < ^ sub > G \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > G \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > ' \ < close > Sq
apply ( erule_tac rev_mp ) by ( subst frameChainAlpha ) ( auto simp add : eqvts )
moreover have " \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , \ < Psi > ' \ < otimes > ( ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rangle > \ < simeq > \ < ^ sub > F \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > ' ) \ < rangle > "
by ( metis frameIntAssociativity FrameStatEqTrans frameIntCommutativity FrameStatEqSym )
hence " \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , \ < Psi > ' \ < otimes > ( ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rangle > \ < simeq > \ < ^ sub > F \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > " using \ < open > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > ' \ < simeq > \ < Psi > \ < ^ sub > P ' \ < close >
by ( blast intro : FrameStatEqTrans frameIntCompositionSym )
ultimately have " \ < langle > ( p \ < bullet > A \ < ^ sub > F ) , ( p \ < bullet > \ < Psi > \ < ^ sub > F ) \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > \ < hookrightarrow > \ < ^ sub > F \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > "
by ( rule FrameStatEqImpCompose )
with \ < open > A \ < ^ sub > F \ < sharp > * \ < Psi > \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > F ) \ < sharp > * \ < Psi > \ < ^ sub > F \ < close > Sp have " \ < langle > A \ < ^ sub > F , \ < Psi > \ < ^ sub > F \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > \ < hookrightarrow > \ < ^ sub > F \ < langle > ( q \ < bullet > A \ < ^ sub > G ) , ( q \ < bullet > \ < Psi > \ < ^ sub > G ) \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > "
by ( subst frameChainAlpha ) ( auto simp add : eqvts )
with \ < open > A \ < ^ sub > G \ < sharp > * \ < Psi > \ < ^ sub > P ' \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > P ' \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > G ) \ < sharp > * \ < Psi > \ < ^ sub > G \ < close > Sq have " \ < langle > A \ < ^ sub > F , \ < Psi > \ < ^ sub > F \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > \ < hookrightarrow > \ < ^ sub > F \ < langle > A \ < ^ sub > G , \ < Psi > \ < ^ sub > G \ < otimes > \ < Psi > \ < ^ sub > P ' \ < rangle > "
by ( subst frameChainAlpha ) ( auto simp add : eqvts )
with \ < open > \ < Psi > \ < ^ sub > F \ < rhd > P ' \ < longmapsto > \ < tau > \ < prec > P ' ' \ < close > FrP ' \ < open > distinct A \ < ^ sub > P ' \ < close >
\ < open > A \ < ^ sub > F \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > G \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > F \ < sharp > * \ < Psi > \ < ^ sub > G \ < close > \ < open > A \ < ^ sub > G \ < sharp > * \ < Psi > \ < ^ sub > F \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > F \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > G \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < ^ sub > F \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < ^ sub > G \ < close >
have " \ < Psi > \ < ^ sub > G \ < rhd > P ' \ < longmapsto > \ < tau > \ < prec > P ' ' " by ( rule_tac transferTauFrame )
with PChain show ? case by ( simp add : r_into_rtrancl rtrancl_into_rtrancl )
qed
coinductive quiet : : " ( ' a , ' b , ' c ) psi \ < Rightarrow > bool "
where " \ < lbrakk > \ < forall > \ < Psi > . ( insertAssertion ( extractFrame P ) \ < Psi > \ < simeq > \ < ^ sub > F \ < langle > \ < epsilon > , \ < Psi > \ < rangle > \ < and >
( \ < forall > Rs . \ < Psi > \ < rhd > P \ < longmapsto > Rs \ < longrightarrow > ( \ < exists > P ' . Rs = \ < tau > \ < prec > P ' \ < and > quiet P ' ) ) ) \ < rbrakk > \ < Longrightarrow > quiet P "
lemma quietFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
assumes " quiet P "
shows " insertAssertion ( extractFrame P ) \ < Psi > \ < simeq > \ < ^ sub > F \ < langle > \ < epsilon > , \ < Psi > \ < rangle > "
using assms
by ( erule_tac quiet . cases ) force
lemma quietTransition :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Rs : : " ( ' a , ' b , ' c ) residual "
assumes " quiet P "
and " \ < Psi > \ < rhd > P \ < longmapsto > Rs "
obtains P ' where " Rs = \ < tau > \ < prec > P ' " and " quiet P ' "
using assms
by ( erule_tac quiet . cases ) force
lemma quietEqvt :
fixes P : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
assumes " quiet P "
shows " quiet ( p \ < bullet > P ) "
proof -
let ? X = " \ < lambda > P . \ < exists > p : : name prm . quiet ( p \ < bullet > P ) "
from assms have " ? X ( p \ < bullet > P ) " by ( rule_tac x = " rev p " in exI ) auto
thus ? thesis
apply coinduct
apply ( clarify )
apply ( rule_tac x = x in exI )
apply auto
apply ( drule_tac \ < Psi > = " p \ < bullet > \ < Psi > " in quietFrame )
apply ( drule_tac p = " rev p " in FrameStatEqClosed )
apply ( simp add : eqvts )
apply ( drule_tac pi = p in semantics . eqvt )
apply ( erule_tac quietTransition )
apply assumption
apply ( rule_tac x = " rev p \ < bullet > P ' " in exI )
apply auto
apply ( drule_tac pi = " rev p " in pt_bij3 )
apply ( simp add : eqvts )
apply ( rule_tac x = p in exI )
by simp
qed
lemma quietOutput :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " quiet P "
shows False
using assms
apply ( erule_tac quiet . cases )
by ( force simp add : residualInject )
lemma quietInput :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " quiet P "
shows False
using assms
by ( erule_tac quiet . cases ) ( force simp add : residualInject )
lemma quietTau :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and " insertAssertion ( extractFrame P ) \ < Psi > \ < simeq > \ < ^ sub > F \ < langle > \ < epsilon > , \ < Psi > \ < rangle > "
and " quiet P "
shows " quiet P ' "
using assms
by ( erule_tac quiet . cases ) ( force simp add : residualInject )
lemma tauChainCases [ consumes 1 , case_names TauBase TauStep ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes " \ < Psi > \ < rhd > P \ < Longrightarrow > \ < ^ sup > ^ \ < ^ sub > \ < tau > P ' "
and " P = P ' \ < Longrightarrow > Prop "
and " \ < Psi > \ < rhd > P \ < Longrightarrow > \ < ^ sub > \ < tau > P ' \ < Longrightarrow > Prop "
shows Prop
using assms
by ( blast elim : rtranclE dest : rtrancl_into_trancl1 )
end
end
Messung V0.5 in Prozent C=91 H=98 G=94
¤ Dauer der Verarbeitung: 0.50 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland