Theory Strong_Sim

(* 
   Title: The Calculus of Communicating Systems   
   Author/Maintainer: Jesper Bengtson (jebe@itu.dk), 2012
*)
theory Strong_Sim
  imports Agent
begin

definition simulation :: "ccs  (ccs × ccs) set  ccs  bool"   ("_ ↝[_] _" [80, 80, 80] 80)
where
  "P ↝[Rel] Q  a Q'. Q a  Q'  (P'. P a  P'  (P', Q')  Rel)"

lemma simI[case_names Sim]:
  fixes P   :: ccs
  and   Rel :: "(ccs × ccs) set"
  and   Q   :: ccs

  assumes "α Q'. Q α  Q'  P'. P α  P'  (P', Q')  Rel"

  shows "P ↝[Rel] Q"
using assms
by(auto simp add: simulation_def)

lemma simE:
  fixes P   :: ccs
  and   Rel :: "(ccs × ccs) set"
  and   Q   :: ccs
  and   α   :: act
  and   Q'  :: ccs

  assumes "P ↝[Rel] Q"
  and     "Q α  Q'"

  obtains P' where "P α  P'" and "(P', Q')  Rel"
using assms
by(auto simp add: simulation_def)

lemma reflexive:
  fixes P   :: ccs
  and   Rel :: "(ccs × ccs) set"
  
  assumes "Id  Rel"

  shows "P ↝[Rel] P"
using assms
by(auto simp add: simulation_def)
  
lemma transitive:
  fixes P     :: ccs
  and   Rel   :: "(ccs × ccs) set"
  and   Q     :: ccs
  and   Rel'  :: "(ccs × ccs) set"
  and   R     :: ccs
  and   Rel'' :: "(ccs × ccs) set"
  
  assumes "P ↝[Rel] Q"
  and     "Q ↝[Rel'] R"
  and     "Rel O Rel'  Rel''"
  
  shows "P ↝[Rel''] R"
using assms
by(force simp add: simulation_def)

end