Theory Weak_Bisim_Pres
theory Weak_Bisim_Pres
imports Weak_Bisim Weak_Sim_Pres Strong_Bisim_SC
begin
lemma actPres:
fixes P :: ccs
and Q :: ccs
and α :: act
assumes "P ≈ Q"
shows "α.(P) ≈ α.(Q)"
proof -
let ?X = "{(α.(P), α.(Q)) | P Q. P ≈ Q}"
from assms have "(α.(P), α.(Q)) ∈ ?X" by auto
thus ?thesis
by(coinduct rule: weakBisimulationCoinduct) (auto dest: weakBisimulationE intro: actPres)
qed
lemma parPres:
fixes P :: ccs
and Q :: ccs
and R :: ccs
assumes "P ≈ Q"
shows "P ∥ R ≈ Q ∥ R"
proof -
let ?X = "{(P ∥ R, Q ∥ R) | P Q R. P ≈ Q}"
from assms have "(P ∥ R, Q ∥ R) ∈ ?X" by blast
thus ?thesis
by(coinduct rule: weakBisimulationCoinduct, auto)
(blast intro: parPres dest: weakBisimulationE)+
qed
lemma resPres:
fixes P :: ccs
and Q :: ccs
and x :: name
assumes "P ≈ Q"
shows "⦇νx⦈P ≈ ⦇νx⦈Q"
proof -
let ?X = "{(⦇νx⦈P, ⦇νx⦈Q) | x P Q. P ≈ Q}"
from assms have "(⦇νx⦈P, ⦇νx⦈Q) ∈ ?X" by auto
thus ?thesis
by(coinduct rule: weakBisimulationCoinduct) (auto intro: resPres dest: weakBisimulationE)
qed
lemma bangPres:
fixes P :: ccs
and Q :: ccs
assumes "P ≈ Q"
shows "!P ≈ !Q"
proof -
let ?X = "bangRel weakBisimulation"
let ?Y = "weakBisimulation O ?X O bisim"
{
fix R T P Q
assume "R ≈ T" and "(P, Q) ∈ ?Y"
from ‹(P, Q) ∈ ?Y› obtain P' Q' where "P ≈ P'" and "(P', Q') ∈ ?X" and "Q' ∼ Q"
by auto
from ‹P ≈ P'› have "R ∥ P ≈ R ∥ P'"
by(metis parPres bisimWeakBisimulation transitive parComm)
moreover from ‹R ≈ T› ‹(P', Q') ∈ ?X› have "(R ∥ P', T ∥ Q') ∈ ?X" by(auto dest: BRPar)
moreover from ‹Q' ∼ Q› have "T ∥ Q' ∼ T ∥ Q" by(metis Strong_Bisim_Pres.parPres Strong_Bisim.transitive parComm)
ultimately have "(R ∥ P, T ∥ Q) ∈ ?Y" by auto
} note BRParAux = this
from assms have "(!P, !Q) ∈ ?X" by(auto intro: BRBang)
thus ?thesis
proof(coinduct rule: weakBisimWeakUpto)
case(cSim P Q)
from ‹(P, Q) ∈ bangRel weakBisimulation› show ?case
proof(induct)
case(BRBang P Q)
note ‹P ≈ Q› weakBisimulationE(1) BRParAux
moreover have "?X ⊆ ?Y" by(auto intro: Strong_Bisim.reflexive reflexive)
moreover {
fix P Q
assume "(P ∥ !P, Q) ∈ ?Y"
hence "(!P, Q) ∈ ?Y" using bangUnfold
by(blast dest: Strong_Bisim.transitive transitive bisimWeakBisimulation)
}
ultimately show ?case by(rule bangPres)
next
case(BRPar R T P Q)
from ‹R ≈ T› have "R ↝⇧^<weakBisimulation> T" by(rule weakBisimulationE)
moreover note ‹R ≈ T› ‹P ↝⇧^<?Y> Q›
moreover from ‹(P, Q) ∈ ?X› have "(P, Q) ∈ ?Y" by(blast intro: Strong_Bisim.reflexive reflexive)
ultimately show ?case using BRParAux by(rule Weak_Sim_Pres.parPresAux)
qed
next
case(cSym P Q)
thus ?case
by induct (auto dest: weakBisimulationE intro: BRPar BRBang)
qed
qed
end