Theory ProcessCalculi

theory ProcessCalculi
  imports Relations
begin

section ‹Process Calculi›

text ‹A process calculus is given by a set of process terms (syntax) and a relation on terms
        (semantics). We consider reduction as well as labelled variants of the semantics.›

subsection ‹Reduction Semantics›

text ‹A set of process terms and a relation on pairs of terms (called reduction semantics) define
        a process calculus.›

record 'proc processCalculus =
  Reductions :: "'proc  'proc  bool"

text ‹A pair of the reduction relation is called a (reduction) step.›

abbreviation step :: "'proc  'proc processCalculus  'proc  bool"
    ("_ _ _" [70, 70, 70] 80)
  where
  "P Cal Q  Reductions Cal P Q"

text ‹We use * to indicate the reflexive and transitive closure of the reduction relation.›

primrec nSteps
  :: "'proc  'proc processCalculus  nat  'proc  bool"
    ("_ __ _" [70, 70, 70, 70] 80)
  where
  "P Cal0Q     = (P = Q)" |
  "P CalSuc nQ = (P'. P CalnP'  P' Cal Q)"

definition steps
  :: "'proc  'proc processCalculus  'proc  bool"
    ("_ _* _" [70, 70, 70] 80)
  where
  "P Cal* Q  n. P CalnQ"

text ‹A process is divergent, if it can perform an infinite sequence of steps.›

definition divergent
  :: "'proc  'proc processCalculus  bool"
    ("_ _ω" [70, 70] 80)
  where
  "P (Cal)ω  P'. P Cal* P'  (P''. P' Cal P'')"

text ‹Each term can perform an (empty) sequence of steps to itself.›

lemma steps_refl:
  fixes Cal :: "'proc processCalculus"
    and P   :: "'proc"
  shows "P Cal* P"
proof -
  have "P Cal0P"
    by simp
  hence "n. P CalnP"
    by blast
  thus "P Cal* P"
    by (simp add: steps_def)
qed

text ‹A single step is a sequence of steps of length one.›

lemma step_to_steps:
  fixes Cal  :: "'proc processCalculus"
    and P P' :: "'proc"
  assumes step: "P Cal P'"
  shows "P Cal* P'"
proof -
  from step have "P Cal1P'"
    by simp
  thus ?thesis
    unfolding steps_def
    by blast
qed

text ‹If there is a sequence of steps from P to Q and from Q to R, then there is also a sequence
        of steps from P to R.›

lemma nSteps_add:
  fixes Cal   :: "'proc processCalculus"
    and n1 n2 :: "nat"
  shows "P Q R. P Caln1Q  Q Caln2R  P Cal(n1 + n2)R"
proof (induct n2, simp)
  case (Suc n)
  assume IH: "P Q R. P Caln1Q  Q CalnR  P Cal(n1 + n)R"
  show ?case
  proof clarify
    fix P Q R
    assume "Q CalSuc nR"
    from this obtain Q' where A1: "Q CalnQ'" and A2: "Q' Cal R"
      by auto
    assume "P Caln1Q"
    with A1 IH have "P Cal(n1 + n)Q'"
      by blast
    with A2 show "P Cal(n1 + Suc n)R"
      by auto
  qed
qed

lemma steps_add:
  fixes Cal   :: "'proc processCalculus"
    and P Q R :: "'proc"
  assumes A1: "P Cal* Q"
      and A2: "Q Cal* R"
  shows "P Cal* R"
proof -
  from A1 obtain n1 where "P Caln1Q"
    by (auto simp add: steps_def)
  moreover from A2 obtain n2 where "Q Caln2R"
    by (auto simp add: steps_def)
  ultimately have "P Cal(n1 + n2)R"
    using nSteps_add[where Cal="Cal"]
    by blast
  thus "P Cal* R"
    by (simp add: steps_def, blast)
qed

subsubsection ‹Observables or Barbs›

text ‹We assume a predicate that tests terms for some kind of observables. At this point we do
        not limit or restrict the kind of observables used for a calculus nor the method to check
        them.›

record ('proc, 'barbs) calculusWithBarbs =
  Calculus :: "'proc processCalculus"
  HasBarb  :: "'proc  'barbs  bool" ("__" [70, 70] 80)

abbreviation hasBarb
  :: "'proc  ('proc, 'barbs) calculusWithBarbs  'barbs  bool"
    ("_↓<_>_" [70, 70, 70] 80)
  where
  "P↓<CWB>a  HasBarb CWB P a"

text ‹A term reaches a barb if it can evolve to a term that has this barb.›

abbreviation reachesBarb
  :: "'proc  ('proc, 'barbs) calculusWithBarbs  'barbs  bool"
    ("_⇓<_>_" [70, 70, 70] 80)
  where
  "P⇓<CWB>a  P'. P (Calculus CWB)* P'  P'↓<CWB>a"

