Theory Strong_Early_Bisim_SC

(* 
   Title: The pi-calculus   
   Author/Maintainer: Jesper Bengtson (jebe.dk), 2012
*)
theory Strong_Early_Bisim_SC
  imports Strong_Early_Bisim Strong_Late_Bisim_SC Strong_Early_Late_Comp
begin

(******** Structural Congruence **********)

(******** The ν-operator *****************)

lemma resComm:
  fixes P :: pi
  
  shows "<νa><νb>P ∼e <νb><νa>P"
proof -
  have "<νa><νb>P ∼l <νb><νa>P" by(rule Strong_Late_Bisim_SC.resComm)
  thus ?thesis by(rule lateEarlyBisim)
qed

(******** Match *********)

lemma matchId:
  fixes a :: name
  and   P :: pi

  shows "[a⌢a]P ∼e P"
proof -
  have "[a⌢a]P ∼l P" by(rule Strong_Late_Bisim_SC.matchId)
  thus ?thesis by(rule lateEarlyBisim)
qed

(******** Mismatch *********)

lemma mismatchId:
  fixes a :: name
  and   b :: name
  and   P :: pi

  assumes "a ≠ b"

  shows "[a≠b]P ∼e P"
proof -
  from assms have "[a≠b]P ∼l P" by(rule Strong_Late_Bisim_SC.mismatchId)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma mismatchNil:
  fixes a :: name
  and   P :: pi
  
  shows "[a≠a]P ∼e 𝟬"
proof -
  have "[a≠a]P ∼l 𝟬" by(rule Strong_Late_Bisim_SC.mismatchNil)
  thus ?thesis by(rule lateEarlyBisim)
qed

(******** The +-operator *********)

lemma sumSym:
  fixes P :: pi
  and   Q :: pi
  
  shows "P ⊕ Q ∼e Q ⊕ P"
proof -
  have "P ⊕ Q ∼l Q ⊕ P" by(rule Strong_Late_Bisim_SC.sumSym)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma sumAssoc:
  fixes P :: pi
  and   Q :: pi
  and   R :: pi
  
  shows "(P ⊕ Q) ⊕ R ∼e P ⊕ (Q ⊕ R)"
proof -
  have "(P ⊕ Q) ⊕ R ∼l P ⊕ (Q ⊕ R)" by(rule Strong_Late_Bisim_SC.sumAssoc)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma sumZero:
  fixes P :: pi
  
  shows "P ⊕ 𝟬 ∼e P"
proof -
  have "P ⊕ 𝟬 ∼l P" by(rule Strong_Late_Bisim_SC.sumZero)
  thus ?thesis by(rule lateEarlyBisim)
qed

(******** The |-operator *********)

lemma parZero:
  fixes P :: pi

  shows "P ∥ 𝟬 ∼e P"
proof -
  have "P ∥ 𝟬 ∼l P" by(rule Strong_Late_Bisim_SC.parZero)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma parSym:
  fixes P :: pi
  and   Q :: pi

  shows "P ∥ Q ∼e Q ∥ P"
proof -
  have "P ∥ Q ∼l Q ∥ P" by(rule Strong_Late_Bisim_SC.parSym)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma scopeExtPar:
  fixes P :: pi
  and   Q :: pi
  and   x :: name

  assumes "x ♯ P"

  shows "<νx>(P ∥ Q) ∼e P ∥ <νx>Q"
proof -
  from assms have "<νx>(P ∥ Q) ∼l P ∥ <νx>Q" by(rule Strong_Late_Bisim_SC.scopeExtPar)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma scopeExtPar':
  fixes P :: pi
  and   Q :: pi
  and   x :: name

  assumes xFreshQ: "x ♯ Q"

  shows "<νx>(P ∥ Q) ∼e (<νx>P) ∥ Q"
proof -
  from assms have "<νx>(P ∥ Q) ∼l (<νx>P) ∥ Q" by(rule Strong_Late_Bisim_SC.scopeExtPar')
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma parAssoc:
  fixes P :: pi
  and   Q :: pi
  and   R :: pi

  shows "(P ∥ Q) ∥ R ∼e P ∥ (Q ∥ R)"
proof -
  have "(P ∥ Q) ∥ R ∼l P ∥ (Q ∥ R)" by(rule Strong_Late_Bisim_SC.parAssoc)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma freshRes:
  fixes P :: pi
  and   a :: name

  assumes aFreshP: "a ♯ P"

  shows "<νa>P ∼e P"
proof -
  from aFreshP have "<νa>P ∼l P" by(rule Strong_Late_Bisim_SC.scopeFresh)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma scopeExtSum:
  fixes P :: pi
  and   Q :: pi
  and   x :: name
  
  assumes "x ♯ P"

  shows "<νx>(P ⊕ Q) ∼e P ⊕ <νx>Q"
proof -
  from ‹x ♯ P›  have "<νx>(P ⊕ Q) ∼l P ⊕ <νx>Q" by(rule Strong_Late_Bisim_SC.scopeExtSum)
  thus ?thesis by(rule lateEarlyBisim)
qed

lemma bangSC:
  fixes P

  shows "!P ∼e P ∥ !P"
proof -
  have "!P ∼l P ∥ !P" by(rule Strong_Late_Bisim_SC.bangSC)
  thus ?thesis by(rule lateEarlyBisim)
qed

end