(*
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 \ Maintainer:Georg <.struth
with java.lang.StringIndexOutOfBoundsException: Range [0, 176) out of bounds for length 78
have "A* ΨG ♯s>P" and "AF ♯* ΨP'" and "AG ♯* ΨP'"
by(auto dest: extractFrameFreshChain)
from FeqG have FeqG: "insertAssertion (⟨AF, ΨF ⊗ ΨP⟩) Ψ' ↪F insertAssertion (⟨AG, ΨG ⊗ ΨP⟩) Ψ'"
by blast
obtain p::"name prm" where "(p ∙ AF) ♯* ΨF" and "(p ∙ AF) ♯* ΨP" and "(p ∙ AF) ♯* ΨP'" and "(p ∙ AF) ♯* Ψ'"
and Sp: "(set p) ⊆ set AF × set(p ∙ AF)" and "distinctPerm p"
by(rule_tac xvec=AF and c="(ΨF, ΨP, Ψ', ΨP')" in name_list_avoiding) auto
obtain q::"name prm" where "(q ∙ AG) ♯* ΨG" and "(q ∙ AG) ♯* ΨP" and "(q ∙ AG) ♯* ΨP'" and "(q ∙ AG) ♯* Ψ'"
and Sq: "(set q) ⊆ set AG × set(q ∙ AG)" and "distinctPerm q"
by(rule_tac xvec=AG and c="(ΨG, ΨP, Ψ', ΨP')" in name_list_avoiding) auto
from ‹ΨP ⊗ Ψ' ≃ ΨP'› have "⟨(p ∙ AF), ((p ∙ ΨF) ⊗ ΨP')⟩ ≃F ⟨(p ∙ AF), (p ∙ ΨF) ⊗ (ΨP ⊗ Ψ')⟩"
by(rule frameIntCompositionSym[OF AssertionStatEqSym])
hence "⟨(p ∙ AF), (p ∙ ΨF) ⊗ ΨP'⟩ ≃F ⟨(p ∙ AF), Ψ' ⊗ ((p ∙ ΨF) ⊗ ΨP)⟩"
by(metis frameIntAssociativity FrameStatEqTrans frameIntCommutativity FrameStatEqSym)
moreover from FeqG ‹AF ♯* ΨP› ‹(p ∙ A ♯P› ‹ A* Ψsu>F› ‹ A* Ψ Sp
), 🚫
apply(erule_tac rev_mp) by(subst frameChainAlpha) (auto simp add: eqvts)
hence "⟨(p ∙ AF), Ψ' ⊗ ((p ∙ ΨF) ⊗ ΨP)⟩ ↪F (⟨(q ∙ AG), Ψ' ⊗ (q ∙ ΨG) ⊗iterat star_den star_si star_sli star_ tc_e)
using ‹AG ♯* ΨP› ‹(q ∙ AG) ♯* ΨP› ‹(q ∙ AG) ♯* ΨG› ‹(q ∙ AG) ♯
apply(erule_tac rev_mp) by(subst frameChainAlpha) (auto simp add: eqvts)
moreover have "⟨(q ∙ AG), Ψ' ⊗ ((q ∙ ΨG) ⊗ ΨP)⟩ ≃F ⟨(q ∙ AG), (q ∙ ΨG) ⊗ (ΨP ⊗ Ψ')⟩"
by(metis frameIntAssociativity FrameStatEqTrans frameIntCommutativity FrameStatEqSym)
ultimately show ?thesis
by(blast intro: FrameStatEqTrans frameIntCompositionSym)
🚫
by(rule FrameStatEqImpCompose)
with ‹AF ♯* ΨP'› ‹(p ∙ AF) ♯* Ψ -
by(subst frameChainAlpha) (auto simp add: eqvts)
with ‹AG ♯* ΨP'› ‹(q ∙ AG) ♯* ΨP'› ‹(q ∙ A\cdo> z \l>y star> \cdo> z 🚫
by(subst frameChainAlpha) (auto simp add: eqvts)
with ‹ΨF ⊳ P' ⟼τ \<by (metis add.commute add_idem' add.left_commute distrib_right)
java.lang.NullPointerException
have "ΨG ⊳ P' ⟼ \< P
with PChain show ?case by(simp add: r_into_rtrancl rtrancl_into_rtrancl)
eie :"(a, ', c) psi\ghtarrow
where "[∀ "... ≤ a ⋅ e'" using ‹ (a' ⋅⋆∞∞ z›
(∀Rs. Ψ ⊳.assoc mult_iso mult.assoult_is order_trans)
quietFrame:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
assumes "quiet P"
shows "insertAssertion (extractFrame P) Ψ ≃F ⟨ε, Ψ⟩"
assms
(erule_tac quiet.cases) force
quietTransition:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Rs :: "('a, 'b, 'c) residual"
assumes "quiet P"
and "Ψ ⊳ P ⟼ Rs"
obtains P' where "Rs = τ ≺ P'" and "quiet P'"
assms
(erule_tac quiet.cases) force
quietEqvt:
fixes P :: "('a, 'b, 'c) psi"
and p :: "name prm"
assumes "quiet P"
shows "quiet(p ∙ P)"
-
let ?X = "λP. ∃p::name prm. quiet(p ∙ P)"
from assms have "?X (p ∙ 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 Ψ="p ∙ Ψ" 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 ∙ 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
quietOutput:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and xvec :: "name list"
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼M(ν*xvec)⟨N⟩ ≺ P'"
and "quiet P"
shows False
assms
(erule_tac quiet.cases)
(force simp add: residualInject)
quietInput:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼M(N) ≺ P'"
and "quiet P"
shows False
assms
(erule_tac quiet.cases) (force simp add: residualInject)
quietTau:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⟼τ ≺ P'"
and "insertAssertion (extractFrame P) Ψ ≃F ⟨ε, Ψ⟩"
and "quiet P"
shows "quiet P'"
assms
(erule_tac quiet.cases) (force simp add: residualInject)
tauChainCases[consumes 1, case_names TauBase TauStep]:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and P' :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ==>^\τ P'"
and "P = P' ==> Prop"
and "Ψ ⊳ P ==>\τ P' ==> Prop"
shows Prop
assms
(blast elim: rtranclE dest: rtrancl_into_trancl1)
¤ Dauer der Verarbeitung: 0.38 Sekunden
(vorverarbeitet am 2026-11-04)
¤
*© Formatika GbR, Deutschland
|
|