text ‹A relation R preserves barbs if whenever (P, Q) in R and P has a barb then also Q has this
        barb.›

abbreviation rel_preserves_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_preserves_barb_set Rel CWB Barbs 
   rel_preserves_binary_pred Rel (λP a. a  Barbs  P↓<CWB>a)"

abbreviation rel_preserves_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_preserves_barbs Rel CWB  rel_preserves_binary_pred Rel (HasBarb CWB)"

lemma preservation_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_preserves_barbs Rel CWB = (Barbs. rel_preserves_barb_set Rel CWB Barbs)"
    by blast

text ‹A relation R reflects barbs if whenever (P, Q) in R and Q has a barb then also P has this
        barb.›

abbreviation rel_reflects_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_reflects_barb_set Rel CWB Barbs 
   rel_reflects_binary_pred Rel (λP a. a  Barbs  P↓<CWB>a)"

abbreviation rel_reflects_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_reflects_barbs Rel CWB  rel_reflects_binary_pred Rel (HasBarb CWB)"

lemma reflection_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_reflects_barbs Rel CWB = (Barbs. rel_reflects_barb_set Rel CWB Barbs)"
    by blast

text ‹A relation respects barbs if it preserves and reflects barbs.›

abbreviation rel_respects_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_respects_barb_set Rel CWB Barbs 
   rel_preserves_barb_set Rel CWB Barbs  rel_reflects_barb_set Rel CWB Barbs"

abbreviation rel_respects_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_respects_barbs Rel CWB  rel_preserves_barbs Rel CWB  rel_reflects_barbs Rel CWB"

lemma respection_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_respects_barbs Rel CWB = (Barbs. rel_respects_barb_set Rel CWB Barbs)"
    by blast

text ‹If a relation preserves barbs then so does its reflexive or/and transitive closure.›

