Theory Broadcast_Frame

theory Broadcast_Frame
  imports "Psi_Calculi.Frame"
begin

locale assertionAux = Frame.assertionAux SCompose SImp SBottom SChanEq
  for SCompose :: "'b::fs_name  'b  'b"     (infixr "" 80)
  and SImp :: "'b  'c::fs_name  bool"       ("_  _" [70, 70] 70)
  and SBottom :: 'b                             ("" 90)
  and SChanEq :: "('a::fs_name  'a  'c)"    ("_  _" [80, 80] 80)
  +
  fixes SOutCon  :: "'a::fs_name  'a  'c"   ("_  _" [80, 80] 80)
    and SInCon   :: "'a::fs_name  'a  'c"   ("_  _" [80, 80] 80)

assumes statEqvt'''[eqvt]: "p::name prm. p  (M  N) = (p  M)  (p  N)"
  and   statEqvt''''[eqvt]: "p::name prm. p  (M  N) = (p  M)  (p  N)"

begin

lemma chanInConSupp:
  fixes M :: 'a
    and N :: 'a

shows "(supp(M  N)::name set)  ((supp M)  (supp N))"
proof -
  {
    fix x::name
    let ?P = "λy. ([(x, y)]  M)  [(x, y)]  N  M  N"
    let ?Q = "λy M. ([(x, y)]  M)  M"
    assume "finite {y. ?Q y N}"
    moreover assume "finite {y. ?Q y M}" and "infinite {y. ?P(y)}"
    then have "infinite({y. ?P(y)} - {y. ?Q y M})" by(rule Diff_infinite_finite)
    ultimately have "infinite(({y. ?P(y)} - {y. ?Q y M}) - {y. ?Q y N})" by(rule Diff_infinite_finite)
    then have "infinite({y. ?P(y)  ¬(?Q y M)  ¬ (?Q y N)})" by(simp add: set_diff_eq)
    moreover have "{y. ?P(y)  ¬(?Q y M)  ¬ (?Q y N)} = {}" by auto
    ultimately have "infinite {}" by(blast dest: Infinite_cong)
    then have False by simp
  }
  then show ?thesis by(auto simp add: eqvts supp_def)
qed

lemma chanOutConSupp:
  fixes M :: 'a
    and N :: 'a

shows "(supp(M  N)::name set)  ((supp M)  (supp N))"
proof -
  {
    fix x::name
    let ?P = "λy. ([(x, y)]  M)  [(x, y)]  N  M  N"
    let ?Q = "λy M. ([(x, y)]  M)  M"
    assume "finite {y. ?Q y N}"
    moreover assume "finite {y. ?Q y M}" and "infinite {y. ?P(y)}"
    then have "infinite({y. ?P(y)} - {y. ?Q y M})" by(rule Diff_infinite_finite)
    ultimately have "infinite(({y. ?P(y)} - {y. ?Q y M}) - {y. ?Q y N})" by(rule Diff_infinite_finite)
    then have "infinite({y. ?P(y)  ¬(?Q y M)  ¬ (?Q y N)})" by(simp add: set_diff_eq)
    moreover have "{y. ?P(y)  ¬(?Q y M)  ¬ (?Q y N)} = {}" by auto
    ultimately have "infinite {}" by(blast dest: Infinite_cong)
    then have False by simp
  }
  then show ?thesis by (auto simp add: eqvts supp_def)
qed

lemma freshInCon[intro]:
  fixes x :: name
    and M :: 'a
    and N :: 'a

assumes "x  M"
  and   "x  N"

shows "x  M  N"
  using assms chanInConSupp
  by(auto simp add: fresh_def)

lemma freshInConChain[intro]:
  fixes xvec :: "name list"
    and Xs   :: "name set"
    and M    :: 'a
    and N    :: 'a

shows "xvec ♯* M; xvec ♯* N  xvec ♯* (M  N)"
  and "Xs ♯* M; Xs ♯* N  Xs ♯* (M  N)"
  by(auto simp add: fresh_star_def)

lemma freshOutCon[intro]:
  fixes x :: name
    and M :: 'a
    and N :: 'a

assumes "x  M"
  and   "x  N"

shows "x  M  N"
  using assms chanOutConSupp
  by(auto simp add: fresh_def)

lemma freshOutConChain[intro]:
  fixes xvec :: "name list"
    and Xs   :: "name set"
    and M    :: 'a
    and N    :: 'a

shows "xvec ♯* M; xvec ♯* N  xvec ♯* (M  N)"
  and "Xs ♯* M; Xs ♯* N  Xs ♯* (M  N)"
  by(auto simp add: fresh_star_def)

lemma chanOutConClosed:
  fixes Ψ :: 'b
    and M :: 'a
    and N :: 'a
    and p :: "name prm"

assumes "Ψ  M  N"

shows "(p  Ψ)  (p  M)  (p  N)"
proof -
  from Ψ  M  N have "(p  Ψ)  p  (M  N)"
    by(rule statClosed)
  then show ?thesis by(auto simp add: eqvts)
qed

lemma chanInConClosed:
  fixes Ψ :: 'b
    and M :: 'a
    and N :: 'a
    and p :: "name prm"

assumes "Ψ  M  N"

shows "(p  Ψ)  (p  M)  (p  N)"
proof -
  from Ψ  M  N have "(p  Ψ)  p  (M  N)"
    by(rule statClosed)
  then show ?thesis by(auto simp add: eqvts)
qed

end

locale assertion = assertionAux SCompose SImp SBottom SChanEq SOutCon SInCon + assertion SCompose SImp SBottom SChanEq
  for SCompose :: "'b::fs_name  'b  'b"
  and SImp     :: "'b  'c::fs_name  bool"
  and SBottom  :: 'b
  and SChanEq  :: "'a::fs_name  'a  'c"
  and SOutCon  :: "'a::fs_name  'a  'c"
  and SInCon   :: "'a::fs_name  'a  'c" +

  assumes chanOutConSupp: "SImp Ψ (SOutCon M N)  (((supp N)::name set)  ((supp M)::name set))"
    and   chanInConSupp:  "SImp Ψ (SInCon N M)  (((supp N)::name set)  ((supp M)::name set))"

begin

notation SOutCon ("_  _" [90, 90] 90)
notation SInCon ("_  _" [90, 90] 90)

end

end