Theory Weak_Late_Semantics
theory Weak_Late_Semantics
imports Weak_Late_Step_Semantics
begin
definition weakTransition :: "(pi × residual) set"
where "weakTransition ≡ Weak_Late_Step_Semantics.transition ∪ {x. ∃P. x = (P, τ ≺ P)}"
abbreviation weakLateTransition_judge :: "pi ⇒ residual ⇒ bool" ("_ ⟹⇩l⇧^_" [80, 80] 80)
where "P ⟹⇩l⇧^Rs ≡ (P, Rs) ∈ weakTransition"
lemma transitionI:
fixes P :: pi
and Rs :: residual
and P' :: pi
shows "P ⟹⇩l Rs ⟹ P ⟹⇩l⇧^Rs"
and "P ⟹⇩l⇧^τ ≺ P"
proof -
assume "P ⟹⇩l Rs"
thus "P ⟹⇩l⇧^Rs" by(simp add: weakTransition_def)
next
show "P ⟹⇩l⇧^τ ≺ P" by(simp add: weakTransition_def)
qed
lemma transitionCases[consumes 1, case_names Step Stay]:
fixes P :: pi
and Rs :: residual
and P' :: pi
assumes "P ⟹⇩l⇧^ Rs"
and "P ⟹⇩l Rs ⟹ F Rs"
and "Rs = τ ≺ P ⟹ F (τ ≺ P)"
shows "F Rs"
using assms
by(auto simp add: weakTransition_def)
lemma singleActionChain:
fixes P :: pi
and α :: freeRes
and P' :: pi
assumes "P ⟼α ≺ P'"
shows "P ⟹⇩l⇧^(α ≺ P')"
using assms
by(auto intro: Weak_Late_Step_Semantics.singleActionChain
simp add: weakTransition_def)
lemma Tau:
fixes P :: pi
shows "τ.(P) ⟹⇩l⇧^ τ ≺ P"
by(auto intro: Weak_Late_Step_Semantics.Tau
simp add: weakTransition_def)
lemma Output:
fixes a :: name
and b :: name
and P :: pi
shows "a{b}.P ⟹⇩l⇧^a[b] ≺ P"
by(auto intro: Weak_Late_Step_Semantics.Output
simp add: weakTransition_def)
lemma Match:
fixes a :: name
and P :: pi
and b :: name
and x :: name
and P' :: pi
and α :: freeRes
shows "P ⟹⇩l⇧^b<νx> ≺ P' ⟹ [a⌢a]P ⟹⇩l⇧^b<νx> ≺ P'"
and "P ⟹⇩l⇧^α ≺ P' ⟹ P ≠ P' ⟹ [a⌢a]P ⟹⇩l⇧^α ≺ P'"
by(auto simp add: residual.inject weakTransition_def intro: Weak_Late_Step_Semantics.Match)
lemma Mismatch:
fixes a :: name
and c :: name
and P :: pi
and b :: name
and x :: name
and P' :: pi
and α :: freeRes
shows "⟦P ⟹⇩l⇧^b<νx> ≺ P'; a ≠ c⟧ ⟹ [a≠c]P ⟹⇩l⇧^b<νx> ≺ P'"
and "P ⟹⇩l⇧^α ≺ P' ⟹ P ≠ P' ⟹ a ≠ c ⟹ [a≠c]P ⟹⇩l⇧^α ≺ P'"
by(auto simp add: residual.inject weakTransition_def intro: Weak_Late_Step_Semantics.Mismatch)
lemma Open:
fixes P :: pi
and a :: name
and b :: name
and P' :: pi
assumes Trans: "P ⟹⇩l⇧^a[b] ≺ P'"
and aInEqb: "a ≠ b"
shows "<νb>P ⟹⇩l⇧^a<νb> ≺ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.Open
simp add: weakTransition_def residual.inject)
lemma Par1B:
fixes P :: pi
and a :: name
and x :: name
and P' :: pi
assumes PTrans: "P ⟹⇩l⇧^a<νx> ≺ P'"
and xFreshQ: "x ♯ Q"
shows "P ∥ Q ⟹⇩l⇧^a<νx> ≺ (P' ∥ Q)"
using assms
by(auto intro: Weak_Late_Step_Semantics.Par1B
simp add: weakTransition_def residual.inject)
lemma Par1F:
fixes P :: pi
and α :: freeRes
and P' :: pi
assumes PTrans: "P ⟹⇩l⇧^α ≺ P'"
shows "P ∥ Q ⟹⇩l⇧^α ≺ (P' ∥ Q)"
using assms
by(auto intro: Weak_Late_Step_Semantics.Par1F
simp add: weakTransition_def residual.inject)
lemma Par2B:
fixes Q :: pi
and a :: name
and x :: name
and Q' :: pi
assumes QTrans: "Q ⟹⇩l⇧^a<νx> ≺ Q'"
and xFreshP: "x ♯ P"
shows "P ∥ Q ⟹⇩l⇧^a<νx> ≺ (P ∥ Q')"
using assms
by(auto intro: Weak_Late_Step_Semantics.Par2B
simp add: weakTransition_def residual.inject)
lemma Par2F:
fixes Q :: pi
and α :: freeRes
and Q' :: pi
assumes QTrans: "Q ⟹⇩l⇧^α ≺ Q'"
shows "P ∥ Q ⟹⇩l⇧^α ≺ (P ∥ Q')"
using assms
by(auto intro: Weak_Late_Step_Semantics.Par2F
simp add: weakTransition_def residual.inject)
lemma Comm1:
fixes P :: pi
and a :: name
and b :: name
and P'' :: pi
and P' :: pi
and Q :: pi
and Q' :: pi
assumes PTrans: "P ⟹⇩lb in P''→a<x> ≺ P'"
and QTrans: "Q ⟹⇩l⇧^a[b] ≺ Q'"
shows "P ∥ Q ⟹⇩l⇧^τ ≺ P' ∥ Q'"
using assms
by(auto intro: Weak_Late_Step_Semantics.Comm1
simp add: weakTransition_def residual.inject)
lemma Comm2:
fixes P :: pi
and a :: name
and b :: name
and Q'' :: pi
and P' :: pi
and Q :: pi
and Q' :: pi
assumes PTrans: "P ⟹⇩l⇧^a[b] ≺ P'"
and QTrans: "Q ⟹⇩lb in Q''→a<x> ≺ Q'"
shows "P ∥ Q ⟹⇩l⇧^τ ≺ P' ∥ Q'"
using assms
by(auto intro: Weak_Late_Step_Semantics.Comm2
simp add: weakTransition_def residual.inject)
lemma Close1:
fixes P :: pi
and y :: name
and P'' :: pi
and a :: name
and x :: name
and P' :: pi
and Q :: pi
and Q' :: pi
assumes PTrans: "P ⟹⇩ly in P''→a<x> ≺ P'"
and QTrans: "Q ⟹⇩l⇧^a<νy> ≺ Q'"
and xFreshP: "y ♯ P"
and xFreshQ: "y ♯ Q"
shows "P ∥ Q ⟹⇩l⇧^τ ≺ <νy>(P' ∥ Q')"
using assms
by(auto intro: Weak_Late_Step_Semantics.Close1
simp add: weakTransition_def residual.inject)
lemma Close2:
fixes P :: pi
and a :: name
and x :: name
and P' :: pi
and Q :: pi
and y :: name
and Q'' :: pi
and Q' :: pi
assumes PTrans: "P ⟹⇩l⇧^a<νy> ≺ P'"
and QTrans: "Q ⟹⇩ly in Q''→a<x> ≺ Q'"
and xFreshP: "y ♯ P"
and xFreshQ: "y ♯ Q"
shows "P ∥ Q ⟹⇩l⇧^τ ≺ <νy>(P' ∥ Q')"
using assms
by(auto intro: Weak_Late_Step_Semantics.Close2
simp add: weakTransition_def residual.inject)
lemma ResF:
fixes P :: pi
and α :: freeRes
and P' :: pi
and x :: name
assumes PTrans: "P ⟹⇩l⇧^α ≺ P'"
and xFreshAlpha: "x ♯ α"
shows "<νx>P ⟹⇩l⇧^α ≺ <νx>P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.ResF
simp add: weakTransition_def residual.inject)
lemma ResB:
fixes P :: pi
and a :: name
and x :: name
and P' :: pi
and y :: name
assumes PTrans: "P ⟹⇩l⇧^a<νx> ≺ P'"
and yineqa: "y ≠ a"
and yineqx: "y ≠ x"
and xFreshP: "x ♯ P"
shows "<νy>P ⟹⇩l⇧^a<νx> ≺ (<νy>P')"
using assms
by(auto intro: Weak_Late_Step_Semantics.ResB
simp add: weakTransition_def residual.inject)
lemma Bang:
fixes P :: pi
and Rs :: residual
assumes "P ∥ !P ⟹⇩l⇧^ Rs"
and "Rs ≠ τ ≺ P ∥ !P"
shows "!P ⟹⇩l⇧^ Rs"
using assms
by(auto intro: Weak_Late_Step_Semantics.Bang
simp add: weakTransition_def residual.inject)
lemma tauTransitionChain:
fixes P :: pi
and P' :: pi
assumes "P ⟹⇩l⇧^τ ≺ P'"
shows "P ⟹⇩τ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.tauTransitionChain
simp add: weakTransition_def residual.inject transition_def)
lemma chainTransitionAppend:
fixes P :: pi
and P' :: pi
and Rs :: residual
and a :: name
and x :: name
and P'' :: pi
and α :: freeRes
shows "P ⟹⇩τ P' ⟹ P' ⟹⇩l⇧^ Rs ⟹ P ⟹⇩l⇧^ Rs"
and "P ⟹⇩l⇧^a<νx> ≺ P'' ⟹ P'' ⟹⇩τ P' ⟹ x ♯ P ⟹ P ⟹⇩l⇧^a<νx> ≺ P'"
and "P ⟹⇩l⇧^α ≺ P'' ⟹ P'' ⟹⇩τ P' ⟹ P ⟹⇩l⇧^α ≺ P'"
proof -
assume "P ⟹⇩τ P'" and "P' ⟹⇩l⇧^ Rs"
thus "P ⟹⇩l⇧^ Rs"
by(auto intro: Weak_Late_Step_Semantics.chainTransitionAppend
Weak_Late_Step_Semantics.tauActionChain
simp add: weakTransition_def residual.inject)
next
assume "P ⟹⇩l⇧^a<νx> ≺ P''" and "P'' ⟹⇩τ P'" and "x ♯ P"
thus "P ⟹⇩l⇧^a<νx> ≺ P'"
by(auto intro: Weak_Late_Step_Semantics.chainTransitionAppend
simp add: weakTransition_def residual.inject)
next
assume "P ⟹⇩l⇧^α ≺ P''" and "P'' ⟹⇩τ P'"
thus "P ⟹⇩l⇧^α ≺ P'"
apply(case_tac "P''=P'")
by(auto dest: Weak_Late_Step_Semantics.chainTransitionAppend
Weak_Late_Step_Semantics.tauActionChain
simp add: weakTransition_def residual.inject)
qed
lemma weakEqWeakTransitionAppend:
fixes P :: pi
and P' :: pi
and α :: freeRes
and P'' :: pi
assumes PTrans: "P ⟹⇩lτ ≺ P'"
and P'Trans: "P' ⟹⇩l⇧^α ≺ P''"
shows "P ⟹⇩lα ≺ P''"
proof(cases "α=τ")
assume alphaEqTau: "α = τ"
with P'Trans have "P' ⟹⇩τ P''" by(blast intro: tauTransitionChain)
with PTrans alphaEqTau show ?thesis
by(blast intro: Weak_Late_Step_Semantics.chainTransitionAppend)
next
assume alphaIneqTau: "α ≠ τ"
from PTrans have "P ⟹⇩τ P'" by(rule Weak_Late_Step_Semantics.tauTransitionChain)
moreover from P'Trans alphaIneqTau have "P' ⟹⇩lα ≺ P''"
by(auto simp add: weakTransition_def residual.inject)
ultimately show ?thesis
by(rule Weak_Late_Step_Semantics.chainTransitionAppend)
qed
lemma freshBoundOutputTransition:
fixes P :: pi
and a :: name
and x :: name
and P' :: pi
and c :: name
assumes PTrans: "P ⟹⇩l⇧^a<νx> ≺ P'"
and cFreshP: "c ♯ P"
and cineqx: "c ≠ x"
shows "c ♯ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.freshBoundOutputTransition
simp add: weakTransition_def residual.inject)
lemma freshTauTransition:
fixes P :: pi
and c :: name
assumes PTrans: "P ⟹⇩l⇧^τ ≺ P'"
and cFreshP: "c ♯ P"
shows "c ♯ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.freshTauTransition
simp add: weakTransition_def residual.inject)
lemma freshOutputTransition:
fixes P :: pi
and a :: name
and b :: name
and P' :: pi
and c :: name
assumes PTrans: "P ⟹⇩l⇧^a[b] ≺ P'"
and cFreshP: "c ♯ P"
shows "c ♯ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.freshOutputTransition
simp add: weakTransition_def residual.inject)
lemma eqvtI:
fixes P :: pi
and Rs :: residual
and perm :: "name prm"
assumes "P ⟹⇩l⇧^ Rs"
shows "(perm ∙ P) ⟹⇩l⇧^ (perm ∙ Rs)"
using assms
by(auto intro: Weak_Late_Step_Semantics.eqvtI
simp add: weakTransition_def residual.inject)
lemma freshInputTransition:
fixes P :: pi
and a :: name
and b :: name
and P' :: pi
and c :: name
assumes PTrans: "P ⟹⇩l⇧^a<b> ≺ P'"
and cFreshP: "c ♯ P"
and cineqb: "c ≠ b"
shows "c ♯ P'"
using assms
by(auto intro: Weak_Late_Step_Semantics.freshInputTransition
simp add: weakTransition_def residual.inject)
lemmas freshTransition = freshBoundOutputTransition freshOutputTransition
freshInputTransition freshTauTransition
end