Theory Weak_Sim

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

definition weakSimulation :: "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 weakSimI[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: weakSimulation_def)

lemma weakSimE:
  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: weakSimulation_def)

lemma simTauChain:
  fixes P   :: ccs
  and   Rel :: "(ccs × ccs) set"
  and   Q   :: ccs
  and   Q'  :: ccs

  assumes "Q ⟹τ Q'"
  and     "(P, Q) ∈ Rel"
  and     Sim: "⋀R S. (R, S) ∈ Rel ⟹ R ↝^<Rel> S"

  obtains P' where "P ⟹τ P'" and "(P', Q') ∈ Rel"
using ‹Q ⟹τ Q'› ‹(P, Q) ∈ Rel›
proof(induct arbitrary: thesis rule: tauChainInduct)
  case Base
  from ‹(P, Q) ∈ Rel› show ?case
    by(force intro: Base)
next
  case(Step Q'' Q')
  from ‹(P, Q) ∈ Rel› obtain P'' where "P ⟹τ P''" and "(P'', Q'') ∈ Rel"
    by(blast intro: Step)
  from ‹(P'', Q'') ∈ Rel› have "P'' ↝^<Rel> Q''" by(rule Sim)
  then obtain P' where "P'' ⟹^τ ≺ P'" and "(P', Q') ∈ Rel" using ‹Q'' ⟼τ ≺ Q'› by(rule weakSimE)
  with ‹P ⟹τ P''› show thesis
    by(force simp add: weakTrans_def weakCongTrans_def intro: Step)
qed

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

  assumes "(P, Q) ∈ Rel"
  and     "Q ⟹^α ≺ Q'"
  and     Sim: "⋀R S. (R, S) ∈ Rel ⟹ R ↝^<Rel> S"
  
  obtains P' where "P ⟹^α ≺ P'" and "(P', Q') ∈ Rel"
proof -
  assume Goal: "⋀P'. ⟦P ⟹^α ≺ P'; (P', Q') ∈ Rel⟧ ⟹ thesis"
  moreover from ‹Q ⟹^α ≺ Q'› have "∃P'. P ⟹^α ≺ P' ∧ (P', Q') ∈ Rel"
  proof(induct rule: weakTransCases)
    case Base
    from ‹(P, Q) ∈ Rel› show ?case by force
  next
    case Step
    from ‹Q ⟹α ≺ Q'› obtain Q''' Q''
    where QChain: "Q ⟹τ Q'''" and Q'''Trans: "Q''' ⟼α ≺ Q''" and Q''Chain: "Q'' ⟹τ Q'"
      by(rule weakCongTransE)
    from QChain ‹(P, Q) ∈ Rel› Sim obtain P''' where PChain: "P ⟹τ P'''" and "(P''', Q''') ∈ Rel"
      by(rule simTauChain)
    from ‹(P''', Q''') ∈ Rel› have "P''' ↝^<Rel> Q'''" by(rule Sim)
    then obtain P'' where P'''Trans: "P''' ⟹^α ≺ P''" and "(P'', Q'') ∈ Rel" using Q'''Trans by(rule weakSimE)
    from Q''Chain ‹(P'', Q'') ∈ Rel› Sim obtain P' where P''Chain: "P'' ⟹τ P'" and "(P', Q') ∈ Rel"
      by(rule simTauChain)
    from P'''Trans P''Chain Step show ?thesis
    proof(induct rule: weakTransCases)
      case Base
      from PChain ‹P''' ⟹τ P'› have "P ⟹^τ ≺ P'"
      proof(induct rule: tauChainInduct)
        case Base
        from ‹P ⟹τ P'› show ?case
        proof(induct rule: tauChainInduct)
          case Base
          show ?case by simp
        next
          case(Step P' P'')
          thus ?case by(fastforce simp add: weakTrans_def weakCongTrans_def)
        qed
      next
        case(Step P''' P'')
        thus ?case by(fastforce simp add: weakTrans_def weakCongTrans_def)
      qed
      with ‹(P', Q') ∈ Rel› show ?case by blast
    next
      case Step
      thus ?case using ‹(P', Q') ∈ Rel› PChain
        by(rule_tac x=P' in exI) (force simp add: weakTrans_def weakCongTrans_def)
    qed
  qed
  ultimately show ?thesis
    by blast
qed

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

  shows "P ↝^<Rel> P"
using assms
by(auto simp add: weakSimulation_def intro: transitionWeakCongTransition weakCongTransitionWeakTransition)
  
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, Q) ∈ Rel"
  and     "Q ↝^<Rel'> R"
  and     "Rel O Rel' ⊆ Rel''"
  and     "⋀S T. (S, T) ∈ Rel ⟹ S ↝^<Rel> T"
  
  shows "P ↝^<Rel''> R"
proof(induct rule: weakSimI)
  case(Sim α R')
  thus ?case using assms
    apply(drule_tac Q=R in weakSimE, auto)
    by(drule_tac Q=Q in simE2, auto)
qed

lemma weakMonotonic:
  fixes P :: ccs
  and   A :: "(ccs × ccs) set"
  and   Q :: ccs
  and   B :: "(ccs × ccs) set"

  assumes "P ↝^<A> Q"
  and     "A ⊆ B"

  shows "P ↝^<B> Q"
using assms
by(fastforce simp add: weakSimulation_def)

lemma simWeakSim:
  fixes P   :: ccs
  and   Rel :: "(ccs × ccs) set"
  and   Q   :: ccs

  assumes "P ↝[Rel] Q"
  
  shows "P ↝^<Rel> Q"
using assms
by(rule_tac weakSimI, auto)
  (blast dest: simE transitionWeakTransition)

end