lemma preservation_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes preservation: "rel_preserves_barbs Rel CWB"
  shows "rel_preserves_barbs (Rel=) CWB"
    and "rel_preserves_barbs (Rel+) CWB"
    and "rel_preserves_barbs (Rel*) CWB"
      using preservation
            preservation_of_binary_predicates_and_closures[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast+

text ‹If a relation reflects barbs then so does its reflexive or/and transitive closure.›

lemma reflection_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes reflection: "rel_reflects_barbs Rel CWB"
  shows "rel_reflects_barbs (Rel=) CWB"
    and "rel_reflects_barbs (Rel+) CWB"
    and "rel_reflects_barbs (Rel*) CWB"
      using reflection
            reflection_of_binary_predicates_and_closures[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast+

text ‹If a relation respects barbs then so does its reflexive, symmetric, or/and transitive
        closure.›

lemma respection_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes respection: "rel_respects_barbs Rel CWB"
  shows "rel_respects_barbs (Rel=) CWB"
    and "rel_respects_barbs (symcl Rel) CWB"
    and "rel_respects_barbs (Rel+) CWB"
    and "rel_respects_barbs (symcl (Rel=)) CWB"
    and "rel_respects_barbs (Rel*) CWB"
    and "rel_respects_barbs ((symcl (Rel=))+) CWB"
proof -
  from respection show "rel_respects_barbs (Rel=) CWB"
      using respection_of_binary_predicates_and_closures(1)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
next
  from respection show "rel_respects_barbs (symcl Rel) CWB"
      using respection_of_binary_predicates_and_closures(2)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
next
  from respection show "rel_respects_barbs (Rel+) CWB"
      using respection_of_binary_predicates_and_closures(3)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
next
  from respection show "rel_respects_barbs (symcl (Rel=)) CWB"
      using respection_of_binary_predicates_and_closures(4)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
next
  from respection show "rel_respects_barbs (Rel*) CWB"
      using respection_of_binary_predicates_and_closures(5)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
next
  from respection show "rel_respects_barbs ((symcl (Rel=))+) CWB"
      using respection_of_binary_predicates_and_closures(6)[where Rel="Rel" and Pred="HasBarb CWB"]
    by blast
qed

text ‹A relation R weakly preserves barbs if it preserves reachability of barbs, i.e., if (P, Q)
        in R and P reaches a barb then also Q has to reach this barb.›

abbreviation rel_weakly_preserves_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_weakly_preserves_barb_set Rel CWB Barbs 
   rel_preserves_binary_pred Rel (λP a. a  Barbs  P⇓<CWB>a)"

abbreviation rel_weakly_preserves_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_weakly_preserves_barbs Rel CWB  rel_preserves_binary_pred Rel (λP a. P⇓<CWB>a)"

lemma weak_preservation_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_weakly_preserves_barbs Rel CWB
         = (Barbs. rel_weakly_preserves_barb_set Rel CWB Barbs)"
    by blast

text ‹A relation R weakly reflects barbs if it reflects reachability of barbs, i.e., if (P, Q) in
        R and Q reaches a barb then also P has to reach this barb.›

abbreviation rel_weakly_reflects_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_weakly_reflects_barb_set Rel CWB Barbs 
   rel_reflects_binary_pred Rel (λP a. a  Barbs  P⇓<CWB>a)"

abbreviation rel_weakly_reflects_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_weakly_reflects_barbs Rel CWB  rel_reflects_binary_pred Rel (λP a. P⇓<CWB>a)"

lemma weak_reflection_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_weakly_reflects_barbs Rel CWB = (Barbs. rel_weakly_reflects_barb_set Rel CWB Barbs)"
    by blast

text ‹A relation weakly respects barbs if it weakly preserves and weakly reflects barbs.›

abbreviation rel_weakly_respects_barb_set
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  'barbs set  bool"
  where
  "rel_weakly_respects_barb_set Rel CWB Barbs 
   rel_weakly_preserves_barb_set Rel CWB Barbs  rel_weakly_reflects_barb_set Rel CWB Barbs"

abbreviation rel_weakly_respects_barbs
    :: "('proc × 'proc) set  ('proc, 'barbs) calculusWithBarbs  bool"
  where
  "rel_weakly_respects_barbs Rel CWB 
   rel_weakly_preserves_barbs Rel CWB  rel_weakly_reflects_barbs Rel CWB"

lemma weak_respection_of_barbs_and_set_of_barbs:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  shows "rel_weakly_respects_barbs Rel CWB = (Barbs. rel_weakly_respects_barb_set Rel CWB Barbs)"
    by blast

text ‹If a relation weakly preserves barbs then so does its reflexive or/and transitive closure.
›

lemma weak_preservation_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes preservation: "rel_weakly_preserves_barbs Rel CWB"
  shows "rel_weakly_preserves_barbs (Rel=) CWB"
    and "rel_weakly_preserves_barbs (Rel+) CWB"
    and "rel_weakly_preserves_barbs (Rel*) CWB"
      using preservation preservation_of_binary_predicates_and_closures[where Rel="Rel"
                          and Pred="λP a. P⇓<CWB>a"]
    by blast+

text ‹If a relation weakly reflects barbs then so does its reflexive or/and transitive closure.
›

lemma weak_reflection_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes reflection: "rel_weakly_reflects_barbs Rel CWB"
  shows "rel_weakly_reflects_barbs (Rel=) CWB"
    and "rel_weakly_reflects_barbs (Rel+) CWB"
    and "rel_weakly_reflects_barbs (Rel*) CWB"
      using reflection reflection_of_binary_predicates_and_closures[where Rel="Rel"
                        and Pred="λP a. P⇓<CWB>a"]
    by blast+

text ‹If a relation weakly respects barbs then so does its reflexive, symmetric, or/and
        transitive closure.›

lemma weak_respection_of_barbs_and_closures:
  fixes Rel :: "('proc × 'proc) set"
    and CWB :: "('proc, 'barbs) calculusWithBarbs"
  assumes respection: "rel_weakly_respects_barbs Rel CWB"
  shows "rel_weakly_respects_barbs (Rel=) CWB"
    and "rel_weakly_respects_barbs (symcl Rel) CWB"
    and "rel_weakly_respects_barbs (Rel+) CWB"
    and "rel_weakly_respects_barbs (symcl (Rel=)) CWB"
    and "rel_weakly_respects_barbs (Rel*) CWB"
    and "rel_weakly_respects_barbs ((symcl (Rel=))+) CWB"
proof -
  from respection show "rel_weakly_respects_barbs (Rel=) CWB"
      using respection_of_binary_predicates_and_closures(1)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
next
  from respection show "rel_weakly_respects_barbs (symcl Rel) CWB"
      using respection_of_binary_predicates_and_closures(2)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
next
  from respection show "rel_weakly_respects_barbs (Rel+) CWB"
      using respection_of_binary_predicates_and_closures(3)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
next
  from respection show "rel_weakly_respects_barbs (symcl (Rel=)) CWB"
      using respection_of_binary_predicates_and_closures(4)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
next
  from respection show "rel_weakly_respects_barbs (Rel*) CWB"
      using respection_of_binary_predicates_and_closures(5)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
next
  from respection show "rel_weakly_respects_barbs ((symcl (Rel=))+) CWB"
      using respection_of_binary_predicates_and_closures(6)[where Rel="Rel"
              and Pred="λP a. P⇓<CWB>a"]
    by blast
qed

end