Impressum Semantics.thy
Sprache: Isabelle
(*
Title : Psi - calculi
Author / Maintainer : Jesper Bengtson ( jebe @ itu . dk ) , 2012
*)
theory Semantics
imports Frame
begin
nominal_datatype ('a, 'b, 'c) boundOutput =
BOut "'a::fs_name" "('a, 'b::fs_name, 'c::fs_name) psi" (‹ _ ≺ '' _› [110 , 110 ] 110 )
| BStep "« name¬ ('a, 'b, 'c) boundOutput" (‹ ( ν_) _› [110 , 110 ] 110 )
primrec BOresChain :: "name list ==> ('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput ==>
('a, 'b, 'c) boundOutput" where
Base: "BOresChain [] B = B"
| Step: "BOresChain (x#xs) B = ( νx) (BOresChain xs B)"
abbreviation
BOresChainJudge (‹ ( ν*_) _› [80 , 80 ] 80 ) where "( ν*xvec) B ≡ BOresChain xvec B"
lemma BOresChainEqvt[eqvt]:
fixes perm :: "name prm"
and lst :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "perm ∙ (( ν*xvec) B) = ( ν*(perm ∙ xvec)) (perm ∙ B)"
by (induct_tac xvec, auto)
lemma BOresChainSimps[simp]:
fixes xvec :: "name list"
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and N' :: 'a
and P' :: "('a, 'b, 'c) psi"
and B :: "('a, 'b, 'c) boundOutput"
and B' :: "('a, 'b, 'c) boundOutput"
shows "(( ν*xvec) N ≺ ' P = N' ≺ ' P') = (xvec = [] ∧ N = N' ∧ P = P')"
and "(N' ≺ ' P' = ( ν*xvec) N ≺ ' P) = (xvec = [] ∧ N = N' ∧ P = P')"
and "(N' ≺ ' P' = N ≺ ' P) = (N = N' ∧ P = P')"
and "(( ν*xvec) B = ( ν*xvec) B') = (B = B')"
by (induct xvec) (auto simp add: boundOutput.inject alpha)
lemma outputFresh[simp]:
fixes Xs :: "name set"
and xvec :: "name list"
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(Xs ♯ * (N ≺ ' P)) = ((Xs ♯ * N) ∧ (Xs ♯ * P))"
and "(xvec ♯ * (N ≺ ' P)) = ((xvec ♯ * N) ∧ (xvec ♯ * P))"
by (auto simp add: fresh_star_def)
lemma boundOutputFresh:
fixes x :: name
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "(x ♯ (( ν*xvec) B)) = (x ∈ set xvec ∨ x ♯ B)"
by (induct xvec) (simp_all add: abs_fresh)
lemma boundOutputFreshSet:
fixes Xs :: "name set"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and x :: name
shows "Xs ♯ * (( ν*xvec) B) = (∀ x∈ Xs. x ∈ set xvec ∨ x ♯ B)"
and "yvec ♯ * (( ν*xvec) B) = (∀ x∈ (set yvec). x ∈ set xvec ∨ x ♯ B)"
and "Xs ♯ * (( νx) B) = Xs ♯ * [x].B"
and "xvec ♯ * (( νx) B) = xvec ♯ * [x].B"
by (simp add: fresh_star_def boundOutputFresh)+
lemma BOresChainSupp:
fixes xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "(supp(( ν*xvec) B)::name set) = (supp B) - (supp xvec)"
by (induct xvec)
(auto simp add: boundOutput.supp supp_list_nil supp_list_cons abs_supp supp_atm)
lemma boundOutputFreshSimps[simp]:
fixes Xs :: "name set"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and x :: name
shows "Xs ♯ * xvec ==> (Xs ♯ * (( ν*xvec) B)) = (Xs ♯ * B)"
and "yvec ♯ * xvec ==> yvec ♯ * (( ν*xvec) B) = yvec ♯ * B"
and "xvec ♯ * (( ν*xvec) B)"
and "x ♯ xvec ==> x ♯ ( ν*xvec) B = x ♯ B"
apply (simp add: boundOutputFreshSet) apply (force simp add: fresh_star_def name_list_supp fresh_def)
apply (simp add: boundOutputFreshSet) apply (force simp add: fresh_star_def name_list_supp fresh_def)
apply (simp add: boundOutputFreshSet)
by (simp add: BOresChainSupp fresh_def)
lemma boundOutputChainAlpha:
fixes p :: "name prm"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
assumes xvecFreshB: "(p ∙ xvec) ♯ * B"
and S: "set p ⊆ set xvec × set (p ∙ xvec)"
and "(set xvec) ⊆ (set yvec)"
shows "(( ν*yvec) B) = (( ν*(p ∙ yvec)) (p ∙ B))"
proof -
note pt_name_inst at_name_inst S
moreover from ‹ (set xvec) ⊆ (set yvec)› have "set xvec ♯ * (( ν*yvec) B)"
by (force simp add: boundOutputFreshSet)
moreover from xvecFreshB ‹ (set xvec) ⊆ (set yvec)› have "set (p ∙ xvec) ♯ * (( ν*yvec) B)"
by (simp add: boundOutputFreshSet) (simp add: fresh_star_def)
ultimately have "(( ν*yvec) B) = p ∙ (( ν*yvec) B)"
by (rule_tac pt_freshs_freshs [symmetric])
then show ?thesis by (simp add: eqvts)
qed
lemma boundOutputChainAlpha':
fixes p :: "name prm"
and xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and zvec :: "name list"
assumes xvecFreshB: "xvec ♯ * B"
and S: "set p ⊆ set xvec × set yvec"
and "yvec ♯ * (( ν*zvec) B)"
shows "(( ν*zvec) B) = (( ν*(p ∙ zvec)) (p ∙ B))"
proof -
note pt_name_inst at_name_inst S ‹ yvec ♯ * (( ν*zvec) B)›
moreover from xvecFreshB have "set (xvec) ♯ * (( ν*zvec) B)"
by (simp add: boundOutputFreshSet) (simp add: fresh_star_def)
ultimately have "(( ν*zvec) B) = p ∙ (( ν*zvec) B)"
by (rule_tac pt_freshs_freshs [symmetric]) auto
then show ?thesis by (simp add: eqvts)
qed
lemma boundOutputChainAlpha'':
fixes p :: "name prm"
and xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
assumes "(p ∙ xvec) ♯ * M"
and "(p ∙ xvec) ♯ * P"
and "set p ⊆ set xvec × set (p ∙ xvec)"
and "(set xvec) ⊆ (set yvec)"
shows "(( ν*yvec) M ≺ ' P) = (( ν*(p ∙ yvec)) (p ∙ M) ≺ ' (p ∙ P))"
using assms
by (subst boundOutputChainAlpha) auto
lemma boundOutputChainSwap:
fixes x :: name
and y :: name
and N :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec :: "name list"
assumes "y ♯ N"
and "y ♯ P"
and "x ∈ (set xvec)"
shows "( ν*xvec) N ≺ ' P = ( ν*([(x, y)] ∙ xvec)) ([(x ,y)] ∙ N) ≺ ' ([(x, y)] ∙ P)"
proof (case_tac "x=y" )
assume "x=y"
thus ?thesis by simp
next
assume "x ≠ y"
with assms show ?thesis
by (rule_tac xvec="[x]" in boundOutputChainAlpha'') (auto simp add: calc_atm)
qed
lemma alphaBoundOutput:
fixes x :: name
and y :: name
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
assumes "y ♯ B"
shows "( νx) B = ( νy) ([(x, y)] ∙ B)"
using assms
by (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
lemma boundOutputEqFresh:
fixes B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and C :: "('a, 'b, 'c) boundOutput"
and x :: name
and y :: name
assumes "( νx) B = ( νy) C"
and "x ♯ B"
shows "y ♯ C"
using assms
by (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
lemma boundOutputEqSupp:
fixes B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and C :: "('a, 'b, 'c) boundOutput"
and x :: name
and y :: name
assumes "( νx) B = ( νy) C"
and "x ∈ supp B"
shows "y ∈ supp C"
using assms
apply (auto simp add: boundOutput.inject alpha fresh_left calc_atm)
apply (drule_tac pi="[(x, y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
by (simp add: eqvts calc_atm)
lemma boundOutputChainEq:
fixes xvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and B' :: "('a, 'b, 'c) boundOutput"
assumes "( ν*xvec) B = ( ν*yvec) B'"
and "xvec ♯ * yvec"
and "length xvec = length yvec"
shows "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ B = p ∙ B' ∧ (set (map fst p)) ⊆ (supp B) ∧ xvec ♯ * B' ∧ yvec ♯ * B"
proof -
obtain n where "n = length xvec" by auto
with assms show ?thesis
proof (induct n arbitrary: xvec yvec B B')
case (0 xvec yvec B B')
have Eq: "( ν*xvec) B = ( ν*yvec) B'" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with ‹ length xvec = length yvec› have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec B B')
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) B = ( ν*yvec) B'› ‹ xvec = x # xvec'› ‹ length xvec = length yvec›
obtain y yvec' where "( ν*(x#xvec')) B = ( ν*(y#yvec')) B'"
and "yvec = y#yvec'" and "length xvec' = length yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') B) = ( νy) (( ν*yvec') B')"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec›
have "x ≠ y" and "xvec' ♯ * yvec'" and "x ♯ yvec'" and "y ♯ xvec'"
by auto
have IH: "∧ xvec yvec B B'. [ ( ν*xvec) (B::('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput) = ( ν*yvec) B'; xvec ♯ * yvec; length xvec = length yvec; n = length xvec] ==> ∃ p. (set p) ⊆ (set xvec) × (set yvec) ∧ distinctPerm p ∧ B = p ∙ B' ∧ set(map fst p) ⊆ supp B ∧ xvec ♯ * B' ∧ yvec ♯ * B"
by fact
from EQ ‹ x ≠ y› have EQ': "( ν*xvec') B = ([(x, y)] ∙ (( ν*yvec') B'))"
and xFreshB': "x ♯ (( ν*yvec') B')"
and yFreshB: "y ♯ (( ν*xvec') B)"
by (metis boundOutput.inject alpha)+
from xFreshB' ‹ x ♯ yvec'› have "x ♯ B'"
by (auto simp add: boundOutputFresh) (simp add: fresh_def name_list_supp)+
from yFreshB ‹ y ♯ xvec'› have "y ♯ B"
by (auto simp add: boundOutputFresh) (simp add: fresh_def name_list_supp)+
show ?case
proof (case_tac "x ♯ ( ν*xvec') B" )
assume xFreshB: "x ♯ ( ν*xvec') B"
with EQ have yFreshB': "y ♯ ( ν*yvec') B'"
by (rule boundOutputEqFresh)
with xFreshB' EQ' have "( ν*xvec') B = ( ν*yvec') B'"
by (simp)
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = length yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "B = p ∙ B'"
and "set(map fst p) ⊆ supp B" and "xvec' ♯ * B'" and "yvec' ♯ * B"
by blast
from S have "(set p) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover note ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ distinctPerm p› ‹ B = p ∙ B'›
‹ xvec' ♯ * B'› ‹ x ♯ B'› ‹ x ♯ B'› ‹ yvec' ♯ * B› ‹ y ♯ B› ‹ set(map fst p) ⊆ supp B›
ultimately show ?case by auto
next
assume "¬ (x ♯ ( ν*xvec') B)"
hence xSuppB: "x ∈ supp(( ν*xvec') B)"
by (simp add: fresh_def)
with EQ have ySuppB': "y ∈ supp (( ν*yvec') B')"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'"
by (induct yvec') (auto simp add: boundOutput.supp abs_supp)
with ‹ x ♯ yvec'› EQ' have "( ν*xvec') B = ( ν*yvec') ([(x, y)] ∙ B')"
by (simp add: eqvts)
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = length yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "B = p ∙ [(x, y)] ∙ B'"
and "set(map fst p) ⊆ supp B" and "xvec' ♯ * ([(x, y)] ∙ B')" and "yvec' ♯ * B"
by blast
from xSuppB have "x ♯ xvec'"
by (induct xvec') (auto simp add: boundOutput.supp abs_supp)
with ‹ x ♯ yvec'› ‹ y ♯ xvec'› ‹ y ♯ yvec'› S have "x ♯ p" and "y ♯ p"
apply (induct p)
by (auto simp add: name_list_supp) (auto simp add: fresh_def)
from S have "(set ((x, y)#p)) ⊆ (set(x#xvec')) × (set(y#yvec'))"
by force
moreover from ‹ x ≠ y› ‹ x ♯ p› ‹ y ♯ p› S ‹ distinctPerm p›
have "distinctPerm((x,y)#p)" by simp
moreover from ‹ B = p ∙ [(x, y)] ∙ B'› ‹ x ♯ p› ‹ y ♯ p› have "B = [(x, y)] ∙ p ∙ B'"
by (subst perm_compose) simp
hence "B = ((x, y)#p) ∙ B'" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ B')› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ B')"
by (simp only: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› ‹ x ♯ B'› have "(x#xvec') ♯ * B'" by simp
moreover from ‹ y ♯ B› ‹ yvec' ♯ * B› have "(y#yvec') ♯ * B" by simp
moreover from ‹ set(map fst p) ⊆ supp B› xSuppB ‹ x ♯ xvec'›
have "set(map fst ((x, y)#p)) ⊆ supp B"
by (simp add: BOresChainSupp)
ultimately show ?case using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by metis
qed
qed
qed
lemma boundOutputChainEqLength:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: "'a::fs_name"
and Q :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
shows "length xvec = length yvec"
proof -
obtain n where "n = length xvec" by auto
with assms show ?thesis
proof (induct n arbitrary: xvec yvec M P N Q)
case (0 xvec yvec M P N Q)
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case by simp
next
case (Suc n xvec yvec M P N Q)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' Q)"
by simp
have IH: "∧ xvec yvec M P N Q. [ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q::('a, 'b, 'c) psi); n = length xvec] ==> length xvec = length yvec"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' Q"
by (simp add: alpha boundOutput.inject)
with IH ‹ length xvec' = n› have "length xvec' = length yvec'"
by blast
with ‹ xvec = x#xvec'› ‹ yvec=y#yvec'›
show ?case by simp
next
assume "x ≠ y"
with EQ have "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' Q"
by (simp add: alpha boundOutput.inject)
hence "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: eqvts)
with IH ‹ length xvec' = n› have "length xvec' = length ([(x, y)] ∙ yvec')"
by blast
hence "length xvec' = length yvec'"
by simp
with ‹ xvec = x#xvec'› ‹ yvec=y#yvec'›
show ?case by simp
qed
qed
qed
lemma boundOutputChainEq':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "xvec ♯ * yvec"
shows "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ M = p ∙ N ∧ P = p ∙ Q ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ yvec ♯ * M ∧ yvec ♯ * P"
using assms
apply (frule_tac boundOutputChainEqLength)
apply (drule_tac boundOutputChainEq)
by (auto simp add: boundOutput.inject)
lemma boundOutputChainEq'':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a::fs_name, 'b::fs_name, 'c::fs_name) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "xvec ♯ * yvec"
and "distinct xvec"
and "distinct yvec"
obtains p where "(set p) ⊆ (set xvec) × set (p ∙ xvec)" and "distinctPerm p" and "yvec = p ∙ xvec" and "N = p ∙ M" and "Q = p ∙ P" and "xvec ♯ * N" and "xvec ♯ * Q" and "(p ∙ xvec) ♯ * M" and "(p ∙ xvec) ♯ * P"
proof -
assume "∧ p. [ set p ⊆ set xvec × set (p ∙ xvec); distinctPerm p; yvec = p ∙ xvec; N = p ∙ M; Q = p ∙ P; xvec ♯ * N; xvec ♯ * Q; (p ∙ xvec) ♯ * M; (p ∙ xvec) ♯ * P] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p. (set p) ⊆ (set xvec) × set (yvec) ∧ distinctPerm p ∧ yvec = p ∙ xvec ∧ N = p ∙ M ∧ Q = p ∙ P ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ (p ∙ xvec) ♯ * M ∧ (p ∙ xvec) ♯ * P"
proof (induct n arbitrary: xvec yvec M P N Q)
case (0 xvec yvec M P N Q)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M P N Q)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' Q› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' Q)"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec›
have "x ≠ y" and "xvec' ♯ * yvec'" and "x ♯ yvec'" and "y ♯ xvec'"
by auto
from ‹ distinct xvec› ‹ distinct yvec› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› have "x ♯ xvec'" and "y ♯ yvec'" and "distinct xvec'" and "distinct yvec'"
by simp+
have IH: "∧ xvec yvec M P N Q. [ ( ν*xvec) (M::'a) ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' Q; xvec ♯ * yvec; distinct xvec; distinct yvec; n = length xvec] ==> ∃ p. (set p) ⊆ (set xvec) × (set yvec) ∧ distinctPerm p ∧ yvec = p ∙ xvec ∧ N = p ∙ M ∧ Q = p ∙ P ∧ xvec ♯ * N ∧ xvec ♯ * Q ∧ (p ∙ xvec) ♯ * M ∧ (p ∙ xvec) ♯ * P"
by fact
from EQ ‹ x ≠ y› ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ y ♯ xvec'› ‹ x ♯ xvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)" and "x ♯ N" and "x ♯ Q" and "y ♯ M" and "y ♯ P"
apply -
apply (simp add: boundOutput.inject alpha eqvts)
apply (simp add: boundOutput.inject alpha eqvts)
apply (simp add: boundOutput.inject alpha eqvts)
by (simp add: boundOutput.inject alpha' eqvts)+
with ‹ xvec' ♯ * yvec'› ‹ distinct xvec'› ‹ distinct yvec'› ‹ length xvec' = n› IH
obtain p where S: "(set p) ⊆ (set xvec') × (set yvec')" and "distinctPerm p" and "yvec' = p ∙ xvec'" and "([(x, y)] ∙ N) = p ∙ M" and "([(x, y)] ∙ Q) = p ∙ P" and "xvec' ♯ * ([(x, y)] ∙ N)" and "xvec' ♯ * ([(x, y)] ∙ Q)" and "yvec' ♯ * M" and "yvec' ♯ * P"
by metis
from S have "set((x, y)#p) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ x ♯ xvec'› ‹ x ♯ yvec'› ‹ y ♯ xvec'› ‹ y ♯ yvec'› S have "x ♯ p" and "y ♯ p"
apply (induct p)
by (auto simp add: fresh_prod name_list_supp) (auto simp add: fresh_def)
with S ‹ distinctPerm p› ‹ x ≠ y› have "distinctPerm((x, y)#p)" by auto
moreover from ‹ yvec' = p ∙ xvec'› ‹ x ♯ p› ‹ y ♯ p› ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "(y#yvec') = ((x, y)#p) ∙ (x#xvec')"
by (simp add: eqvts calc_atm perm_compose freshChainSimps)
moreover from ‹ ([(x, y)] ∙ N) = p ∙ M›
have "([(x, y)] ∙ [(x, y)] ∙ N) = [(x, y)] ∙ p ∙ M"
by (simp add: pt_bij)
hence "N = ((x, y)#p) ∙ M" by simp
moreover from ‹ ([(x, y)] ∙ Q) = p ∙ P›
have "([(x, y)] ∙ [(x, y)] ∙ Q) = [(x, y)] ∙ p ∙ P"
by (simp add: pt_bij)
hence "Q = ((x, y)#p) ∙ P" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ N)› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ N)"
by (subst fresh_star_bij)
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "xvec' ♯ * N" by simp
with ‹ x ♯ N› have "(x#xvec') ♯ * N" by simp
moreover from ‹ xvec' ♯ * ([(x, y)] ∙ Q)› have "([(x, y)] ∙ xvec') ♯ * ([(x, y)] ∙ [(x, y)] ∙ Q)"
by (subst fresh_star_bij)
with ‹ x ♯ xvec'› ‹ y ♯ xvec'› have "xvec' ♯ * Q" by simp
with ‹ x ♯ Q› have "(x#xvec') ♯ * Q" by simp
moreover from ‹ y ♯ M› ‹ yvec' ♯ * M› have "(y#yvec') ♯ * M" by simp
moreover from ‹ y ♯ P› ‹ yvec' ♯ * P› have "(y#yvec') ♯ * P" by simp
ultimately show ?case using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by metis
qed
ultimately show ?thesis by blast
qed
lemma boundOutputEqSupp':
fixes x :: name
and xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and y :: name
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( νx) (( ν*xvec) M ≺ ' P) = ( νy) (( ν*yvec) N ≺ ' Q)"
and "x ≠ y"
and "x ♯ yvec"
and "x ♯ xvec"
and "y ♯ xvec"
and "y ♯ yvec"
and "xvec ♯ * yvec"
and "x ∈ supp M"
shows "y ∈ supp N"
proof -
from Eq ‹ x ≠ y› ‹ x ♯ yvec› ‹ y ♯ yvec› have "( ν*xvec) M ≺ ' P = ( ν*yvec) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: boundOutput.inject alpha eqvts)
then obtain p where S: "set p ⊆ set xvec × set yvec" and "M = p ∙ [(x, y)] ∙ N" and "distinctPerm p" using ‹ xvec ♯ * yvec›
by (blast dest: boundOutputChainEq')
with ‹ x ∈ supp M› have "x ∈ supp(p ∙ [(x, y)] ∙ N)" by simp
hence "(p ∙ x) ∈ p ∙ supp(p ∙ [(x, y)] ∙ N)"
by (simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ xvec› ‹ x ♯ yvec› S ‹ distinctPerm p› have "x ∈ supp([(x, y)] ∙ N)"
by (simp add: eqvts)
hence "([(x, y)] ∙ x) ∈ ([(x, y)] ∙ (supp([(x, y)] ∙ N)))"
by (simp add: pt_set_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ≠ y› show ?thesis by (simp add: calc_atm eqvts)
qed
lemma boundOutputChainOpenIH:
fixes xvec :: "name list"
and x :: name
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
and yvec :: "name list"
and y :: name
and B' :: "('a, 'b, 'c) boundOutput"
assumes Eq: "( ν*xvec) (( νx) B) = ( ν*yvec) (( νy) B')"
and L: "length xvec = length yvec"
and xFreshB': "x ♯ B'"
and xFreshxvec: "x ♯ xvec"
and xFreshyvec: "x ♯ yvec"
shows "( ν*xvec) B = ( ν*yvec) ([(x, y)] ∙ B')"
using assms
proof (induct n=="length xvec" arbitrary: xvec yvec y B' rule: nat.induct)
case (zero xvec yvec y B')
have "0 = length xvec" and "length xvec = length yvec" by fact+
moreover have "( ν*xvec) ( νx) B = ( ν*yvec) ( νy) B'" by fact
ultimately show ?case by (auto simp add: boundOutput.inject alpha)
next
case (Suc n xvec yvec y B')
have L: "length xvec = length yvec" and "Suc n = length xvec" by fact+
then obtain x' xvec' y' yvec' where xEq: "xvec = x'#xvec'" and yEq: "yvec = y'#yvec'"
and L': "length xvec' = length yvec'"
by (cases xvec, auto, cases yvec, auto)
have xFreshB': "x ♯ B'" by fact
have "x ♯ xvec" and "x ♯ yvec" by fact+
with xEq yEq have xineqx': "x ≠ x'" and xFreshxvec': "x ♯ xvec'"
and xineqy': "x ≠ y'" and xFreshyvec': "x ♯ yvec'"
by simp+
have "( ν*xvec) ( νx) B = ( ν*yvec) ( νy) B'" by fact
with xEq yEq have Eq: "( νx') (( ν*xvec') ( νx) B) = ( νy') (( ν*yvec') ( νy) B')" by simp
have "Suc n = length xvec" by fact
with xEq have L'': "n = length xvec'" by simp
have "( νx') (( ν*xvec') B) = ( νy') (( ν*yvec') ([(x, y)] ∙ B'))"
proof (case_tac "x'=y'" )
assume x'eqy': "x' = y'"
with Eq have "( ν*xvec') ( νx) B = ( ν*yvec') ( νy) B'" by (simp add: boundOutput.inject alpha)
hence "( ν*xvec') B = ( ν*yvec') ([(x, y)] ∙ B')" using L' xFreshB' xFreshxvec' xFreshyvec' L''
by (rule_tac Suc)
with x'eqy' show ?thesis by (simp add: boundOutput.inject alpha)
next
assume x'ineqy': "x' ≠ y'"
with Eq have Eq': "( ν*xvec') ( νx) B = ( ν*([(x', y')] ∙ yvec')) ( ν([(x', y')] ∙ y)) ([(x', y')] ∙ B')"
and x'FreshB': "x' ♯ ( ν*yvec') ( νy) B'"
by (simp add: boundOutput.inject alpha eqvts)+
from L' have "length xvec' = length ([(x', y')] ∙ yvec')" by simp
moreover from xineqx' xineqy' xFreshB' have "x ♯ [(x', y')] ∙ B'" by (simp add: fresh_left calc_atm)
moreover from xineqx' xineqy' xFreshyvec' have "x ♯ [(x', y')] ∙ yvec'" by (simp add: fresh_left calc_atm)
ultimately have "( ν*xvec') B = ( ν*([(x', y')] ∙ yvec')) ([(x, ([(x', y')] ∙ y))] ∙ [(x', y')] ∙ B')" using Eq' xFreshxvec' L''
by (rule_tac Suc)
moreover from x'FreshB' have "x' ♯ ( ν*yvec') ([(x, y)] ∙ B')"
proof (case_tac "x' ♯ yvec'" )
assume "x' ♯ yvec'"
with x'FreshB' have x'FreshB': "x' ♯ ( νy) B'"
by (simp add: fresh_def BOresChainSupp)
show ?thesis
proof (case_tac "x'=y" )
assume x'eqy: "x' = y"
show ?thesis
proof (case_tac "x=y" )
assume "x=y"
with xFreshB' x'eqy show ?thesis by (simp add: BOresChainSupp fresh_def)
next
assume "x ≠ y"
with ‹ x ♯ B'› have "y ♯ [(x, y)] ∙ B'" by (simp add: fresh_left calc_atm)
with x'eqy show ?thesis by (simp add: BOresChainSupp fresh_def)
qed
next
assume x'ineqy: "x' ≠ y"
with x'FreshB' have "x' ♯ B'" by (simp add: abs_fresh)
with xineqx' x'ineqy have "x' ♯ ([(x, y)] ∙ B')" by (simp add: fresh_left calc_atm)
thus ?thesis by (simp add: BOresChainSupp fresh_def)
qed
next
assume "¬ x' ♯ yvec'"
thus ?thesis by (simp add: BOresChainSupp fresh_def)
qed
ultimately show ?thesis using x'ineqy' xineqx' xineqy'
apply (simp add: boundOutput.inject alpha eqvts)
apply (subst perm_compose[of "[(x', y')]" ])
by (simp add: calc_atm)
qed
with xEq yEq show ?case by simp
qed
lemma boundOutputPar1Dest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * R"
and "yvec ♯ * R"
obtains T where "P = T ∥ R" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ T. [ P = T ∥ R; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ T. P = T ∥ R ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec ♯ * R› ‹ yvec ♯ * R› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "x ♯ R" and "xvec' ♯ * R" and "y ♯ R" and "yvec' ♯ * R" by auto
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)
with ‹ xvec' ♯ * R› ‹ yvec' ♯ * R› ‹ length xvec' = n›
obtain T where "P = T ∥ R" and "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' Q"
by (drule_tac Suc) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ x ♯ R› ‹ y ♯ R›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ yvec' ♯ * R› have "([(x, y)] ∙ yvec') ♯ * ([(x, y)] ∙ R)"
by (simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ R› ‹ y ♯ R› have "([(x, y)] ∙ yvec') ♯ * R" by simp
moreover note ‹ xvec' ♯ * R› ‹ length xvec' = n›
ultimately obtain T where "P = T ∥ R" and A: "( ν*xvec') M ≺ ' T = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac Suc) auto
from A have "( νx) (( ν*xvec') M ≺ ' T) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshQR have "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: boundOutputFresh)
ultimately show ?thesis using ‹ P = T ∥ R› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshQR
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar1Dest':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * yvec"
obtains T p where "set p ⊆ set xvec × set yvec" and "P = T ∥ (p ∙ R)" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ p T. [ set p ⊆ set xvec × set yvec; P = T ∥ (p ∙ R); ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p T. set p ⊆ set xvec × set yvec ∧ P = T ∥ (p ∙ R) ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence Eq: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec› have "x ≠ y" and "x ♯ yvec'" and "y ♯ xvec'" and "xvec' ♯ * yvec'"
by auto
from Eq ‹ x ≠ y› have Eq': "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' (Q ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)+
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * yvec; n = length xvec] ==> ∃ p T. set p ⊆ set xvec × set yvec ∧ P = T ∥ (p ∙ R) ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' Q"
by fact
show ?case
proof (case_tac "x ♯ ( ν*xvec') M ≺ ' P" )
assume "x ♯ ( ν*xvec') M ≺ ' P"
with Eq have yFreshQR: "y ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (rule boundOutputEqFresh)
with Eq' xFreshQR have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by simp
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = T ∥ (p ∙ R)" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' Q"
by (drule_tac IH) auto
from yFreshQR xFreshQR have yFreshQ: "y ♯ ( ν*yvec') N ≺ ' Q" and xFreshQ: "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
hence "( νx) (( ν*yvec') N ≺ ' Q) = ( νy) (( ν*yvec') N ≺ ' Q)" by (subst alphaBoundOutput) simp+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' Q)" by simp
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› S ‹ P = T ∥ (p ∙ R)› show ?case
by auto
next
assume "¬ (x ♯ ( ν*xvec') M ≺ ' P)"
hence "x ∈ supp(( ν*xvec') M ≺ ' P)" by (simp add: fresh_def)
with Eq have "y ∈ supp(( ν*yvec') N ≺ ' (Q ∥ R))"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'" by (simp add: BOresChainSupp fresh_def)
with Eq' ‹ x ♯ yvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ ([(x, y)] ∙ R))"
by (simp add: eqvts)
moreover note ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
ultimately obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = T ∥ (p ∙ [(x, y)] ∙ R)" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac IH) auto
from S have "set(p@[(x, y)]) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ P = T ∥ (p ∙ [(x, y)] ∙ R)› have "P = T ∥ ((p @ [(x, y)]) ∙ R)"
by (simp add: pt2[OF pt_name_inst])
moreover from xFreshQR have xFreshQ: "x ♯ ( ν*yvec') N ≺ ' Q"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ x ≠ y› have "y ♯ ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (simp add: fresh_left calc_atm)
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› have "( νx) (( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)) = ( νy) (( ν*yvec') N ≺ ' Q)"
by (subst alphaBoundOutput) (assumption | simp add: eqvts)+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' Q)" by simp
ultimately show ?thesis using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by (rule_tac x="p@[(x, y)]" in exI) force
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar2Dest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * Q"
and "yvec ♯ * Q"
obtains T where "P = Q ∥ T" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof -
assume "∧ T. [ P = Q ∥ T; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ T. P = Q ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec ♯ * Q› ‹ yvec ♯ * Q› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "x ♯ Q" and "xvec' ♯ * Q" and "y ♯ Q" and "yvec' ♯ * Q" by auto
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * Q; yvec ♯ * Q; n = length xvec] ==> ∃ T. P = Q ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)
with ‹ xvec' ♯ * Q› ‹ yvec' ♯ * Q› ‹ length xvec' = n›
obtain T where "P = Q ∥ T" and "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' R"
by (drule_tac IH) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ x ♯ Q› ‹ y ♯ Q›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' (Q ∥ ([(x, y)] ∙ R))"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ yvec' ♯ * Q› have "([(x, y)] ∙ yvec') ♯ * ([(x, y)] ∙ Q)"
by (simp add: pt_fresh_star_bij[OF pt_name_inst, OF at_name_inst])
with ‹ x ♯ Q› ‹ y ♯ Q› have "([(x, y)] ∙ yvec') ♯ * Q" by simp
moreover note ‹ xvec' ♯ * Q› ‹ length xvec' = n›
ultimately obtain T where "P = Q ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (drule_tac IH) auto
from A have "( νx) (( ν*xvec') M ≺ ' T) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshQR have "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: boundOutputFresh)
ultimately show ?thesis using ‹ P = Q ∥ T› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshQR
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputPar2Dest':
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)"
and "xvec ♯ * yvec"
obtains T p where "set p ⊆ set xvec × set yvec" and "P = (p ∙ Q) ∥ T" and "( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof -
assume "∧ p T. [ set p ⊆ set xvec × set yvec; P = (p ∙ Q) ∥ T; ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ p T. set p ⊆ set xvec × set yvec ∧ P = (p ∙ Q) ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
proof (induct n arbitrary: xvec yvec M N P Q R)
case (0 xvec yvec M N P Q R)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q R)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (Q ∥ R)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' (Q ∥ R)"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence Eq: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' (Q ∥ R))"
by simp
from ‹ xvec = x#xvec'› ‹ yvec=y#yvec'› ‹ xvec ♯ * yvec› have "x ≠ y" and "x ♯ yvec'" and "y ♯ xvec'" and "xvec' ♯ * yvec'"
by auto
from Eq ‹ x ≠ y› have Eq': "( ν*xvec') M ≺ ' P = [(x, y)] ∙ ( ν*yvec') N ≺ ' (Q ∥ R)"
and xFreshQR: "x ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (simp add: boundOutput.inject alpha)+
have IH: "∧ xvec yvec M N P Q R. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' (Q ∥ R); xvec ♯ * yvec; n = length xvec] ==> ∃ p T. set p ⊆ set xvec × set yvec ∧ P = (p ∙ Q) ∥ T ∧ ( ν*xvec) M ≺ ' T = ( ν*yvec) N ≺ ' R"
by fact
show ?case
proof (case_tac "x ♯ ( ν*xvec') M ≺ ' P" )
assume "x ♯ ( ν*xvec') M ≺ ' P"
with Eq have yFreshQR: "y ♯ ( ν*yvec') N ≺ ' (Q ∥ R)"
by (rule boundOutputEqFresh)
with Eq' xFreshQR have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' (Q ∥ R)"
by simp
with ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = (p ∙ Q) ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') N ≺ ' R"
by (drule_tac IH) auto
from yFreshQR xFreshQR have yFreshR: "y ♯ ( ν*yvec') N ≺ ' R" and xFreshQ: "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
hence "( νx) (( ν*yvec') N ≺ ' R) = ( νy) (( ν*yvec') N ≺ ' R)" by (subst alphaBoundOutput) simp+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' R)" by simp
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› S ‹ P = (p ∙ Q) ∥ T› show ?case
by auto
next
assume "¬ (x ♯ ( ν*xvec') M ≺ ' P)"
hence "x ∈ supp(( ν*xvec') M ≺ ' P)" by (simp add: fresh_def)
with Eq have "y ∈ supp(( ν*yvec') N ≺ ' (Q ∥ R))"
by (rule boundOutputEqSupp)
hence "y ♯ yvec'" by (simp add: BOresChainSupp fresh_def)
with Eq' ‹ x ♯ yvec'› have "( ν*xvec') M ≺ ' P = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' (([(x, y)] ∙ Q) ∥ ([(x, y)] ∙ R))"
by (simp add: eqvts)
moreover note ‹ xvec' ♯ * yvec'› ‹ length xvec' = n›
ultimately obtain p T where S: "set p ⊆ set xvec' × set yvec'" and "P = (p ∙ [(x, y)] ∙ Q) ∥ T" and A: "( ν*xvec') M ≺ ' T = ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (drule_tac IH) auto
from S have "set(p@[(x, y)]) ⊆ set(x#xvec') × set(y#yvec')" by auto
moreover from ‹ P = (p ∙ [(x, y)] ∙ Q) ∥ T› have "P = ((p @ [(x, y)]) ∙ Q) ∥ T"
by (simp add: pt2[OF pt_name_inst])
moreover from xFreshQR have xFreshR: "x ♯ ( ν*yvec') N ≺ ' R"
by (force simp add: BOresChainSupp fresh_def boundOutput.supp psi.supp)+
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› ‹ x ≠ y› have "y ♯ ( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)"
by (simp add: fresh_left calc_atm)
with ‹ x ♯ yvec'› ‹ y ♯ yvec'› have "( νx) (( ν*yvec') ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ R)) = ( νy) (( ν*yvec') N ≺ ' R)"
by (subst alphaBoundOutput) (assumption | simp add: eqvts)+
with A have "( νx) (( ν*xvec') M ≺ ' T) = ( νy) (( ν*yvec') N ≺ ' R)" by simp
ultimately show ?thesis using ‹ xvec=x#xvec'› ‹ yvec=y#yvec'›
by (rule_tac x="p@[(x, y)]" in exI) force
qed
qed
ultimately show ?thesis
by blast
qed
lemma boundOutputApp:
fixes xvec :: "name list"
and yvec :: "name list"
and B :: "('a::fs_name, 'b::fs_name, 'c::fs_name) boundOutput"
shows "( ν*(xvec@yvec)) B = ( ν*xvec) (( ν*yvec) B)"
by (induct xvec) auto
lemma openInjectAuxAuxAux:
fixes x :: name
and xvec :: "name list"
shows "∃ y yvec. x # xvec = yvec @ [y] ∧ length xvec = length yvec"
apply (induct xvec arbitrary: x)
apply auto
apply (subgoal_tac "∃ y yvec. a # xvec = yvec @ [y] ∧ length xvec = length yvec" )
apply (clarify)
apply (rule_tac x=y in exI)
by auto
lemma openInjectAuxAux:
fixes xvec1 :: "name list"
and xvec2 :: "name list"
and yvec :: "name list"
assumes "length(xvec1@xvec2) = length yvec"
shows "∃ yvec1 yvec2. yvec = yvec1@yvec2 ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2"
using assms
apply (induct yvec arbitrary: xvec1)
apply simp
apply simp
apply (case_tac xvec1)
apply simp
apply simp
apply (subgoal_tac "∃ yvec1 yvec2.
yvec = yvec1 @ yvec2 ∧ length list = length yvec1 ∧ length xvec2 = length yvec2" )
apply (clarify)
apply (rule_tac x="a#yvec1" in exI)
apply (rule_tac x=yvec2 in exI)
by auto
lemma openInjectAux:
fixes xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and yvec :: "name list"
assumes "length(xvec1@x#xvec2) = length yvec"
shows "∃ yvec1 y yvec2. yvec = yvec1@y#yvec2 ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2"
using assms
apply (case_tac yvec)
apply simp
apply simp
apply (subgoal_tac "∃ (yvec1::name list) (yvec2::name list). yvec1@yvec2 = list ∧ length xvec1 = length yvec1 ∧ length xvec2 = length yvec2" )
apply (clarify)
apply hypsubst_thin
apply simp
apply (subgoal_tac "∃ y (yvec::name list). a # yvec1 = yvec @ [y] ∧ length yvec1 = length yvec" )
apply (clarify)
apply (rule_tac x=yvec in exI)
apply (rule_tac x=y in exI)
apply simp
apply (rule_tac x=yvec2 in exI)
apply simp
apply (rule openInjectAuxAuxAux)
apply (insert openInjectAuxAux)
apply simp
by blast
lemma boundOutputOpenDest:
fixes yvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( ν*(xvec1@x#xvec2)) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "x ♯ xvec1"
and "x ♯ yvec"
and "x ♯ N"
and "x ♯ Q"
and "distinct yvec"
obtains yvec1 y yvec2 where "yvec=yvec1@y#yvec2" and "length xvec1 = length yvec1" and "length xvec2 = length yvec2"
and "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
proof -
assume Ass: "∧ yvec1 y yvec2.
[ yvec = yvec1 @ y # yvec2; length xvec1 = length yvec1; length xvec2 = length yvec2;
( ν*(xvec1 @ xvec2)) M ≺ ' P = ( ν*(yvec1 @ yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)]
==> thesis"
from Eq have "length(xvec1@x#xvec2) = length yvec" by (rule boundOutputChainEqLength)
then obtain yvec1 y yvec2 where A: "yvec = yvec1@y#yvec2" and "length xvec1 = length yvec1"
and "length xvec2 = length yvec2"
by (metis openInjectAux sym)
from ‹ distinct yvec› A have "y ♯ yvec2" by simp
from A ‹ x ♯ yvec› have "x ♯ yvec2" and "x ♯ yvec1" by simp+
with Eq ‹ length xvec1 = length yvec1› ‹ x ♯ N› ‹ x ♯ Q› ‹ y ♯ yvec2› ‹ x ♯ xvec1› A
have "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (force dest: boundOutputChainOpenIH simp add: boundOutputApp BOresChainSupp fresh_def boundOutput.supp eqvts)
with ‹ length xvec1 = length yvec1› ‹ length xvec2 = length yvec2› A Ass show ?thesis
by blast
qed
lemma boundOutputOpenDest':
fixes yvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and xvec1 :: "name list"
and x :: name
and xvec2 :: "name list"
and N :: 'a
and Q :: "('a, 'b, 'c) psi"
assumes Eq: "( ν*(xvec1@x#xvec2)) M ≺ ' P = ( ν*yvec) N ≺ ' Q"
and "x ♯ xvec1"
and "x ♯ yvec"
and "x ♯ N"
and "x ♯ Q"
obtains yvec1 y yvec2 where "yvec=yvec1@y#yvec2" and "length xvec1 = length yvec1" and "length xvec2 = length yvec2"
and "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@[(x, y)] ∙ yvec2)) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
proof -
assume Ass: "∧ yvec1 y yvec2.
[ yvec = yvec1 @ y # yvec2; length xvec1 = length yvec1; length xvec2 = length yvec2;
( ν*(xvec1 @ xvec2)) M ≺ ' P = ( ν*(yvec1 @ ([(x, y)] ∙ yvec2))) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)]
==> thesis"
from Eq have "length(xvec1@x#xvec2) = length yvec" by (rule boundOutputChainEqLength)
then obtain yvec1 y yvec2 where A: "yvec = yvec1@y#yvec2" and "length xvec1 = length yvec1"
and "length xvec2 = length yvec2"
by (metis openInjectAux sym)
from A ‹ x ♯ yvec› have "x ♯ yvec2" and "x ♯ yvec1" by simp+
with Eq ‹ length xvec1 = length yvec1› ‹ x ♯ N› ‹ x ♯ Q› ‹ x ♯ xvec1› A
have "( ν*(xvec1@xvec2)) M ≺ ' P = ( ν*(yvec1@([(x, y)] ∙ yvec2))) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (force dest: boundOutputChainOpenIH simp add: boundOutputApp BOresChainSupp fresh_def boundOutput.supp eqvts)
with ‹ length xvec1 = length yvec1› ‹ length xvec2 = length yvec2› A Ass show ?thesis
by blast
qed
lemma boundOutputScopeDest:
fixes xvec :: "name list"
and M :: "'a::fs_name"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and yvec :: "name list"
and N :: 'a
and x :: name
and Q :: "('a, 'b, 'c) psi"
assumes "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' ( νz) Q"
and "z ♯ xvec"
and "z ♯ yvec"
obtains R where "P = ( νz) R" and "( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
proof -
assume "∧ R. [ P = ( νz) R; ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q] ==> thesis"
moreover obtain n where "n = length xvec" by auto
with assms have "∃ R. P = ( νz) R ∧ ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
proof (induct n arbitrary: xvec yvec M N P Q z)
case (0 xvec yvec M N P Q z)
have Eq: "( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' ( νz) Q" by fact
from ‹ 0 = length xvec› have "xvec = []" by auto
moreover with Eq have "yvec = []"
by (case_tac yvec) auto
ultimately show ?case using Eq
by (simp add: boundOutput.inject)
next
case (Suc n xvec yvec M N P Q z)
from ‹ Suc n = length xvec›
obtain x xvec' where "xvec = x#xvec'" and "length xvec' = n"
by (case_tac xvec) auto
from ‹ ( ν*xvec) M ≺ ' P = ( ν*yvec) N ≺ ' (( νz) Q)› ‹ xvec = x # xvec'›
obtain y yvec' where "( ν*(x#xvec')) M ≺ ' P = ( ν*(y#yvec')) N ≺ ' ( νz) Q"
and "yvec = y#yvec'"
by (case_tac yvec) auto
hence EQ: "( νx) (( ν*xvec') M ≺ ' P) = ( νy) (( ν*yvec') N ≺ ' ( νz) Q)"
by simp
from ‹ z ♯ xvec› ‹ z ♯ yvec› ‹ xvec = x#xvec'› ‹ yvec = y#yvec'›
have "z ≠ x" and "z ≠ y" and "z ♯ xvec'" and "z ♯ yvec'"
by simp+
have IH: "∧ xvec yvec M N P Q z. [ ( ν*xvec) M ≺ ' (P::('a, 'b, 'c) psi) = ( ν*yvec) N ≺ ' ( νz) Q; z ♯ xvec; z ♯ yvec; n = length xvec] ==> ∃ R. P = ( νz) R ∧ ( ν*xvec) M ≺ ' R = ( ν*yvec) N ≺ ' Q"
by fact
show ?case
proof (case_tac "x = y" )
assume "x = y"
with EQ have "( ν*xvec') M ≺ ' P = ( ν*yvec') N ≺ ' ( νz) Q"
by (simp add: boundOutput.inject alpha)
with ‹ z ♯ xvec'› ‹ z ♯ yvec'› ‹ length xvec' = n›
obtain R where "P = ( νz) R" and "( ν*xvec') M ≺ ' R = ( ν*yvec') N ≺ ' Q"
by (drule_tac IH) auto
with ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› ‹ x=y› show ?case
by (force simp add: boundOutput.inject alpha)
next
assume "x ≠ y"
with EQ ‹ z ≠ x› ‹ z ≠ y›
have "( ν*xvec') M ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ( νz) ([(x, y)] ∙ Q)"
and xFreshzQ: "x ♯ ( ν*yvec') N ≺ ' ( νz) Q"
by (simp add: boundOutput.inject alpha eqvts)+
moreover from ‹ z ≠ x› ‹ z ≠ y› ‹ z ♯ yvec'› ‹ x ≠ y› have "z ♯ ([(x, y)] ∙ yvec')"
by (simp add: fresh_left calc_atm)
moreover note ‹ z ♯ xvec'› ‹ length xvec' = n›
ultimately obtain R where "P = ( νz) R" and A: "( ν*xvec') M ≺ ' R = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q)"
by (drule_tac IH) auto
from A have "( νx) (( ν*xvec') M ≺ ' R) = ( νx) (( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ N) ≺ ' ([(x, y)] ∙ Q))"
by (simp add: boundOutput.inject alpha)
moreover from xFreshzQ ‹ z ≠ x› have "x ♯ ( ν*yvec') N ≺ ' Q"
by (simp add: boundOutputFresh abs_fresh)
ultimately show ?thesis using ‹ P = ( νz) R› ‹ xvec=x#xvec'› ‹ yvec=y#yvec'› xFreshzQ
by (force simp add: alphaBoundOutput name_swap eqvts)
qed
qed
ultimately show ?thesis
by blast
qed
nominal_datatype ('a, 'b, 'c) residual =
RIn "'a::fs_name" 'a "('a, 'b::fs_name, 'c::fs_name) psi"
| ROut 'a "('a, 'b, 'c) boundOutput"
| RTau "('a, 'b, 'c) psi"
nominal_datatype 'a action = In "'a::fs_name" 'a (‹ _( _) › [90 , 90 ] 90 )
| Out "'a::fs_name" "name list" 'a (‹ _( ν*_) ⟨ _⟩ › [90 , 90 , 90 ] 90 )
| Tau (‹ τ› 90 )
nominal_primrec bn :: "('a::fs_name) action ==> name list"
where
"bn (M( N) ) = []"
| "bn (M( ν*xvec) ⟨ N⟩ ) = xvec"
| "bn (τ) = []"
by (rule TrueI)+
lemma bnEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ bn α) = bn(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
nominal_primrec create_residual :: "('a::fs_name) action ==> ('a, 'b::fs_name, 'c::fs_name) psi ==> ('a, 'b, 'c) residual" (‹ _ ≺ _› [80 , 80 ] 80 )
where
"(M( N) ) ≺ P = RIn M N P"
| "M( ν*xvec) ⟨ N⟩ ≺ P = ROut M (( ν*xvec) (N ≺ ' P))"
| "τ ≺ P = (RTau P)"
by (rule TrueI)+
nominal_primrec subject :: "('a::fs_name) action ==> 'a option"
where
"subject (M( N) ) = Some M"
| "subject (M( ν*xvec) ⟨ N⟩ ) = Some M"
| "subject (τ) = None"
by (rule TrueI)+
nominal_primrec object :: "('a::fs_name) action ==> 'a option"
where
"object (M( N) ) = Some N"
| "object (M( ν*xvec) ⟨ N⟩ ) = Some N"
| "object (τ) = None"
by (rule TrueI)+
lemma optionFreshChain[simp]:
fixes xvec :: "name list"
and X :: "name set"
shows "xvec ♯ * (Some x) = xvec ♯ * x"
and "X ♯ * (Some x) = X ♯ * x"
and "xvec ♯ * None"
and "X ♯ * None"
by (auto simp add: fresh_star_def fresh_some fresh_none)
lemmas [simp] = fresh_some fresh_none
lemma actionFresh[simp]:
fixes x :: name
and α :: "('a::fs_name) action"
shows "(x ♯ α) = (x ♯ (subject α) ∧ x ♯ (bn α) ∧ x ♯ (object α))"
by (nominal_induct α rule: action.strong_induct) auto
lemma actionFreshChain[simp]:
fixes X :: "name set"
and α :: "('a::fs_name) action"
and xvec :: "name list"
shows "(X ♯ * α) = (X ♯ * (subject α) ∧ X ♯ * (bn α) ∧ X ♯ * (object α))"
and "(xvec ♯ * α) = (xvec ♯ * (subject α) ∧ xvec ♯ * (bn α) ∧ xvec ♯ * (object α))"
by (auto simp add: fresh_star_def)
lemma subjectEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ subject α) = subject(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
lemma okjectEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
shows "(p ∙ object α) = object(p ∙ α)"
by (nominal_induct α rule: action.strong_induct) auto
lemma create_residualEqvt[eqvt]:
fixes p :: "name prm"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(p ∙ (α ≺ P)) = (p ∙ α) ≺ (p ∙ P)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: eqvts)
lemma residualFresh:
fixes x :: name
and α :: "'a::fs_name action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "(x ♯ (α ≺ P)) = (x ♯ (subject α) ∧ (x ∈ (set(bn(α))) ∨ (x ♯ object(α) ∧ x ♯ P)))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: fresh_some fresh_none boundOutputFresh)
lemma residualFresh2[simp]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ α"
and "x ♯ P"
shows "x ♯ α ≺ P"
using assms
by (nominal_induct α rule: action.strong_induct) auto
lemma residualFreshChain2[simp]:
fixes xvec :: "name list"
and X :: "name set"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "[ xvec ♯ * α; xvec ♯ * P] ==> xvec ♯ * (α ≺ P)"
and "[ X ♯ * α; X ♯ * P] ==> X ♯ * (α ≺ P)"
by (auto simp add: fresh_star_def)
lemma residualFreshSimp[simp]:
fixes x :: name
and M :: "'a::fs_name"
and N :: 'a
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "x ♯ (M( N) ≺ P) = (x ♯ M ∧ x ♯ N ∧ x ♯ P)"
and "x ♯ (M( ν*xvec) ⟨ N⟩ ≺ P) = (x ♯ M ∧ x ♯ (( ν*xvec) (N ≺ ' P)))"
and "x ♯ (τ ≺ P) = (x ♯ P)"
by (auto simp add: residualFresh)
lemma residualInject':
shows "(α ≺ P = RIn M N Q) = (P = Q ∧ α = M( N) )"
and "(α ≺ P = ROut M B) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
and "(α ≺ P = RTau Q) = (α = τ ∧ P = Q)"
and "(RIn M N Q = α ≺ P) = (P = Q ∧ α = M( N) )"
and "(ROut M B = α ≺ P) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
and "(RTau Q = α ≺ P) = (α = τ ∧ P = Q)"
proof -
show "(α ≺ P = RIn M N Q) = (P = Q ∧ α = M( N) )"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(α ≺ P = ROut M B) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(α ≺ P = RTau Q) = (α = τ ∧ P = Q)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(RIn M N Q = α ≺ P) = (P = Q ∧ α = M( N) )"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(ROut M B = α ≺ P) = (∃ xvec N. α = M( ν*xvec) ⟨ N⟩ ∧ B = ( ν*xvec) (N ≺ ' P))"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
next
show "(RTau Q = α ≺ P) = (α = τ ∧ P = Q)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residual.inject action.inject)
qed
lemma residualFreshChainSimp[simp]:
fixes xvec :: "name list"
and X :: "name set"
and M :: "'a::fs_name"
and N :: 'a
and yvec :: "name list"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "xvec ♯ * (M( N) ≺ P) = (xvec ♯ * M ∧ xvec ♯ * N ∧ xvec ♯ * P)"
and "xvec ♯ * (M( ν*yvec) ⟨ N⟩ ≺ P) = (xvec ♯ * M ∧ xvec ♯ * (( ν*yvec) (N ≺ ' P)))"
and "xvec ♯ * (τ ≺ P) = (xvec ♯ * P)"
and "X ♯ * (M( N) ≺ P) = (X ♯ * M ∧ X ♯ * N ∧ X ♯ * P)"
and "X ♯ * (M( ν*yvec) ⟨ N⟩ ≺ P) = (X ♯ * M ∧ X ♯ * (( ν*yvec) (N ≺ ' P)))"
and "X ♯ * (τ ≺ P) = (X ♯ * P)"
by (auto simp add: fresh_star_def)
lemma residualFreshChainSimp2[simp]:
fixes xvec :: "name list"
and X :: "name set"
and M :: "'a::fs_name"
and N :: 'a
and yvec :: "name list"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
shows "xvec ♯ * (RIn M N P) = (xvec ♯ * M ∧ xvec ♯ * N ∧ xvec ♯ * P)"
and "xvec ♯ * (ROut M B) = (xvec ♯ * M ∧ xvec ♯ * B)"
and "xvec ♯ * (RTau P) = (xvec ♯ * P)"
and "X ♯ * (RIn M N P) = (X ♯ * M ∧ X ♯ * N ∧ X ♯ * P)"
and "X ♯ * (ROut M B) = (X ♯ * M ∧ X ♯ * B)"
and "X ♯ * (RTau P) = (X ♯ * P)"
by (auto simp add: fresh_star_def)
lemma freshResidual3[dest]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ bn α"
and "x ♯ α ≺ P"
shows "x ♯ α" and "x ♯ P"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidualChain3[dest]:
fixes xvec :: "name list"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "xvec ♯ * (α ≺ P)"
and "xvec ♯ * bn α"
shows "xvec ♯ * α" and "xvec ♯ * P"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidual4[dest]:
fixes x :: name
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "x ♯ α ≺ P"
shows "x ♯ subject α"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma freshResidualChain4[dest]:
fixes xvec :: "name list"
and α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
assumes "xvec ♯ * (α ≺ P)"
shows "xvec ♯ * subject α"
using assms
by (nominal_induct rule: action.strong_induct) auto
lemma alphaOutputResidual:
fixes M :: "'a::fs_name"
and xvec :: "name list"
and N :: 'a
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and p :: "name prm"
assumes "(p ∙ xvec) ♯ * N"
and "(p ∙ xvec) ♯ * P"
and "set p ⊆ set xvec × set(p ∙ xvec)"
and "set xvec ⊆ set yvec"
shows "M( ν*yvec) ⟨ N⟩ ≺ P = M( ν*(p ∙ yvec)) ⟨ (p ∙ N)⟩ ≺ (p ∙ P)"
using assms
by (simp add: boundOutputChainAlpha'')
lemmas [simp del] = create_residual.simps
lemma residualInject'':
assumes "bn α = bn β"
shows "(α ≺ P = β ≺ Q) = (α = β ∧ P = Q)"
using assms
apply (nominal_induct α rule: action.strong_induct)
apply (auto simp add: residual.inject create_residual.simps residualInject' action.inject boundOutput.inject)
by (rule_tac x="bn β" in exI) auto
lemmas residualInject = residual.inject create_residual.simps residualInject' residualInject''
lemma bnFreshResidual[simp]:
fixes α :: "('a::fs_name) action"
shows "(bn α) ♯ * (α ≺ P) = bn α ♯ * (subject α)"
by (nominal_induct α rule: action.strong_induct)
(auto simp add: residualFresh fresh_some fresh_star_def)
lemma actionCases[case_names cInput cOutput cTau]:
fixes α :: "('a::fs_name) action"
assumes "∧ M N. α = M( N) ==> Prop"
and "∧ M xvec N. α = M( ν*xvec) ⟨ N⟩ ==> Prop"
and "α = τ ==> Prop"
shows Prop
using assms
by (nominal_induct α rule: action.strong_induct) auto
lemma actionPar1Dest:
fixes α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and β :: "('a::fs_name) action"
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ (Q ∥ R)"
and "bn α ♯ * bn β"
obtains T p where "set p ⊆ set(bn α) × set(bn β)" and "P = T ∥ (p ∙ R)" and "α ≺ T = β ≺ Q"
using assms
apply (cases rule: actionCases[where α=α])
apply (auto simp add: residualInject)
by (drule_tac boundOutputPar1Dest') auto
lemma actionPar2Dest:
fixes α :: "('a::fs_name) action"
and P :: "('a, 'b::fs_name, 'c::fs_name) psi"
and β :: "('a::fs_name) action"
and Q :: "('a, 'b, 'c) psi"
and R :: "('a, 'b, 'c) psi"
assumes "α ≺ P = β ≺ (Q ∥ R)"
and "bn α ♯ : Christi Linden, Wirt, Techn ät
obtains T p where " set p ⊆ set(bn β Q) ∥ prec> T = β R"
using
apply(cases rule: actionCases[where α])
apply(auto simp add: residualInject)
by(drule_tac boundOutputPar2Dest') auto
lemma actionScopeDest:
fixes α :: " ('a::fs_name) action"
and P :: " ('a, 'b::fs_name, 'c::fs_name) psi"
fixes β :: " ('a::fs_name) action"
and x :: name
and Q :: " ('a, 'b, 'c) psi"
assumes " α ≺ P = β ≺ ( νx) Q"
and " x ♯ bn α"
and " x ♯ bn β"
obtains R where " P = ( νx) R" and " α ≺ R = β ≺ Q"
using assms
apply(cases rule: actionCases[where α=α])
apply(auto simp add: residualInject)
by(drule_tac boundOutputScopeDest) auto
abbreviation
outputJudge (‹ _⟨ _⟩ › [110, 110] 110) where " M⟨ N⟩ ≡ M( ν*([])) ⟨ N⟩ "
declare [[unify_trace_bound=100]]
locale env = substPsi substTerm substAssert substCond +
assertion SCompose' SImp' SBottom' SChanEq'
for substTerm :: " ('a::fs_name) ==> name list ==> 'a::fs_name list ==> 'a"
and substAssert :: " ('b::fs_name) ==> name list ==> 'a::fs_name list ==> 'b"
and substCond :: " ('c::fs_name) ==> name list ==> 'a::fs_name list ==> 'c"
and SCompose' :: " 'b ==> 'b ==> 'b"
and SImp' :: " 'b ==> 'c ==> bool"
and SBottom' :: 'b
and SChanEq' :: " 'a ==> 'a ==> 'c"
begin
notation SCompose' (infixr ‹ ⊗ › 90)
notation SImp' (‹ _ ⊨ _› [85, 85] 85)
notation FrameImp (‹ _ ⊨ F _› [85, 85] 85)
abbreviation
FBottomJudge (‹ ⊥ F › 90) where " ⊥ F ≡ (FAssert SBottom')"
notation SChanEq' (‹ _ ↔ _› [90, 90] 90)
notation substTerm (‹ _[_::=_]› [100, 100, 100] 100)
notation subs (‹ _[_::=_]› [100, 100, 100] 100)
notation AssertionStatEq (‹ _ ≃ _› [80, 80] 80)
notation FrameStatEq (‹ _ ≃ F _› [80, 80] 80)
notation SBottom' (‹ 1 › 190)
abbreviation insertAssertion' (‹ insertAssertion› ) where " insertAssertion' ≡ assertionAux.insertAssertion (⊗ )"
inductive semantics :: " 'b ==> ('a, 'b, 'c) psi ==> ('a, 'b, 'c) residual ==> bool"
(‹ _ ⊳ _ ⟼ _› [50, 50, 50] 50)
where
cInput: " [ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N; xvec ♯ * Tvec;
length xvec = length Tvec;
xvec ♯ * Ψ; xvec ♯ * M; xvec ♯ * K] ==> Ψ ⊳ M( λ*xvec N) .P ⟼ K( (N[xvec::=Tvec])) ≺ P[xvec::=Tvec]"
| Output: " [ Ψ ⊨ M ↔ K] ==> Ψ ⊳ M⟨ N⟩ .P ⟼ K⟨ N⟩ ≺ P"
| Case: " [ Ψ ⊳ P ⟼ Rs; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==> Ψ ⊳ Cases Cs ⟼ Rs"
| cPar1: " [ (Ψ ⊗ ΨQ ) ⊳ P ⟼ α ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * ΨQ ; bn α ♯ * Q; bn α ♯ * P; bn α ♯ * (subject α)] ==>
Ψ ⊳ P ∥ Q ⟼ α ≺ (P' ∥ Q)"
| cPar2: " [ (Ψ ⊗ ΨP ) ⊳ Q ⟼ α ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * ΨP ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * (subject α)] ==>
Ψ ⊳ P ∥ Q ⟼ α ≺ (P ∥ Q')"
| cComm1: " [ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec;
AQ ♯ * Ψ; AQ ♯ * ΨP ; AQ ♯ * P; AQ ♯ * N; AQ ♯ * P';
AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; AQ ♯ * xvec; distinct xvec;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K] ==>
Ψ ⊳ P ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')"
| cComm2: " [ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec;
AQ ♯ * Ψ; AQ ♯ * ΨP ; AQ ♯ * P; AQ ♯ * N; AQ ♯ * P';
AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; AQ ♯ * xvec; distinct xvec;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K] ==>
Ψ ⊳ P ∥ Q ⟼ τ ≺ ( ν*xvec) (P' ∥ Q')"
| cOpen: " [ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; x ♯ xvec; x ♯ yvec; x ♯ M; x ♯ Ψ;
distinct xvec; distinct yvec;
xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * yvec; yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M] ==>
Ψ ⊳ ( νx) P ⟼ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'"
| cScope: " [ Ψ ⊳ P ⟼ α ≺ P'; x ♯ Ψ; x ♯ α; bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * (subject α); distinct(bn α)] ==> Ψ ⊳ ( νx) P ⟼ α ≺ (( νx) P')"
| Bang: " [ Ψ ⊳ P ∥ !P ⟼ Rs; guarded P] ==> Ψ ⊳ !P ⟼ Rs"
abbreviation
semanticsBottomJudge (‹ _ ⟼ _› [50, 50] 50) where " P ⟼ Rs ≡ 1 ⊳ P ⟼ Rs"
equivariance env.semantics
nominal_inductive2 env.semantics
avoids cInput: " set xvec"
| cPar1: " set AQ ∪ set(bn α)"
| cPar2: " set AP ∪ set(bn α)"
| cComm1: " set AP ∪ set AQ ∪ set xvec"
| cComm2: " set AP ∪ set AQ ∪ set xvec"
| cOpen: " {x} ∪ set xvec ∪ set yvec"
| cScope: " {x} ∪ set(bn α)"
apply(auto intro: substTerm.subst4Chain subst4Chain simp add: abs_fresh residualFresh)
apply(force simp add: fresh_star_def abs_fresh)
apply(simp add: boundOutputFresh)
apply(simp add: boundOutputFreshSet)
apply(simp add: boundOutputFreshSet)
by(simp add: fresh_star_def abs_fresh)
lemma nilTrans[dest]:
fixes Ψ :: 'b
and Rs :: " ('a, 'b, 'c) residual"
and M :: 'a
and xvec :: " name list"
and N :: 'a
and P :: " ('a, 'b, 'c) psi"
and K :: 'a
and yvec :: " name list"
and N' :: 'a
and P' :: " ('a, 'b, 'c) psi"
and CsP :: " ('c × ('a, 'b, 'c) psi) list"
and Ψ' :: 'b
shows " Ψ ⊳ 0 ⟼ Rs ==> False"
and " Ψ ⊳ M( λ*xvec N) .P ⟼ K( ν*yvec) ⟨ N'⟩ ≺ P' ==> False"
and " Ψ ⊳ M( λ*xvec N) .P ⟼ τ ≺ P' ==> False"
and " Ψ ⊳ M⟨ N⟩ .P ⟼ K( N') ≺ P' ==> False"
and " Ψ ⊳ M⟨ N⟩ .P ⟼ τ ≺ P' ==> False"
and " Ψ ⊳ { Ψ'} ⟼ Rs ==> False"
apply(cases rule: semantics.cases) apply auto
apply(cases rule: semantics.cases) apply(auto simp add: residualInject)
apply(cases rule: semantics.cases) apply(auto simp add: residualInject)
apply(cases rule: semantics.cases) apply(auto simp add: residualInject)
apply(cases rule: semantics.cases) apply(auto simp add: residualInject)
by(cases rule: semantics.cases) (auto simp add: residualInject)
lemma residualEq:
fixes α :: " 'a action"
and P :: " ('a, 'b, 'c) psi"
and β :: " 'a action"
and Q :: " ('a, 'b, 'c) psi"
assumes " α ≺ P = β ≺ Q"
and " bn α ♯ * (bn β)"
and " distinct(bn α)"
and " distinct(bn β)"
and " bn α ♯ * (α ≺ P)"
and " bn β ♯ * (β ≺ Q)"
obtains p where " set p ⊆ set(bn α) × set(bn(p ∙ α))" and " distinctPerm p" and " β = p ∙ α" and " Q = p ∙ P" and " bn α ♯ * β" and " bn α ♯ * Q" and " bn(p ∙ α) ♯ * α" and " bn(p ∙ α) ♯ * P"
using assms
proof(nominal_induct α rule: action.strong_induct)
case(In M N)
thus ?case by(simp add: residualInject)
next
case(Out M xvec N)
thus ?case
by(auto simp add: residualInject)
(drule_tac boundOutputChainEq'', auto)
next
case Tau
thus ?case by(simp add: residualInject)
qed
lemma semanticsInduct[consumes 3, case_names cAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and α :: " 'a action"
and P' :: " ('a, 'b, 'c) psi"
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
'a action ==> ('a, 'b, 'c) psi ==> bool"
and C :: " 'd::fs_name"
assumes " Ψ ⊳ P ⟼ α ≺ P'"
and " bn α ♯ * (subject α)"
and " distinct(bn α)"
and rAlpha: " ∧ Ψ P α P' p C. [ bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * (subject α);
bn α ♯ * C; bn α ♯ * (bn(p ∙ α));
set p ⊆ set(bn α) × set(bn(p ∙ α)); distinctPerm p;
(bn(p ∙ α)) ♯ * α; (bn(p ∙ α)) ♯ * P'; Prop C Ψ P α P'] ==>
Prop C Ψ P (p ∙ α) (p ∙ P')"
and rInput: " ∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
(K( (N[xvec::=Tvec])) ) (P[xvec::=Tvec])"
and rOutput: " ∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) (K⟨ N⟩ ) P"
and rCase: " ∧ Ψ P α P' φ Cs C. [ Ψ ⊳ P ⟼ α ≺ P'; ∧ C. Prop C Ψ P α P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) α P'"
and rPar1: " ∧ Ψ ΨQ P α P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P α P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; AQ ♯ * C; distinct(bn α); bn α ♯ * Q;
bn α ♯ * Ψ; bn α ♯ * ΨQ ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) α (P' ∥ Q)"
and rPar2: " ∧ Ψ ΨP Q α Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q α Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; AP ♯ * C; distinct(bn α); bn α ♯ * Q;
bn α ♯ * Ψ; bn α ♯ * ΨP ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) α (P ∥ Q')"
and rComm1: " ∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( N) ) P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; ∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( ν*xvec) ⟨ N⟩ ) Q';
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; distinct xvec;
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
and rComm2: " ∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( ν*xvec) ⟨ N⟩ ) P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; ∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( N) ) Q';
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q'; distinct xvec;
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
and rOpen: " ∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ) P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; distinct xvec; distinct yvec;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ) P'"
and rScope: " ∧ Ψ P α P' x C.
[ Ψ ⊳ P ⟼ α ≺ P'; ∧ C. Prop C Ψ P α P';
x ♯ Ψ; x ♯ α; bn α ♯ * Ψ;
bn α ♯ * P; bn α ♯ * (subject α); x ♯ C; bn α ♯ * C; distinct(bn α)] ==>
Prop C Ψ (( νx) P) α (( νx) P')"
and rBang: " ∧ Ψ P α P' C.
[ Ψ ⊳ P ∥ !P ⟼ α ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) α P'] ==>
Prop C Ψ (!P) α P'"
shows " Prop C Ψ P α P'"
using ‹ Ψ ⊳ P ⟼ α ≺ P'› ‹ bn α ♯ * (subject α)› ‹ distinct(bn α)›
proof(nominal_induct x3==" α ≺ P'" avoiding: α C arbitrary: P' rule: semantics.strong_induct)
case(cInput Ψ M K xvec N Tvec P α C P')
thus ?case by(force intro: rInput simp add: residualInject)
next
case(Output Ψ M K N P α C P')
thus ?case by(force intro: rOutput simp add: residualInject)
next
case(Case Ψ P Rs φ Cs α C)
thus ?case by(auto intro: rCase)
next
case(cPar1 Ψ ΨQ P α P' Q AQ α' C P'')
note ‹ α ≺ (P' ∥ Q) = α' ≺ P''›
moreover from ‹ bn α ♯ * α'› have " bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have " bn α ♯ * (α ≺ P' ∥ Q)" and " bn α' ♯ * (α' ≺ P'')" by simp+
ultimately obtain p where S: " (set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and " distinctPerm p"
and αEq: " α' = p ∙ α" and P'eq: " P'' = p ∙ (P' ∥ Q)" and " (bn(p ∙ α)) ♯ * α"
and " (bn(p ∙ α)) ♯ * (P' ∥ Q)"
by(rule residualEq)
note ‹ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'› ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ › ‹ distinct AQ ›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have " ∧ C. Prop C (Ψ ⊗ ΨQ ) P α P'" by(rule_tac cPar1) auto
moreover note ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * C›
‹ bn α ♯ * Q› ‹ distinct(bn α)› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * ΨQ › ‹ bn α ♯ * P› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C ›
ultimately have " Prop C Ψ (P ∥ Q) α (P' ∥ Q)"
by(rule_tac rPar1)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * bn α'› S ‹ distinctPerm p› ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (P' ∥ Q)› ‹ AQ ♯ * C›
have " Prop C Ψ (P ∥ Q) (p ∙ α) (p ∙ (P' ∥ Q))"
by(rule_tac rAlpha) auto
with αEq P'eq ‹ distinctPerm p› show ?case by simp
next
case(cPar2 Ψ ΨP Q α Q' P AP α' C Q'')
note ‹ α ≺ (P ∥ Q') = α' ≺ Q''›
moreover from ‹ bn α ♯ * α'› have " bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have " bn α ♯ * (α ≺ P ∥ Q')" and " bn α' ♯ * (α' ≺ Q'')" by simp+
ultimately obtain p where S: " (set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and " distinctPerm p"
and αEq: " α' = p ∙ α" and Q'eq: " Q'' = p ∙ (P ∥ Q')" and " (bn(p ∙ α)) ♯ * α"
and " (bn(p ∙ α)) ♯ * (P ∥ Q')"
by(rule residualEq)
note ‹ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'› ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ distinct AP ›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have " ∧ C. Prop C (Ψ ⊗ ΨP ) Q α Q'" by(rule_tac cPar2) auto
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * C›
‹ bn α ♯ * Q› ‹ distinct(bn α)› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * P› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C ›
ultimately have " Prop C Ψ (P ∥ Q) α (P ∥ Q')"
by(rule_tac rPar2)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * (bn α')› S ‹ distinctPerm p› ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (P ∥ Q')›
have " Prop C Ψ (P ∥ Q) (p ∙ α) (p ∙ (P ∥ Q'))"
by(rule_tac rAlpha) auto
with αEq Q'eq ‹ distinctPerm p› show ?case by simp
next
case(cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ α C P'')
hence " Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
by(rule_tac rComm1) (assumption | simp)+
thus ?case using ‹ τ ≺ ( ν*xvec) (P' ∥ Q') = α ≺ P''›
by(simp add: residualInject)
next
case(cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ α C P'')
hence " Prop C Ψ (P ∥ Q) (τ) (( ν*xvec) (P' ∥ Q'))"
by(rule_tac rComm2) (assumption | simp)+
thus ?case using ‹ τ ≺ ( ν*xvec) (P' ∥ Q') = α ≺ P''›
by(simp add: residualInject)
next
case(cOpen Ψ P M xvec yvec N P' x α C P'')
note ‹ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P' = α ≺ P''›
moreover from ‹ xvec ♯ * α› ‹ x ♯ α› ‹ yvec ♯ * α› have " (xvec@x#yvec) ♯ * (bn α)"
by auto
moreover from ‹ xvec ♯ * yvec› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ distinct xvec› ‹ distinct yvec ›
have " distinct(xvec@x#yvec)"
by(auto simp add: fresh_star_def) (simp add: fresh_def name_list_supp)
moreover note ‹ distinct(bn α)›
moreover from ‹ xvec ♯ * M› ‹ x ♯ M› ‹ yvec ♯ * M› have " (xvec@x#yvec) ♯ * M" by auto
hence " (xvec@x#yvec) ♯ * (M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P')" by auto
moreover from ‹ bn α ♯ * subject α› have " bn α ♯ * (α ≺ P'')" by simp
ultimately obtain p where S: " (set p) ⊆ (set(xvec@x#yvec)) × (set(p ∙ (xvec@x#yvec)))" and " distinctPerm p"
and αeq: " α = (p ∙ M)( ν*(p ∙ (xvec@x#yvec))) ⟨ (p ∙ N)⟩ " and P'eq: " P'' = (p ∙ P')"
and A: " (xvec@x#yvec) ♯ * ((p ∙ M)( ν*(p ∙ (xvec@x#yvec))) ⟨ (p ∙ N)⟩ )"
and B: " (p ∙ (xvec@x#yvec)) ♯ * (M( ν*(xvec@x#yvec)) ⟨ N⟩ )"
and C: " (p ∙ (xvec@x#yvec)) ♯ * P'"
by(rule_tac residualEq) (assumption | simp)+
note ‹ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'› ‹ x ∈ (supp N)›
moreover {
fix C
from ‹ xvec ♯ * M› ‹ yvec ♯ * M› have " (xvec@yvec) ♯ * M" by simp
moreover from ‹ distinct xvec› ‹ distinct yvec› ‹ xvec ♯ * yvec› have " distinct(xvec@yvec)"
by auto (simp add: fresh_star_def name_list_supp fresh_def)
ultimately have " Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ) P'" by(rule_tac cOpen) auto
}
moreover note ‹ x ♯ Ψ› ‹ x ♯ M› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ xvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ xvec ♯ * M›
‹ yvec ♯ * Ψ› ‹ yvec ♯ * P› ‹ yvec ♯ * M› ‹ yvec ♯ * C› ‹ x ♯ C› ‹ xvec ♯ * C› ‹ distinct xvec › ‹ distinct yvec›
ultimately have " Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ) P'"
by(rule_tac rOpen)
with ‹ xvec ♯ * Ψ› ‹ yvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ yvec ♯ * P› ‹ xvec ♯ * M› ‹ yvec ♯ * M›
‹ yvec ♯ * C› S ‹ distinctPerm p› ‹ x ♯ C› ‹ xvec ♯ * C›
‹ x ♯ Ψ› ‹ x ♯ M› ‹ x ♯ xvec› ‹ x ♯ yvec› A B C
have " Prop C Ψ (( νx) P) (p ∙ (M( ν*(xvec@x#yvec)) ⟨ N⟩ )) (p ∙ P')"
apply(rule_tac α=" M( ν*(xvec@x#yvec)) ⟨ N⟩ " in rAlpha)
apply(assumption | simp)+
apply(fastforce simp add: fresh_star_def abs_fresh)
by(assumption | simp)+
with αeq P'eq show ?case by simp
next
case(cScope Ψ P α P' x α' C P'')
note ‹ α ≺ (( νx) P') = α' ≺ P''›
moreover from ‹ bn α ♯ * α'› have " bn α ♯ * (bn α')" by auto
moreover note ‹ distinct (bn α)› ‹ distinct(bn α')›
moreover from ‹ bn α ♯ * subject α› ‹ bn α' ♯ * subject α'›
have " bn α ♯ * (α ≺ ( νx) P')" and " bn α' ♯ * (α' ≺ P'')" by simp+
ultimately obtain p where S: " (set p) ⊆ (set(bn α)) × (set(bn(p ∙ α)))" and " distinctPerm p"
and αEq: " α' = p ∙ α" and P'eq: " P'' = p ∙ (( νx) P')" and " (bn(p ∙ α)) ♯ * α"
and " (bn(p ∙ α)) ♯ * (( νx) P')"
by(rule residualEq)
note ‹ Ψ ⊳ P ⟼ α ≺ P'›
moreover from ‹ bn α ♯ * subject α› ‹ distinct(bn α)›
have " ∧ C. Prop C Ψ P α P'" by(rule_tac cScope) auto
moreover note ‹ x ♯ Ψ› ‹ x ♯ α› ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * subject α›
‹ x ♯ C› ‹ bn α ♯ * C› ‹ distinct(bn α)›
ultimately have " Prop C Ψ (( νx) P) α (( νx) P')"
by(rule rScope)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ x ♯ α› ‹ bn α ♯ * subject α› ‹ bn α ♯ * C› ‹ bn α ♯ * (bn α')› S ‹ distinctPerm p› ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * (( νx) P')›
have " Prop C Ψ (( νx) P) (p ∙ α) (p ∙ (( νx) P'))"
by(rule_tac rAlpha) simp+
with αEq P'eq ‹ distinctPerm p› show ?case by simp
next
case(Bang Ψ P Rs α C)
thus ?case by(rule_tac rBang) auto
qed
lemma outputInduct[consumes 1, case_names cOutput cCase cPar1 cPar2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and M :: 'a
and B :: " ('a, 'b, 'c) boundOutput"
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
'a ==> ('a, 'b, 'c) boundOutput ==> bool"
and C :: " 'd::fs_name"
assumes " Ψ ⊳ P ⟼ ROut M B"
and rOutput: " ∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) K (N ≺ ' P)"
and rCase: " ∧ Ψ P M B φ Cs C.
[ Ψ ⊳ P ⟼ (ROut M B); ∧ C. Prop C Ψ P M B; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M B"
and rPar1: " ∧ Ψ ΨQ P M xvec N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M (( ν*xvec) N ≺ ' P');
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M;
AQ ♯ * xvec; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M (( ν*xvec) N ≺ ' (P' ∥ Q))"
and rPar2: " ∧ Ψ ΨP Q M xvec N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M (( ν*xvec) N ≺ ' Q');
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M;
AP ♯ * xvec; AP ♯ * N; AP ♯ * Q'; AP ♯ * C; xvec ♯ * P;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * Q; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M (( ν*xvec) N ≺ ' (P ∥ Q'))"
and rOpen: " ∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P M (( ν*(xvec@yvec)) N ≺ ' P');
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * yvec; yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (( ν*(xvec@x#yvec)) N ≺ ' P')"
and rScope: " ∧ Ψ P M xvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M (( ν*xvec) N ≺ ' P');
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ N; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (( ν*xvec) N ≺ ' ( νx) P')"
and rBang: " ∧ Ψ P M B C.
[ Ψ ⊳ P ∥ !P ⟼ (ROut M B); guarded P; ∧ C. Prop C Ψ (P ∥ !P) M B] ==>
Prop C Ψ (!P) M B"
shows " Prop C Ψ P M B"
using ‹ Ψ ⊳ P ⟼ (ROut M B)›
proof(nominal_induct Ψ P Rs==" (ROut M B)" avoiding: C arbitrary: B rule: semantics.strong_induct)
case(cInput Ψ M K xvec N Tvec P C)
thus ?case by(simp add: residualInject)
next
case(Output Ψ M K N P C)
thus ?case by(force simp add: residualInject intro: rOutput)
next
case(Case Ψ P Rs φ Cs C)
thus ?case by(force intro: rCase)
next
case(cPar1 Ψ ΨQ P α P' Q AQ C)
thus ?case by(force intro: rPar1 simp add: residualInject)
next
case(cPar2 Ψ ΨP Q α Q' P AP C)
thus ?case by(force intro: rPar2 simp add: residualInject)
next
case cComm1
thus ?case by(simp add: residualInject)
next
case cComm2
thus ?case by(simp add: residualInject)
next
case(cOpen Ψ P M xvec yvec N P' x C B)
thus ?case by(force intro: rOpen simp add: residualInject)
next
case(cScope Ψ P M α P' x C)
thus ?case by(force intro: rScope simp add: residualInject)
next
case(Bang Ψ P Rs C)
thus ?case by(force intro: rBang)
qed
lemma boundOutputBindObject:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and M :: 'a
and yvec :: " name list"
and N :: 'a
and P' :: " ('a, 'b, 'c) psi"
and y :: name
assumes " Ψ ⊳ P ⟼ α ≺ P'"
and " bn α ♯ * subject α"
and " distinct(bn α)"
and " y ∈ set(bn α)"
shows " y ∈ supp(object α)"
using assms
proof(nominal_induct avoiding: P' arbitrary: y rule: semanticsInduct)
case(cAlpha Ψ P α P' p P'' y)
from ‹ y ∈ set(bn(p ∙ α))› have " (p ∙ y) ∈ (p ∙ set(bn(p ∙ α)))"
by(rule pt_set_bij2[OF pt_name_inst, OF at_name_inst])
hence " (p ∙ y) ∈ set(bn α)" using ‹ distinctPerm p›
by(simp add: eqvts)
hence " (p ∙ y) ∈ supp(object α)" by(rule cAlpha)
hence " (p ∙ p ∙ y) ∈ (p ∙ supp(object α))"
by(rule pt_set_bij2[OF pt_name_inst, OF at_name_inst])
thus ?case using ‹ distinctPerm p›
by(simp add: eqvts)
next
case cInput
thus ?case by(simp add: supp_list_nil)
next
case cOutput
thus ?case by(simp add: supp_list_nil)
next
case cCase
thus ?case by simp
next
case cPar1
thus ?case by simp
next
case cPar2
thus ?case by simp
next
case cComm1
thus ?case by(simp add: supp_list_nil)
next
case cComm2
thus ?case by(simp add: supp_list_nil)
next
case cOpen
thus ?case by(auto simp add: supp_list_cons supp_list_append supp_atm supp_some)
next
case cScope
thus ?case by simp
next
case cBang
thus ?case by simp
qed
lemma alphaBoundOutputChain':
fixes yvec :: " name list"
and xvec :: " name list"
and B :: " ('a, 'b, 'c) boundOutput"
assumes " length xvec = length yvec"
and " yvec ♯ * B"
and " yvec ♯ * xvec"
and " distinct yvec"
shows " ( ν*xvec) B = ( ν*yvec) ([xvec yvec] ∙ v B)"
using assms
proof(induct rule: composePermInduct)
case cBase
show ?case by simp
next
case(cStep x xvec y yvec)
thus ?case
apply auto
by(subst alphaBoundOutput[of y]) (auto simp add: eqvts)
qed
lemma alphaBoundOutputChain'':
fixes yvec :: " name list"
and xvec :: " name list"
and N :: 'a
and P :: " ('a, 'b, 'c) psi"
assumes " length xvec = length yvec"
and " yvec ♯ * N"
and " yvec ♯ * P"
and " yvec ♯ * xvec"
and " distinct yvec"
shows " ( ν*xvec) (N ≺ ' P) = ( ν*yvec) (([xvec yvec] ∙ v N) ≺ ' ([xvec yvec] ∙ v P))"
proof -
from assms have " ( ν*xvec) (N ≺ ' P) = ( ν*yvec) ([xvec yvec] ∙ v (N ≺ ' P))"
by(simp add: alphaBoundOutputChain')
thus ?thesis by simp
qed
lemma alphaDistinct:
fixes xvec :: " name list"
and N :: 'a
and P :: " ('a, 'b, 'c) psi"
and yvec :: " name list"
and M :: 'a
and Q :: " ('a, 'b, 'c) psi"
assumes " α ≺ P = β ≺ Q"
and " distinct(bn α)"
and " ∧ x. x ∈ set(bn α) ==> x ∈ supp(object α)"
and " bn α ♯ * bn β"
and " bn α ♯ * (object β)"
and " bn α ♯ * Q"
shows " distinct(bn β)"
using assms
proof(rule_tac actionCases[where α=α], auto simp add: residualInject supp_some)
fix xvec M yvec N
assume Eq: " ( ν*xvec) N ≺ ' P = ( ν*yvec) M ≺ ' Q"
assume " distinct xvec" and " xvec ♯ * M" and " xvec ♯ * yvec" and " xvec ♯ * Q"
assume Mem: " ∧ x. x ∈ set xvec ==> x ∈ (supp N)"
show " distinct yvec"
proof -
from Eq have " length xvec = length yvec"
by(rule boundOutputChainEqLength)
with Eq ‹ distinct xvec› ‹ xvec ♯ * yvec› ‹ xvec ♯ * M› ‹ xvec ♯ * Q› Mem show ?thesis
proof(induct n==" length xvec" arbitrary: xvec yvec M Q rule: nat.induct)
case(zero xvec yvec M Q)
thus ?case by simp
next
case(Suc n xvec yvec M Q)
have L: " length xvec = length yvec" and " Suc n = length xvec" by fact+
then obtain x xvec' y yvec' where xEq: " xvec = x#xvec'" and yEq: " yvec = y#yvec'"
and L': " length xvec' = length yvec'"
by(cases xvec, auto, cases yvec, auto)
have xvecFreshyvec: " xvec ♯ * yvec" and xvecDist: " distinct xvec" by fact+
with xEq yEq have xineqy: " x ≠ y" and xvec'Freshyvec': " xvec' ♯ * yvec'"
and xvec'Dist: " distinct xvec'" and xFreshxvec': " x ♯ xvec'"
and xFreshyvec': " x ♯ yvec'" and yFreshxvec': " y ♯ xvec'"
by auto
have Eq: " ( ν*xvec) N ≺ ' P = ( ν*yvec) M ≺ ' Q" by fact
with xEq yEq xineqy have Eq': " ( ν*xvec') N ≺ ' P = ( ν*([(x, y)] ∙ yvec')) ([(x, y)] ∙ M) ≺ ' ([(x, y)] ∙ Q)"
by(simp add: boundOutput.inject alpha eqvts)
moreover have Mem:" ∧ x. x ∈ set xvec ==> x ∈ supp N" by fact
with xEq have " ∧ x. x ∈ set xvec' ==> x ∈ supp N" by simp
moreover have " xvec ♯ * M" by fact
with xEq xFreshxvec' yFreshxvec' have " xvec' ♯ * ([(x, y)] ∙ M)" by simp
moreover have xvecFreshQ: " xvec ♯ * Q" by fact
with xEq xFreshxvec' yFreshxvec' have " xvec' ♯ * ([(x, y)] ∙ Q)" by simp
moreover have " Suc n = length xvec" by fact
with xEq have " n = length xvec'" by simp
moreover from xvec'Freshyvec' xFreshxvec' yFreshxvec' have " xvec' ♯ * ([(x, y)] ∙ yvec')"
by simp
moreover from L' have " length xvec' = length([(x, y)] ∙ yvec')" by simp
ultimately have " distinct([(x, y)] ∙ yvec')" using xvec'Dist
by(rule_tac Suc) (assumption | simp)+
hence " distinct yvec'" by simp
from Mem xEq have xSuppN: " x ∈ supp N" by simp
from L ‹ distinct xvec› ‹ xvec ♯ * yvec› ‹ xvec ♯ * M› ‹ xvec ♯ * Q›
have " ( ν*yvec) M ≺ ' Q = ( ν*xvec) ([yvec xvec] ∙ v M) ≺ ' ([yvec xvec] ∙ v Q)"
by(simp add: alphaBoundOutputChain'')
with Eq have " N = [yvec xvec] ∙ v M" by simp
with xEq yEq have " N = [(y, x)] ∙ [yvec' xvec'] ∙ v M"
by simp
with xSuppN have ySuppM: " y ∈ supp([yvec' xvec'] ∙ v M)"
by(drule_tac pi=" [(x, y)]" in pt_set_bij2[OF pt_name_inst, OF at_name_inst])
(simp add: calc_atm eqvts name_swap)
have " y ♯ yvec'"
proof(simp add: fresh_def, rule notI)
assume " y ∈ supp yvec'"
hence " y mem yvec'"
by(induct yvec') (auto simp add: supp_list_nil supp_list_cons supp_atm)
moreover from ‹ xvec ♯ * M› xEq xFreshxvec' have " xvec' ♯ * M" by simp
ultimately have " y ♯ [yvec' xvec'] ∙ v M" using L' xvec'Freshyvec' xvec'Dist
by(force intro: freshChainPerm)
with ySuppM show " False" by(simp add: fresh_def)
qed
with ‹ distinct yvec'› yEq show ?case by simp
qed
qed
qed
lemma boundOutputDistinct:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and α :: " 'a action"
and P' :: " ('a, 'b, 'c) psi"
assumes " Ψ ⊳ P ⟼ α ≺ P'"
shows " distinct(bn α)"
using assms
proof(nominal_induct Ψ P x3==" α ≺ P'" avoiding: α P' rule: semantics.strong_induct)
case cInput
thus ?case by(simp add: residualInject)
next
case Output
thus ?case by(simp add: residualInject)
next
case Case
thus ?case by(simp add: residualInject)
next
case cPar1
thus ?case by(force intro: alphaDistinct boundOutputBindObject)
next
case cPar2
thus ?case by(force intro: alphaDistinct boundOutputBindObject)
next
case cComm1
thus ?case by(simp add: residualInject)
next
case cComm2
thus ?case by(simp add: residualInject)
next
case(cOpen Ψ P M xvec yvec N P' x α P'')
note ‹ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P' = α ≺ P''›
moreover from ‹ xvec ♯ * yvec› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ distinct xvec› ‹ distinct yvec ›
have " distinct(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by auto (simp add: fresh_star_def fresh_def name_list_supp)
moreover {
fix y
from ‹ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'› ‹ x ∈ supp N› ‹ x ♯ xvec› ‹ x ♯ yvec› ‹ x ♯ M› ‹ x ♯ Ψ › ‹ distinct xvec› ‹ distinct yvec› ‹ xvec ♯ * Ψ› ‹ xvec ♯ * P› ‹ xvec ♯ * M› ‹ xvec ♯ * yvec › ‹ yvec ♯ * Ψ› ‹ yvec ♯ * P› ‹ yvec ♯ * M›
have " Ψ ⊳ ( νx) P ⟼ M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P'" by(rule semantics.cOpen)
moreover moreover from ‹ xvec ♯ * M› ‹ x ♯ M› ‹ yvec ♯ * M›
have " bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * (subject(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by simp
moreover note ‹ distinct(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))›
moreover assume " y ∈ set(bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
ultimately have " y ∈ supp(object(M( ν*(xvec@x#yvec)) ⟨ N⟩ ))"
by(rule_tac boundOutputBindObject)
}
moreover from ‹ xvec ♯ * α› ‹ x ♯ α› ‹ yvec ♯ * α›
have " bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * bn α" and " bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * object α" by simp+
moreover from ‹ xvec ♯ * P''› ‹ x ♯ P''› ‹ yvec ♯ * P''›
have " bn(M( ν*(xvec@x#yvec)) ⟨ N⟩ ) ♯ * P''" by simp
ultimately show ?case by(rule alphaDistinct)
next
case cScope
thus ?case
by(rule_tac alphaDistinct, auto) (rule_tac boundOutputBindObject, auto)
next
case Bang
thus ?case by simp
qed
lemma inputDistinct:
fixes Ψ :: 'b
and M :: 'a
and xvec :: " name list"
and N :: 'a
and P :: " ('a, 'b, 'c) psi"
and Rs :: " ('a, 'b, 'c) residual"
assumes " Ψ ⊳ M( λ*xvec N) .P ⟼ Rs"
shows " distinct xvec"
using assms
by(nominal_induct Ψ P==" M( λ*xvec N) .P" Rs avoiding: xvec N P rule: semantics.strong_induct)
(auto simp add: psi.inject intro: alphaInputDistinct)
lemma outputInduct'[consumes 2, case_names cAlpha cOutput cCase cPar1 cPar2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and M :: 'a
and yvec :: " name list"
and N :: 'a
and P' :: " ('a, 'b, 'c) psi"
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
'a ==> name list ==> 'a ==> ('a, 'b, 'c) psi ==> bool"
and C :: " 'd::fs_name"
assumes " Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'"
and " xvec ♯ * M"
and rAlpha: " ∧ Ψ P M xvec N P' p C. [ xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C; xvec ♯ * (p ∙ xvec);
set p ⊆ set xvec × set(p ∙ xvec); distinctPerm p;
(p ∙ xvec) ♯ * N; (p ∙ xvec) ♯ * P'; Prop C Ψ P M xvec N P'] ==>
Prop C Ψ P M (p ∙ xvec) (p ∙ N) (p ∙ P')"
and rOutput: " ∧ Ψ M K N P C. [ Ψ ⊨ M ↔ K] ==> Prop C Ψ (M⟨ N⟩ .P) K ([]) N P"
and rCase: " ∧ Ψ P M xvec N P' φ Cs C. [ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M xvec N P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M xvec N P'"
and rPar1: " ∧ Ψ ΨQ P M xvec N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M xvec N P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M;
AQ ♯ * xvec; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M xvec N (P' ∥ Q)"
and rPar2: " ∧ Ψ ΨP Q M xvec N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M xvec N Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M;
AP ♯ * xvec; AP ♯ * N; AP ♯ * Q'; AP ♯ * C; xvec ♯ * Q;
xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) M xvec N (P ∥ Q')"
and rOpen: " ∧ Ψ P M xvec yvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; x ∈ supp N; ∧ C. Prop C Ψ P M (xvec@yvec) N P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ yvec; xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; yvec ♯ * C; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M (xvec@x#yvec) N P'"
and rScope: " ∧ Ψ P M xvec N P' x C.
[ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; ∧ C. Prop C Ψ P M xvec N P';
x ♯ Ψ; x ♯ M; x ♯ xvec; x ♯ N; xvec ♯ * Ψ;
xvec ♯ * P; xvec ♯ * M; x ♯ C; xvec ♯ * C] ==>
Prop C Ψ (( νx) P) M xvec N (( νx) P')"
and rBang: " ∧ Ψ P M xvec N P' C.
[ Ψ ⊳ P ∥ !P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) M xvec N P'] ==>
Prop C Ψ (!P) M xvec N P'"
shows " Prop C Ψ P M xvec N P'"
proof -
note ‹ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'›
moreover from ‹ xvec ♯ * M› have " bn(M( ν*xvec) ⟨ N⟩ ) ♯ * subject(M( ν*xvec) ⟨ N⟩ )" by simp
moreover from ‹ Ψ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'› have " distinct(bn(M( ν*xvec) ⟨ N⟩ ))"
by(rule boundOutputDistinct)
ultimately show ?thesis
proof(nominal_induct Ψ P α==" M( ν*xvec) ⟨ N⟩ " P' avoiding: C arbitrary: M xvec N rule: semanticsInduct)
case(cAlpha Ψ P α P' p C M xvec N)
from ‹ (p ∙ α) = M( ν*xvec) ⟨ N⟩ › have " (p ∙ p ∙ α) = p ∙ (M( ν*xvec) ⟨ N⟩ )"
by(simp add: fresh_bij)
with ‹ distinctPerm p› have A: " α = (p ∙ M)( ν*(p ∙ xvec)) ⟨ (p ∙ N)⟩ "
by(simp add: eqvts)
with ‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * subject α › ‹ bn α ♯ * C› ‹ bn α ♯ * bn(p ∙ α)› ‹ distinctPerm p ›
have " (p ∙ xvec) ♯ * Ψ" and " (p ∙ xvec) ♯ * P" and " (p ∙ xvec) ♯ * (p ∙ M)" and " (p ∙ xvec) ♯ * C" and " (p ∙ xvec) ♯ * (p ∙ p ∙ xvec)"
by auto
moreover from A ‹ set p ⊆ set(bn α) × set(bn(p ∙ α))› ‹ distinctPerm p›
have S: " set p ⊆ set(p ∙ xvec) × set(p ∙ p ∙ xvec)" by simp
moreover note ‹ distinctPerm p›
moreover from A ‹ bn(p ∙ α) ♯ * α› ‹ bn(p ∙ α) ♯ * P'›
have " (p ∙ p ∙ xvec) ♯ * (p ∙ N)" and " (p ∙ p ∙ xvec) ♯ * P'" by simp+
moreover from A have " Prop C Ψ P (p ∙ M) (p ∙ xvec) (p ∙ N) P'"
by(rule cAlpha)
ultimately have " Prop C Ψ P (p ∙ M) (p ∙ p ∙ xvec) (p ∙ p ∙ N) (p ∙ P')"
by(rule rAlpha)
moreover from A ‹ bn α ♯ * subject α› have " (p ∙ xvec) ♯ * (p ∙ M)" by simp
hence " xvec ♯ * M" by(simp add: fresh_star_bij)
from A ‹ bn(p ∙ α) ♯ * α› ‹ distinctPerm p› have " xvec ♯ * (p ∙ M)" by simp
hence " (p ∙ xvec) ♯ * (p ∙ p ∙ M)" by(simp add: fresh_star_bij)
with ‹ distinctPerm p› have " (p ∙ xvec) ♯ * M" by simp
with ‹ xvec ♯ * M› S ‹ distinctPerm p› have " (p ∙ M) = M" by simp
ultimately show ?case using S ‹ distinctPerm p› by simp
next
case cInput
thus ?case by(simp add: residualInject)
next
case cOutput
thus ?case by(force dest: rOutput simp add: action.inject)
next
case cCase
thus ?case by(force intro: rCase)
next
case cPar1
thus ?case by(force intro: rPar1)
next
case cPar2
thus ?case by(force intro: rPar2)
next
case cComm1
thus ?case by(simp add: action.inject)
next
case cComm2
thus ?case by(simp add: action.inject)
next
case cOpen
thus ?case by(fastforce intro: rOpen simp add: action.inject)
next
case cScope
thus ?case by(fastforce intro: rScope)
next
case cBang
thus ?case by(fastforce intro: rBang)
qed
qed
lemma inputInduct[consumes 1, case_names cInput cCase cPar1 cPar2 cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
and P' :: " ('a, 'b, 'c) psi"
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
'a ==> 'a ==> ('a, 'b, 'c) psi ==> bool"
and C :: " 'd::fs_name"
assumes Trans: " Ψ ⊳ P ⟼ M( N) ≺ P'"
and rInput: " ∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
K (N[xvec::=Tvec]) (P[xvec::=Tvec])"
and rCase: " ∧ Ψ P M N P' φ Cs C. [ Ψ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C Ψ P M N P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) M N P'"
and rPar1: " ∧ Ψ ΨQ P M N P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P M N P'; distinct AQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * M; AQ ♯ * N;
AQ ♯ * P'; AQ ♯ * C] ==>
Prop C Ψ (P ∥ Q) M N (P' ∥ Q)"
and rPar2: " ∧ Ψ ΨP Q M N Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ M( N) ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q M N Q'; distinct AP ;
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * M; AP ♯ * N;
AP ♯ * Q'; AP ♯ * C] ==>
Prop C Ψ (P ∥ Q) M N (P ∥ Q')"
and rScope: " ∧ Ψ P M N P' x C.
[ Ψ ⊳ P ⟼ M( N) ≺ P'; ∧ C. Prop C Ψ P M N P'; x ♯ Ψ; x ♯ M; x ♯ N; x ♯ C] ==>
Prop C Ψ (( νx) P) M N (( νx) P')"
and rBang: " ∧ Ψ P M N P' C.
[ Ψ ⊳ P ∥ !P ⟼ M( N) ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) M N P'] ==> Prop C Ψ (!P) M N P'"
shows " Prop C Ψ P M N P'"
using Trans
proof(nominal_induct Ψ P Rs==" M( N) ≺ P'" avoiding: C arbitrary: P' rule: semantics.strong_induct)
case(cInput Ψ M K xvec N Tvec P C)
thus ?case
by(force intro: rInput simp add: residualInject action.inject)
next
case(Output Ψ M K N P C)
thus ?case by(simp add: residualInject)
next
case(Case Ψ P Rs φ CS C)
thus ?case by(force intro: rCase)
next
case(cPar1 Ψ ΨQ P α P' Q AQ C P'')
thus ?case by(force intro: rPar1 simp add: residualInject)
next
case(cPar2 Ψ ΨP Q α Q' xvec P C Q'')
thus ?case by(force intro: rPar2 simp add: residualInject)
next
case(cComm1 Ψ ΨQ P M N P' xvec ΨP Q K zvec Q' yvec C PQ)
thus ?case by(simp add: residualInject)
next
case(cComm2 Ψ ΨQ P M zvec N P' xvec ΨP Q K yvec Q' C PQ)
thus ?case by(simp add: residualInject)
next
case(cOpen Ψ P M xvec N P' x yvec C P'')
thus ?case by(simp add: residualInject)
next
case(cScope Ψ P α P' x C P'')
thus ?case by(force intro: rScope simp add: residualInject)
next
case(Bang Ψ P Rs C)
thus ?case by(force intro: rBang)
qed
lemma tauInduct[consumes 1, case_names cCase cPar1 cPar2 cComm1 cComm2 cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and Rs :: " ('a, 'b, 'c) residual"
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
('a, 'b, 'c) psi ==> bool"
and C :: " 'd::fs_name"
assumes Trans: " Ψ ⊳ P ⟼ τ ≺ P'"
and rCase: " ∧ Ψ P P' φ Cs C. [ Ψ ⊳ P ⟼ τ ≺ P'; ∧ C. Prop C Ψ P P'; (φ, P) mem Cs; Ψ ⊨ φ; guarded P] ==>
Prop C Ψ (Cases Cs) P'"
and rPar1: " ∧ Ψ ΨQ P P' AQ Q C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ τ ≺ P'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P P';
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ;
AQ ♯ * P'; AQ ♯ * C] ==>
Prop C Ψ (P ∥ Q) (P' ∥ Q)"
and rPar2: " ∧ Ψ ΨP Q Q' AP P C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ τ ≺ Q'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q Q';
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ;
AP ♯ * Q'; AP ♯ * C] ==>
Prop C Ψ (P ∥ Q) (P ∥ Q')"
and rComm1: " ∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (( ν*xvec) (P' ∥ Q'))"
and rComm2: " ∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (( ν*xvec) (P' ∥ Q'))"
and rScope: " ∧ Ψ P P' x C.
[ Ψ ⊳ P ⟼ τ ≺ P'; ∧ C. Prop C Ψ P P'; x ♯ Ψ; x ♯ C] ==>
Prop C Ψ (( νx) P) (( νx) P')"
and rBang: " ∧ Ψ P P' C.
[ Ψ ⊳ P ∥ !P ⟼ τ ≺ P'; guarded P; ∧ C. Prop C Ψ (P ∥ !P) P'] ==> Prop C Ψ (!P) P'"
shows " Prop C Ψ P P'"
using Trans
proof(nominal_induct Ψ P Rs==" τ ≺ P'" avoiding: C arbitrary: P' rule: semantics.strong_induct)
case(cInput M K xvec N Tvec P C)
thus ?case by(simp add: residualInject)
next
case(Output Ψ M K N P C)
thus ?case by(simp add: residualInject)
next
case(Case Ψ P Rs φ Cs C)
thus ?case by(force intro: rCase simp add: residualInject)
next
case(cPar1 Ψ ΨQ P α P' AQ Q C P'')
thus ?case by(force intro: rPar1 simp add: residualInject)
next
case(cPar2 Ψ ΨP Q α Q' AP P C Q'')
thus ?case by(force intro: rPar2 simp add: residualInject)
next
case(cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C PQ)
thus ?case by(force intro: rComm1 simp add: residualInject)
next
case(cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q' AQ C PQ)
thus ?case by(force intro: rComm2 simp add: residualInject)
next
case(cOpen Ψ P M xvec N P' x yvec C P'')
thus ?case by(simp add: residualInject)
next
case(cScope Ψ P α P' x C P'')
thus ?case by(force intro: rScope simp add: residualInject)
next
case(Bang Ψ P Rs C )
thus ?case by(force intro: rBang simp add: residualInject)
qed
lemma semanticsFrameInduct[consumes 3, case_names cAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang]:
fixes Ψ :: 'b
and P :: " ('a, 'b, 'c) psi"
and Rs :: " ('a, 'b, 'c) residual"
and AP :: " name list"
and ΨP :: 'b
and Prop :: " 'd::fs_name ==> 'b ==> ('a, 'b, 'c) psi ==>
('a, 'b, 'c) residual ==> name list ==> 'b ==> bool"
and C :: " 'd::fs_name"
assumes Trans: " Ψ ⊳ P ⟼ Rs"
and FrP: " extractFrame P = ⟨ AP , ΨP ⟩ "
and " distinct AP "
and rAlpha: " ∧ Ψ P AP ΨP p Rs C. [ AP ♯ * Ψ; AP ♯ * P; AP ♯ * (p ∙ AP ); AP ♯ * Rs; AP ♯ * C;
set p ⊆ set AP × set(p ∙ AP ); distinctPerm p;
Prop C Ψ P Rs AP ΨP ] ==> Prop C Ψ P Rs (p ∙ AP ) (p ∙ ΨP )"
and rInput: " ∧ Ψ M K xvec N Tvec P C.
[ Ψ ⊨ M ↔ K; distinct xvec; set xvec ⊆ supp N;
length xvec = length Tvec; xvec ♯ * Ψ;
xvec ♯ * M; xvec ♯ * K; xvec ♯ * C] ==>
Prop C Ψ (M( λ*xvec N) .P)
(K( (N[xvec::=Tvec])) ≺ (P[xvec::=Tvec])) ([]) (1 )"
and rOutput: " ∧ Ψ M K N P C. Ψ ⊨ M ↔ K ==> Prop C Ψ (M⟨ N⟩ .P) (K⟨ N⟩ ≺ P) ([]) (1 )"
and rCase: " ∧ Ψ P Rs φ Cs AP ΨP C. [ Ψ ⊳ P ⟼ Rs; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ; ∧ C. Prop C Ψ P Rs AP ΨP ;
(φ, P) mem Cs; Ψ ⊨ φ; guarded P; ΨP ≃ 1 ; (supp ΨP ) = ({}::name set);
AP ♯ * Ψ; AP ♯ * P; AP ♯ * Rs; AP ♯ * C] ==> Prop C Ψ (Cases Cs) Rs ([]) (1 )"
and rPar1: " ∧ Ψ ΨQ P α P' AQ Q AP ΨP C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP ; distinct(bn α);
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * P'; AP ♯ * AQ ; AP ♯ * ΨQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * P'; AQ ♯ * ΨP ;
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * subject α; bn α ♯ * ΨP ; bn α ♯ * ΨQ ;
AP ♯ * C; AQ ♯ * C; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rPar2: " ∧ Ψ ΨP Q α Q' AP P AQ ΨQ C.
[ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q';
extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ ; distinct(bn α);
AP ♯ * P; AP ♯ * Q; AP ♯ * Ψ; AP ♯ * α; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * ΨQ ;
AQ ♯ * P; AQ ♯ * Q; AQ ♯ * Ψ; AQ ♯ * α; AQ ♯ * Q'; AQ ♯ * ΨP ;
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * Q; bn α ♯ * subject α; bn α ♯ * ΨP ; bn α ♯ * ΨQ ;
AP ♯ * C; AQ ♯ * C; bn α ♯ * C] ==>
Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rComm1: " ∧ Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( N) ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P ((M( N) ) ≺ P') AP ΨP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( ν*xvec) ⟨ N⟩ ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( ν*xvec) ⟨ N⟩ ≺ Q') AQ ΨQ ; distinct xvec;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rComm2: " ∧ Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ C.
[ Ψ ⊗ ΨQ ⊳ P ⟼ M( ν*xvec) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C (Ψ ⊗ ΨQ ) P (M( ν*xvec) ⟨ N⟩ ≺ P') AP ΨP ;
Ψ ⊗ ΨP ⊳ Q ⟼ K( N) ≺ Q'; extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ;
∧ C. Prop C (Ψ ⊗ ΨP ) Q (K( N) ≺ Q') AQ ΨQ ;
Ψ ⊗ ΨP ⊗ ΨQ ⊨ M ↔ K; distinct xvec;
AP ♯ * Ψ; AP ♯ * ΨQ ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * Q; AP ♯ * Q'; AP ♯ * AQ ; AP ♯ * xvec; AQ ♯ * Ψ; AQ ♯ * ΨP ;
AQ ♯ * P; AQ ♯ * N; AQ ♯ * P'; AQ ♯ * Q; AQ ♯ * K; AQ ♯ * Q';
AQ ♯ * xvec; xvec ♯ * Ψ; xvec ♯ * ΨP ; xvec ♯ * ΨQ ; xvec ♯ * P; xvec ♯ * M;
xvec ♯ * Q; xvec ♯ * K; AP ♯ * C; AQ ♯ * C; xvec ♯ * C] ==>
Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
and rOpen: " ∧ Ψ P M xvec yvec N P' x AP ΨP C.
[ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P') AP ΨP ; x ∈ supp N; x ♯ Ψ; x ♯ M;
x ♯ AP ; x ♯ xvec; x ♯ yvec; AP ♯ * Ψ; AP ♯ * P; AP ♯ * M; AP ♯ * N; AP ♯ * P';
AP ♯ * xvec; AP ♯ * yvec; xvec ♯ * yvec; distinct xvec; distinct yvec;
xvec ♯ * Ψ; xvec ♯ * P; xvec ♯ * M; xvec ♯ * ΨP ; yvec ♯ * ΨP ;
yvec ♯ * Ψ; yvec ♯ * P; yvec ♯ * M; AP ♯ * C; x ♯ C; xvec ♯ * C; yvec ♯ * C] ==>
Prop C Ψ (( νx) P) (M( ν*(xvec@x#yvec)) ⟨ N⟩ ≺ P') (x#AP ) ΨP "
and rScope: " ∧ Ψ P α P' x AP ΨP C.
[ Ψ ⊳ P ⟼ α ≺ P'; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ P (α ≺ P') AP ΨP ;
x ♯ Ψ; x ♯ α; x ♯ AP ; AP ♯ * Ψ; AP ♯ * P;
AP ♯ * α; AP ♯ * P'; distinct(bn α);
bn α ♯ * Ψ; bn α ♯ * P; bn α ♯ * subject α; bn α ♯ * ΨP ;
AP ♯ * C; x ♯ C; bn α ♯ * C] ==>
Prop C Ψ (( νx) P) (α ≺ (( νx) P')) (x#AP ) ΨP "
and rBang: " ∧ Ψ P Rs AP ΨP C.
[ Ψ ⊳ P ∥ !P ⟼ Rs; guarded P; extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ;
∧ C. Prop C Ψ (P ∥ !P) Rs AP (ΨP ⊗ 1 ); ΨP ≃ 1 ; supp ΨP = ({}::name set);
AP ♯ * Ψ; AP ♯ * P; AP ♯ * Rs; AP ♯ * C] ==> Prop C Ψ (!P) Rs ([]) (1 )"
shows " Prop C Ψ P Rs AP ΨP "
using Trans FrP ‹ distinct AP ›
proof(nominal_induct avoiding: AP ΨP C rule: semantics.strong_induct)
case(cInput Ψ M K xvec N Tvec P AP ΨP C)
from ‹ extractFrame (M( λ*xvec N) .P) = ⟨ AP , ΨP ⟩ ›
have " AP = []" and " ΨP = 1 "
by auto
with ‹ Ψ ⊨ M ↔ K› ‹ distinct xvec› ‹ set xvec ⊆ supp N› ‹ length xvec = length Tvec›
‹ xvec ♯ * Ψ› ‹ xvec ♯ * M› ‹ xvec ♯ * K› ‹ xvec ♯ * C›
show ?case by(blast intro: rInput)
next
case(Output Ψ M K N P AP ΨP )
from ‹ extractFrame (M⟨ N⟩ .P) = ⟨ AP , ΨP ⟩ ›
have " AP = []" and " ΨP = 1 "
by auto
with ‹ Ψ ⊨ M ↔ K› show ?case
by(blast intro: rOutput)
next
case(Case Ψ P Rs φ Cs Ac P Ψc P C)
obtain AP ΨP where FrP: " extractFrame P = ⟨ AP , ΨP ⟩ " and " distinct AP "
and " AP ♯ * (Ψ, P, Rs, C)"
by(rule freshFrame)
hence " AP ♯ * Ψ" and " AP ♯ * P" and " AP ♯ * Rs" and " AP ♯ * C"
by simp+
note ‹ Ψ ⊳ P ⟼ Rs› FrP ‹ distinct AP ›
moreover from FrP ‹ distinct AP › ‹ ∧ AP ΨP C. [ extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ] ==> Prop C Ψ P Rs AP ΨP ›
have " ∧ C. Prop C Ψ P Rs AP ΨP " by simp
moreover note ‹ (φ, P) mem Cs› ‹ Ψ ⊨ φ› ‹ guarded P›
moreover from ‹ guarded P› FrP have " ΨP ≃ 1 " and " supp ΨP = ({}::name set)" by(metis guardedStatEq)+
moreover note ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Rs› ‹ AP ♯ * C›
ultimately have " Prop C Ψ (Cases Cs) Rs ([]) (1 )"
by(rule rCase)
thus ?case using ‹ extractFrame(Cases Cs) = ⟨ Ac P , Ψc P ⟩ › by simp
next
case(cPar1 Ψ ΨQ P α P' Q AQ AP Q ΨP Q C)
obtain AP ΨP where FrP: " extractFrame P = ⟨ AP , ΨP ⟩ " and " distinct AP "
" AP ♯ * (P, Q, Ψ, α, P', AQ , AP Q , C, ΨQ )"
by(rule freshFrame)
hence " AP ♯ * P" and " AP ♯ * Q" and " AP ♯ * Ψ" and " AP ♯ * α" and " AP ♯ * P'"
and " AP ♯ * AQ " and " AP ♯ * AP Q " and " AP ♯ * C" and " AP ♯ * ΨQ "
by simp+
have FrQ: " extractFrame Q = ⟨ AQ , ΨQ ⟩ " by fact
from ‹ AQ ♯ * P› ‹ AP ♯ * AQ › FrP have " AQ ♯ * ΨP "
by(force dest: extractFrameFreshChain)
from ‹ bn α ♯ * P› ‹ AP ♯ * α› FrP have " bn α ♯ * ΨP "
by(force dest: extractFrameFreshChain)
from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › FrP FrQ ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have " ⟨ (AP @AQ ), ΨP ⊗ ΨQ ⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
moreover from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have " distinct(AP @AQ )"
by(auto simp add: fresh_star_def fresh_def name_list_supp)
ultimately obtain p where S: " set p ⊆ set(AP @AQ ) × set((p ∙ AP )@(p ∙ AQ ))" and " distinctPerm p"
and Ψeq: " ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: " AP Q = (p ∙ AP )@(p ∙ AQ )"
using ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct AP Q ›
by(rule_tac frameChainEq') (assumption | simp add: eqvts)+
note ‹ Ψ ⊗ ΨQ ⊳ P ⟼ α ≺ P'› FrP ‹ distinct AP › FrQ ‹ distinct AQ ›
moreover from FrP ‹ distinct AP › ‹ ∧ AP ΨP C. [ extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ] ==> Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP ›
have " ∧ C. Prop C (Ψ ⊗ ΨQ ) P (α ≺ P') AP ΨP " by simp
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * P'› ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ ›
‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * ΨP › ‹ distinct(bn α)›
‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * ΨQ ›
‹ AP ♯ * C› ‹ AQ ♯ * C› ‹ bn α ♯ * C›
ultimately have " Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (AP @AQ ) (ΨP ⊗ ΨQ )"
by(rule_tac rPar1)
with ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * α› ‹ AP ♯ * P'› ‹ AP ♯ * AP Q › ‹ AP ♯ * C›
‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * α› ‹ AQ ♯ * P'› ‹ AQ ♯ * AP Q › ‹ AQ ♯ * C›
S ‹ distinctPerm p› Aeq
have " Prop C Ψ (P ∥ Q) (α ≺ (P' ∥ Q)) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by(rule_tac rAlpha) (assumption | simp add: eqvts)+
with Ψeq Aeq show ?case by(simp add: eqvts)
next
case(cPar2 Ψ ΨP Q α Q' P AP AP Q ΨP Q C)
obtain AQ ΨQ where FrQ: " extractFrame Q = ⟨ AQ , ΨQ ⟩ " and " distinct AQ "
" AQ ♯ * (P, Q, Ψ, α, Q', AP , AP Q , C, ΨP )"
by(rule freshFrame)
hence " AQ ♯ * P" and " AQ ♯ * Q" and " AQ ♯ * Ψ" and " AQ ♯ * α" and " AQ ♯ * Q'"
and " AQ ♯ * AP " and " AQ ♯ * AP Q " and " AQ ♯ * C" and " AQ ♯ * ΨP "
by simp+
from ‹ AQ ♯ * AP › have " AP ♯ * AQ " by simp
have FrP: " extractFrame P = ⟨ AP , ΨP ⟩ " by fact
from ‹ AP ♯ * Q› ‹ AQ ♯ * AP › FrQ have " AP ♯ * ΨQ "
by(force dest: extractFrameFreshChain)
from ‹ bn α ♯ * Q› ‹ AQ ♯ * α› FrQ have " bn α ♯ * ΨQ "
by(force dest: extractFrameFreshChain)
from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › FrP FrQ ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have " ⟨ (AP @AQ ), ΨP ⊗ ΨQ ⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
moreover from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have " distinct(AP @AQ )"
by(auto simp add: fresh_star_def fresh_def name_list_supp)
ultimately obtain p where S: " (set p ⊆ (set(AP @AQ )) × (set AP Q ))" and " distinctPerm p"
and Ψeq: " ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: " AP Q = ((p ∙ AP )@(p ∙ AQ ))"
using ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct AP Q ›
by(rule_tac frameChainEq') (assumption | simp add: eqvts)+
note ‹ Ψ ⊗ ΨP ⊳ Q ⟼ α ≺ Q'› FrP ‹ distinct AP › FrQ ‹ distinct AQ ›
moreover from FrQ ‹ distinct AQ › ‹ ∧ AQ ΨQ C. [ extractFrame Q = ⟨ AQ , ΨQ ⟩ ; distinct AQ ] ==> Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ ›
have " ∧ C. Prop C (Ψ ⊗ ΨP ) Q (α ≺ Q') AQ ΨQ " by simp
moreover note ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * Ψ› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ ›
‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * Ψ› ‹ AQ ♯ * α› ‹ AQ ♯ * Q'› ‹ AQ ♯ * ΨP › ‹ distinct(bn α)›
‹ bn α ♯ * Ψ› ‹ bn α ♯ * P› ‹ bn α ♯ * Q› ‹ bn α ♯ * subject α› ‹ bn α ♯ * ΨP › ‹ bn α ♯ * ΨQ ›
‹ AP ♯ * C› ‹ AQ ♯ * C› ‹ bn α ♯ * C›
ultimately have " Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by(rule_tac rPar2)
with ‹ AP ♯ * Ψ› ‹ AP ♯ * P› ‹ AP ♯ * Q› ‹ AP ♯ * α› ‹ AP ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AP ♯ * C›
‹ AQ ♯ * Ψ› ‹ AQ ♯ * P› ‹ AQ ♯ * Q› ‹ AQ ♯ * α› ‹ AQ ♯ * Q'› ‹ AQ ♯ * AP Q › ‹ AQ ♯ * C›
S ‹ distinctPerm p› Aeq
have " Prop C Ψ (P ∥ Q) (α ≺ (P ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by(rule_tac rAlpha) (assumption | simp add: eqvts)+
with Ψeq Aeq show ?case by(simp add: eqvts)
next
case(cComm1 Ψ ΨQ P M N P' AP ΨP Q K xvec Q' AQ AP Q ΨP Q C)
from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have " distinct(AP @AQ )"
by(auto simp add: fresh_star_def fresh_def name_list_supp)
from cComm1 have " Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by(rule_tac rComm1)
moreover from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ ›
‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have " ⟨ (AP @AQ ), (ΨP ⊗ ΨQ )⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
with ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct(AP @AQ )› ‹ distinct AP Q ›
obtain p where S: " (set p ⊆ (set(AP @AQ )) × (set AP Q ))" and " distinctPerm p"
and Ψeq: " ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: " AP Q = p ∙ (AP @AQ )"
by(rule_tac frameChainEq') (assumption | simp)+
moreover note ‹ AP ♯ * Ψ› ‹ AQ ♯ * Ψ› ‹ AP ♯ * P› ‹ AQ ♯ * P› ‹ AP ♯ * Q› ‹ AQ ♯ * Q› ‹ AP ♯ * xvec ›
‹ AQ ♯ * xvec› ‹ AP ♯ * P'› ‹ AQ ♯ * P'› ‹ AP ♯ * Q'› ‹ AQ ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q ›
‹ AP ♯ * C› ‹ AQ ♯ * C›
ultimately have " Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by(rule_tac rAlpha) auto
with Ψeq Aeq show ?case by simp
next
case(cComm2 Ψ ΨQ P M xvec N P' AP ΨP Q K Q' AQ AP Q ΨP Q C)
from ‹ distinct AP › ‹ distinct AQ › ‹ AP ♯ * AQ › have " distinct(AP @AQ )"
by(auto simp add: fresh_star_def fresh_def name_list_supp)
from cComm2 have " Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (AP @AQ ) (ΨP ⊗ ΨQ )"
by(rule_tac rComm2)
moreover from ‹ extractFrame(P ∥ Q) = ⟨ AP Q , ΨP Q ⟩ › ‹ extractFrame P = ⟨ AP , ΨP ⟩ › ‹ extractFrame Q = ⟨ AQ , ΨQ ⟩ ›
‹ AP ♯ * AQ › ‹ AP ♯ * ΨQ › ‹ AQ ♯ * ΨP ›
have " ⟨ (AP @AQ ), (ΨP ⊗ ΨQ )⟩ = ⟨ AP Q , ΨP Q ⟩ "
by simp
with ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q › ‹ distinct(AP @AQ )› ‹ distinct AP Q ›
obtain p where S: " (set p ⊆ (set(AP @AQ )) × (set AP Q ))" and " distinctPerm p"
and Ψeq: " ΨP Q = p ∙ (ΨP ⊗ ΨQ )" and Aeq: " AP Q = p ∙ (AP @AQ )"
by(rule_tac frameChainEq') (assumption | simp)+
moreover note ‹ AP ♯ * Ψ› ‹ AQ ♯ * Ψ› ‹ AP ♯ * P› ‹ AQ ♯ * P› ‹ AP ♯ * Q› ‹ AQ ♯ * Q› ‹ AP ♯ * xvec ›
‹ AQ ♯ * xvec› ‹ AP ♯ * P'› ‹ AQ ♯ * P'› ‹ AP ♯ * Q'› ‹ AQ ♯ * Q'› ‹ AP ♯ * AP Q › ‹ AQ ♯ * AP Q ›
‹ AP ♯ * C› ‹ AQ ♯ * C›
ultimately have " Prop C Ψ (P ∥ Q) (τ ≺ ( ν*xvec) (P' ∥ Q')) (p ∙ (AP @AQ )) (p ∙ (ΨP ⊗ ΨQ ))"
by(rule_tac rAlpha) auto
with Ψeq Aeq show ?case by simp
next
case(cOpen Ψ P M xvec yvec N P' x Ax P Ψx P C)
obtain AP ΨP where FrP: " extractFrame P = ⟨ AP , ΨP ⟩ " and " distinct AP "
and " AP ♯ * (Ψ, P, M, xvec, yvec, N, P', Ax P , Ψx P , C, x)"
by(rule freshFrame)
hence " AP ♯ * Ψ" and " AP ♯ * P" and " AP ♯ * M" and " AP ♯ * xvec"and " AP ♯ * yvec" and " AP ♯ * N" and " AP ♯ * P'"
and " AP ♯ * Ax P " and " AP ♯ * Ψx P " and " AP ♯ * C" and " x ♯ AP "
by simp+
from ‹ xvec ♯ * P› ‹ AP ♯ * xvec› FrP have " xvec ♯ * ΨP "
by(force dest: extractFrameFreshChain)
from ‹ yvec ♯ * P› ‹ AP ♯ * yvec› FrP have " yvec ♯ * ΨP "
by(force dest: extractFrameFreshChain)
from ‹ extractFrame(( νx) P) = ⟨ Ax P , Ψx P ⟩ › FrP
have " ⟨ (x#AP ), ΨP ⟩ = ⟨ Ax P , Ψx P ⟩ "
by simp
moreover from ‹ x ♯ AP › ‹ distinct AP › have " distinct(x#AP )" by simp
ultimately obtain p where S: " set p ⊆ set (x#AP ) × set (p ∙ (x#AP ))" and " distinctPerm p"
and Ψeq: " Ψx P = p ∙ ΨP " and Aeq: " Ax P = (p ∙ x)#(p ∙ AP )"
using ‹ AP ♯ * Ax P › \<open>x ♯ Ax P › ‹ distinct Ax P ›
by(rule_tac frameChainEq') (assumption | simp add: eqvts)+
note ‹ Ψ ⊳ P ⟼ M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P'› FrP ‹ distinct AP ›
moreover from FrP ‹ distinct AP › ‹ ∧ AP ΨP C. [ extractFrame P = ⟨ AP , ΨP ⟩ ; distinct AP ] ==> Prop C Ψ P (M( ν*(xvec@yvec)) ⟨ N⟩ ≺ P') AP ΨP ›
have " \ < And > C . Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by simp
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < in > supp N \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * C \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rOpen )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close >
\ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > C \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > Aeq
S \ < open > distinctPerm p \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ( p \ < bullet > ( x # A \ < ^ sub > P ) ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( rule_tac A \ < ^ sub > P = " x # A \ < ^ sub > P " in rAlpha ) ( assumption | simp add : abs_fresh fresh_star_def boundOutputFresh ) +
with \ < Psi > eq Aeq show ? case by ( simp add : eqvts )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > x \ < ^ sub > P \ < Psi > \ < ^ sub > x \ < ^ sub > P C )
obtain A \ < ^ sub > P \ < Psi > \ < ^ sub > P where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P "
and " A \ < ^ sub > P \ < sharp > * ( \ < Psi > , P , \ < alpha > , P ' , A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P , C , x ) "
by ( rule freshFrame )
hence " A \ < ^ sub > P \ < sharp > * \ < Psi > " and " A \ < ^ sub > P \ < sharp > * P " and " A \ < ^ sub > P \ < sharp > * \ < alpha > " and " A \ < ^ sub > P \ < sharp > * P ' "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P " and " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > x \ < ^ sub > P " and " A \ < ^ sub > P \ < sharp > * C " and " x \ < sharp > A \ < ^ sub > P "
by simp +
from \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > FrP have " bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( force dest : extractFrameFreshChain )
from \ < open > extractFrame ( \ < lparr > \ < nu > x \ < rparr > P ) = \ < langle > A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P \ < rangle > \ < close > FrP
have " \ < langle > ( x # A \ < ^ sub > P ) , \ < Psi > \ < ^ sub > P \ < rangle > = \ < langle > A \ < ^ sub > x \ < ^ sub > P , \ < Psi > \ < ^ sub > x \ < ^ sub > P \ < rangle > "
by simp
moreover from \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( x # A \ < ^ sub > P ) " by simp
ultimately obtain p where S : " set p \ < subseteq > set ( x # A \ < ^ sub > P ) \ < times > set ( p \ < bullet > ( x # A \ < ^ sub > P ) ) " and " distinctPerm p "
and \ < Psi > eq : " \ < Psi > \ < ^ sub > x \ < ^ sub > P = p \ < bullet > \ < Psi > \ < ^ sub > P " and Aeq : " A \ < ^ sub > x \ < ^ sub > P = ( p \ < bullet > x ) # ( p \ < bullet > A \ < ^ sub > P ) "
using \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > distinct A \ < ^ sub > x \ < ^ sub > P \ < close >
by ( rule_tac frameChainEq ' ) ( assumption | simp add : eqvts ) +
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > \ < And > A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P ( \ < alpha > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < close >
have " \ < And > C . Prop C \ < Psi > P ( \ < alpha > \ < prec > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by simp
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
\ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rScope )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > x \ < sharp > A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > x \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close >
\ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > C \ < close > Aeq
S \ < open > distinctPerm p \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( p \ < bullet > ( x # A \ < ^ sub > P ) ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( rule_tac A \ < ^ sub > P = " x # A \ < ^ sub > P " in rAlpha ) ( assumption | simp add : abs_fresh fresh_star_def ) +
with \ < Psi > eq Aeq show ? case by ( simp add : eqvts )
next
case ( Bang \ < Psi > P Rs A \ < ^ sub > b \ < ^ sub > P \ < Psi > \ < ^ sub > b \ < ^ sub > P C )
obtain A \ < ^ sub > P \ < Psi > \ < ^ sub > P where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P "
and " A \ < ^ sub > P \ < sharp > * ( \ < Psi > , P , Rs , C ) "
by ( rule freshFrame )
hence " A \ < ^ sub > P \ < sharp > * \ < Psi > " and " A \ < ^ sub > P \ < sharp > * P " and " A \ < ^ sub > P \ < sharp > * Rs " and " A \ < ^ sub > P \ < sharp > * C "
by simp +
note \ < open > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > Rs \ < close > \ < open > guarded P \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from FrP have " extractFrame ( P \ < parallel > ! P ) = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < rangle > "
by simp
with \ < open > distinct A \ < ^ sub > P \ < close > \ < open > \ < And > A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > extractFrame ( P \ < parallel > ! P ) = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( P \ < parallel > ! P ) Rs A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < close >
have " \ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) Rs A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) " by simp
moreover from \ < open > guarded P \ < close > FrP have " \ < Psi > \ < ^ sub > P \ < simeq > \ < one > " and " supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) " by ( metis guardedStatEq ) +
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Rs \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( ! P ) Rs ( [ ] ) ( \ < one > ) "
by ( rule rBang )
thus ? case using \ < open > extractFrame ( ! P ) = \ < langle > A \ < ^ sub > b \ < ^ sub > P , \ < Psi > \ < ^ sub > b \ < ^ sub > P \ < rangle > \ < close > by simp
qed
lemma semanticsFrameInduct ' [ consumes 5 , case_names cAlpha cFrameAlpha cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Rs : : " ( ' a , ' b , ' c ) residual "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow > ' a action \ < Rightarrow >
( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and rAlpha : " \ < And > \ < Psi > P \ < alpha > P ' p A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * C ; bn \ < alpha > \ < sharp > * ( p \ < bullet > \ < alpha > ) ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) ; distinctPerm p ;
bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > ; ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' ; Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > P ( p \ < bullet > \ < alpha > ) ( p \ < bullet > P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
and rFrameAlpha : " \ < And > \ < Psi > P A \ < ^ sub > P \ < Psi > \ < ^ sub > P p \ < alpha > P ' C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ; A \ < ^ sub > P \ < sharp > * subject \ < alpha > ;
Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P \ < alpha > P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rInput : " \ < And > \ < Psi > M K xvec N Tvec P C .
\ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ;
length xvec = length Tvec ; xvec \ < sharp > * \ < Psi > ;
xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P )
( K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > ) ( P [ xvec : : = Tvec ] ) ( [ ] ) ( \ < one > ) "
and rOutput : " \ < And > \ < Psi > M K N P C . \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < Longrightarrow > Prop C \ < Psi > ( M \ < langle > N \ < rangle > . P ) ( K \ < langle > N \ < rangle > ) P ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P \ < alpha > P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) \ < alpha > P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q \ < alpha > Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > N \ < rparr > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > N \ < rparr > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rOpen : " \ < And > \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P y C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < in > supp N ; x \ < sharp > \ < Psi > ; x \ < sharp > M ;
x \ < sharp > A \ < ^ sub > P ; x \ < sharp > xvec ; x \ < sharp > yvec ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * yvec ; xvec \ < sharp > * yvec ; distinct xvec ; distinct yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C ; yvec \ < sharp > * C ;
y \ < noteq > x ; y \ < sharp > \ < Psi > ; y \ < sharp > P ; y \ < sharp > M ; y \ < sharp > xvec ; y \ < sharp > yvec ; y \ < sharp > N ; y \ < sharp > P ' ; y \ < sharp > A \ < ^ sub > P ; y \ < sharp > \ < Psi > \ < ^ sub > P ; y \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ( [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rScope : " \ < And > \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
x \ < sharp > \ < Psi > ; x \ < sharp > \ < alpha > ; x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ;
A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ;
bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; bn \ < alpha > \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) \ < alpha > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > \ < alpha > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) \ < alpha > P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) \ < alpha > P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using Trans FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " \ < alpha > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C \ < alpha > P ' rule : semanticsFrameInduct )
case cAlpha
thus ? case using rFrameAlpha
by auto
next
case cInput
thus ? case using rInput
by ( auto simp add : residualInject )
next
case cOutput
thus ? case using rOutput
by ( auto simp add : residualInject )
next
case cCase
thus ? case using rCase
by ( auto simp add : residualInject )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > ' P ' ' )
note \ < open > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) = \ < alpha > ' \ < prec > P ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P ' \ < parallel > Q ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > P ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and P ' eq : " P ' ' = p \ < bullet > ( P ' \ < parallel > Q ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( P ' \ < parallel > Q ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
have " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by ( rule_tac cPar1 ) auto
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
\ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
ultimately have " Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rPar1 )
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( P ' \ < parallel > Q ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( P \ < parallel > Q ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( P ' \ < parallel > Q ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rAlpha ) auto
with \ < alpha > Eq P ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C \ < alpha > ' Q ' ' )
note \ < open > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) = \ < alpha > ' \ < prec > Q ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P \ < parallel > Q ' ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > Q ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and Q ' eq : " Q ' ' = p \ < bullet > ( P \ < parallel > Q ' ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( P \ < parallel > Q ' ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
have " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q \ < alpha > Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " by ( rule_tac cPar2 ) auto
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close >
\ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
ultimately have " Prop C \ < Psi > ( P \ < parallel > Q ) \ < alpha > ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rPar2 ) auto
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( P \ < parallel > Q ' ) \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( P \ < parallel > Q ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( P \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
by ( rule_tac rAlpha ) auto
with \ < alpha > Eq Q ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cComm1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C \ < alpha > P ' ' )
thus ? case using rComm1
apply ( auto )
apply ( drule_tac x = " M \ < lparr > N \ < rparr > " in meta_spec )
apply ( drule_tac x = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply auto
apply ( drule_tac x = \ < Psi > in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > Q in meta_spec )
apply ( drule_tac x = P in meta_spec )
apply ( drule_tac x = M in meta_spec )
apply ( drule_tac x = N in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > P in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > P in meta_spec )
apply ( drule_tac x = Q in meta_spec )
apply ( drule_tac x = K in meta_spec )
apply ( drule_tac x = xvec in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > Q in meta_spec )
apply auto
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " )
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > N \ < rparr > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " )
by ( auto simp add : residualInject )
next
case ( cComm2 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C \ < alpha > Q ' ' )
thus ? case using rComm2
apply ( drule_tac x = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " in meta_spec )
apply ( drule_tac x = " K \ < lparr > N \ < rparr > " in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply auto
apply ( drule_tac x = \ < Psi > in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > Q in meta_spec )
apply ( drule_tac x = P in meta_spec )
apply ( drule_tac x = M in meta_spec )
apply ( drule_tac x = xvec in meta_spec )
apply ( drule_tac x = N in meta_spec )
apply ( drule_tac x = P ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > P in meta_spec )
apply ( drule_tac x = \ < Psi > \ < ^ sub > P in meta_spec )
apply ( drule_tac x = Q in meta_spec )
apply ( drule_tac x = K in meta_spec )
apply ( drule_tac x = Q ' in meta_spec )
apply ( drule_tac x = A \ < ^ sub > Q in meta_spec )
apply auto
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " )
apply ( subgoal_tac " \ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q ( K \ < lparr > N \ < rparr > ) Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q " )
by ( auto simp add : residualInject )
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > P ' ' )
note \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' = \ < alpha > \ < prec > P ' ' \ < close >
moreover from \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > yvec \ < sharp > * \ < alpha > \ < close > have " ( xvec @ x # yvec ) \ < sharp > * ( bn \ < alpha > ) "
by auto
moreover from \ < open > xvec \ < sharp > * yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
have " distinct ( xvec @ x # yvec ) "
by ( auto simp add : fresh_star_def ) ( simp add : fresh_def name_list_supp )
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > M \ < close > \ < open > yvec \ < sharp > * M \ < close > have " ( xvec @ x # yvec ) \ < sharp > * M " by auto
hence " ( xvec @ x # yvec ) \ < sharp > * ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) " by auto
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > P ' ' ) " by simp
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( xvec @ x # yvec ) ) \ < times > ( set ( p \ < bullet > ( xvec @ x # yvec ) ) ) " and " distinctPerm p "
and \ < alpha > eq : " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " and P ' eq : " P ' ' = ( p \ < bullet > P ' ) "
and A : " ( xvec @ x # yvec ) \ < sharp > * ( ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > ) "
and B : " ( p \ < bullet > ( xvec @ x # yvec ) ) \ < sharp > * ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > ) "
and C : " ( p \ < bullet > ( xvec @ x # yvec ) ) \ < sharp > * P ' "
by ( rule_tac residualEq ) ( assumption | simp ) +
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > x \ < in > ( supp N ) \ < close >
moreover {
fix C
from \ < open > xvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * M \ < close > have " ( xvec @ yvec ) \ < sharp > * M " by simp
moreover from \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > xvec \ < sharp > * yvec \ < close > have " distinct ( xvec @ yvec ) "
by auto ( simp add : fresh_star_def name_list_supp fresh_def )
ultimately have " Prop C \ < Psi > P ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > ) P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " using \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac cOpen ) auto
}
moreover obtain y : : name where " y \ < sharp > \ < Psi > " and " y \ < noteq > x " and " y \ < sharp > P " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " y \ < sharp > \ < alpha > " and " y \ < sharp > P ' " and " y \ < sharp > A \ < ^ sub > P " and " y \ < sharp > \ < Psi > \ < ^ sub > P " and " y \ < sharp > M " and " y \ < sharp > N " and " y \ < sharp > C " and " y \ < sharp > p "
by ( generate_fresh " name " ) auto
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close >
\ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * C \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close >
\ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ( [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rOpen )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > M ) = [ ( x , y ) ] \ < bullet > p \ < bullet > M "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > M \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > M \ < close > have D : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > M ) = p \ < bullet > M "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > xvec ) = [ ( x , y ) ] \ < bullet > p \ < bullet > xvec "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > xvec \ < close > have E : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > xvec ) = p \ < bullet > xvec "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > yvec ) = [ ( x , y ) ] \ < bullet > p \ < bullet > yvec "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > yvec \ < close > have F : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > yvec ) = p \ < bullet > yvec "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > x ) = [ ( x , y ) ] \ < bullet > p \ < bullet > x "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < noteq > x \ < close > \ < open > y \ < sharp > p \ < close > have G : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > y ) = p \ < bullet > x "
apply ( simp add : freshChainSimps calc_atm )
apply ( subgoal_tac " y \ < noteq > p \ < bullet > x " )
apply ( clarsimp )
using A \ < alpha > eq
apply ( simp add : eqvts )
apply ( subst fresh_atm [ symmetric ] )
apply ( simp only : freshChainSimps )
by simp
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > N ) = [ ( x , y ) ] \ < bullet > p \ < bullet > N "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > N \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > y \ < sharp > p \ < close > \ < alpha > eq have H : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > N ) = p \ < bullet > N "
by ( auto simp add : eqvts freshChainSimps )
moreover have " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) = [ ( x , y ) ] \ < bullet > p \ < bullet > P ' "
by ( subst perm_compose [ symmetric ] ) simp
with \ < open > y \ < sharp > P ' \ < close > \ < open > x \ < sharp > P ' ' \ < close > \ < open > y \ < sharp > p \ < close > P ' eq have I : " ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) = p \ < bullet > P ' "
by ( auto simp add : eqvts freshChainSimps )
from \ < open > y \ < sharp > p \ < close > \ < open > y \ < noteq > x \ < close > have " y \ < noteq > p \ < bullet > x "
apply ( subst fresh_atm [ symmetric ] )
apply ( simp only : freshChainSimps )
by simp
moreover from S have " ( [ ( x , y ) ] \ < bullet > set p ) \ < subseteq > [ ( x , y ) ] \ < bullet > ( set ( xvec @ x # yvec ) \ < times > set ( p \ < bullet > ( xvec @ x # yvec ) ) ) "
by ( simp )
with \ < open > y \ < noteq > p \ < bullet > x \ < close > \ < open > ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > y ) = p \ < bullet > x \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < alpha > eq have
" set ( [ ( x , y ) ] \ < bullet > p ) \ < subseteq > set ( xvec @ y # yvec ) \ < times > set ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > ( xvec @ y # yvec ) ) "
by ( simp add : eqvts calc_atm perm_compose )
moreover note \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > yvec \ < sharp > * M \ < close >
\ < open > yvec \ < sharp > * C \ < close > S \ < open > distinctPerm p \ < close > \ < open > x \ < sharp > C \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
A B C \ < alpha > eq \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < noteq > x \ < close > \ < open > y \ < sharp > P \ < close > \ < open > y \ < sharp > M \ < close > \ < open > y \ < sharp > \ < Psi > \ < ^ sub > P \ < close > \ < open > y \ < sharp > C \ < close > \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > yvec \ < sharp > * \ < alpha > \ < close > \ < open > y \ < sharp > \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > y \ < sharp > A \ < ^ sub > P \ < close > \ < open > y \ < sharp > N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > y \ < sharp > P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close > P ' eq
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > ) ) ( ( [ ( x , y ) ] \ < bullet > p ) \ < bullet > [ ( x , y ) ] \ < bullet > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
apply ( rule_tac \ < alpha > = " M \ < lparr > \ < nu > * ( xvec @ y # yvec ) \ < rparr > \ < langle > ( [ ( x , y ) ] \ < bullet > N ) \ < rangle > " in rAlpha )
apply ( assumption | simp ) +
apply ( simp add : eqvts )
apply ( assumption | simp add : abs_fresh ) +
apply ( simp add : fresh_left calc_atm )
apply ( assumption | simp ) +
apply ( simp add : fresh_left calc_atm )
apply ( assumption | simp ) +
by ( simp add : eqvts fresh_left ) +
with \ < alpha > eq P ' eq D E F G H I show ? case
by ( simp add : eqvts )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > ' P ' ' )
note \ < open > \ < alpha > \ < prec > ( \ < lparr > \ < nu > x \ < rparr > P ' ) = \ < alpha > ' \ < prec > P ' ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > have " bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) " by auto
moreover note \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct ( bn \ < alpha > ' ) \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > ' \ < sharp > * subject \ < alpha > ' \ < close >
have " bn \ < alpha > \ < sharp > * ( \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' ) " and " bn \ < alpha > ' \ < sharp > * ( \ < alpha > ' \ < prec > P ' ' ) " by simp +
ultimately obtain p where S : " ( set p ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) " and " distinctPerm p "
and \ < alpha > Eq : " \ < alpha > ' = p \ < bullet > \ < alpha > " and P ' eq : " P ' ' = p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * ( \ < lparr > \ < nu > x \ < rparr > P ' ) "
by ( rule residualEq )
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close >
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
have " \ < And > C . Prop C \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P " by ( rule_tac cScope ) auto
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > x \ < sharp > C \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close >
\ < open > distinct A \ < ^ sub > P \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) \ < alpha > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rScope )
with \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * C \ < close > \ < open > bn \ < alpha > \ < sharp > * ( bn \ < alpha > ' ) \ < close > S \ < open > distinctPerm p \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( \ < lparr > \ < nu > x \ < rparr > P ' ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > ' \ < close > \ < alpha > Eq \ < open > x \ < sharp > \ < alpha > ' \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > bn \ < alpha > \ < sharp > * \ < alpha > ' \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > x \ < sharp > A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > x \ < sharp > C \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
have " Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( p \ < bullet > \ < alpha > ) ( p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
by ( rule_tac rAlpha ) ( simp add : abs_fresh ) +
with \ < alpha > Eq P ' eq \ < open > distinctPerm p \ < close > show ? case by simp
next
case ( cBang \ < Psi > P Rs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C \ < alpha > )
thus ? case by ( rule_tac rBang ) auto
qed
lemma inputFrameInduct [ consumes 3 , case_names cAlpha cInput cCase cPar1 cPar2 cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
' a \ < Rightarrow > ' a \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P M N P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rInput : " \ < And > \ < Psi > M K xvec N Tvec P C .
\ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ;
length xvec = length Tvec ; xvec \ < sharp > * \ < Psi > ;
xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P )
K ( N [ xvec : : = Tvec ] ) ( P [ xvec : : = Tvec ] ) ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P M N P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) M N P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M N ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q M N Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M N ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rScope : " \ < And > \ < Psi > P M N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < sharp > \ < Psi > ; x \ < sharp > M ; x \ < sharp > N ;
x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M N ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) M N P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) M N P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using assms
by ( nominal_induct \ < Psi > P Rs = = " M \ < lparr > N \ < rparr > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : P ' rule : semanticsFrameInduct )
( auto simp add : residualInject )
lemma outputFrameInduct [ consumes 3 , case_names cAlpha cOutput cCase cPar1 cPar2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
' a \ < Rightarrow > ( ' a , ' b , ' c ) boundOutput \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > ROut M B "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P M A \ < ^ sub > P \ < Psi > \ < ^ sub > P p B C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * B ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P M B ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rOutput : " \ < And > \ < Psi > M K N P C . \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < Longrightarrow > Prop C \ < Psi > ( M \ < langle > N \ < rangle > . P ) K ( N \ < prec > ' P ) ( [ ] ) ( \ < one > ) "
and rCase : " \ < And > \ < Psi > P M B \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > ( ROut M B ) ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * B ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) M B ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * Q ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( P ' \ < parallel > Q ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * Q ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( P \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rOpen : " \ < And > \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M ( \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < in > supp N ; x \ < sharp > \ < Psi > ; x \ < sharp > M ;
x \ < sharp > A \ < ^ sub > P ; x \ < sharp > xvec ; x \ < sharp > yvec ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C ; yvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M ( \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > N \ < prec > ' P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rScope : " \ < And > \ < Psi > P M xvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
x \ < sharp > \ < Psi > ; x \ < sharp > M ; x \ < sharp > xvec ; x \ < sharp > N ; x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ;
A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) M ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut M B ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) M B A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) M B ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
proof -
{
fix B
assume " \ < Psi > \ < rhd > P \ < longmapsto > ROut M B "
hence " Prop C \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P " using FrP \ < open > distinct A \ < ^ sub > P \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " ROut M B " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : B rule : semanticsFrameInduct )
case cAlpha
thus ? case by ( fastforce intro : rAlpha )
next
case cInput
thus ? case by ( simp add : residualInject )
next
case cOutput
thus ? case by ( force intro : rOutput simp add : residualInject )
next
case cCase
thus ? case by ( force intro : rCase simp add : residualInject )
next
case cPar1
thus ? case
by ( fastforce intro : rPar1 simp add : residualInject )
next
case cPar2
thus ? case
by ( fastforce intro : rPar2 simp add : residualInject )
next
case cComm1
thus ? case by ( simp add : residualInject )
next
case cComm2
thus ? case by ( simp add : residualInject )
next
case cOpen
thus ? case by ( fastforce intro : rOpen simp add : residualInject )
next
case cScope
thus ? case by ( force intro : rScope simp add : residualInject )
next
case cBang
thus ? case by ( force intro : rBang simp add : residualInject )
qed
}
with Trans show ? thesis by ( simp add : residualInject )
qed
lemma tauFrameInduct [ consumes 3 , case_names cAlpha cCase cPar1 cPar2 cComm1 cComm2 cScope cBang ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
and Prop : : " ' d : : fs_name \ < Rightarrow > ' b \ < Rightarrow > ( ' a , ' b , ' c ) psi \ < Rightarrow >
( ' a , ' b , ' c ) psi \ < Rightarrow > name list \ < Rightarrow > ' b \ < Rightarrow > bool "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and rAlpha : " \ < And > \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p C . \ < lbrakk > A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) ; A \ < ^ sub > P \ < sharp > * C ;
set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) ; distinctPerm p ;
Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > P P ' ( p \ < bullet > A \ < ^ sub > P ) ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
and rCase : " \ < And > \ < Psi > P P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P C . \ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ; \ < And > C . Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; ( supp \ < Psi > \ < ^ sub > P ) = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( Cases Cs ) P ' ( [ ] ) ( \ < one > ) "
and rPar1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( P ' \ < parallel > Q ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rPar2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > P Q Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < tau > \ < prec > Q ' ;
extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < And > C . Prop C ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) Q Q ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( P \ < parallel > Q ' ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm1 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rComm2 : " \ < And > \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q C .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * Q ' ;
A \ < ^ sub > Q \ < sharp > * xvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ;
xvec \ < sharp > * Q ; xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( P \ < parallel > Q ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) ( A \ < ^ sub > P @ A \ < ^ sub > Q ) ( \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) "
and rScope : " \ < And > \ < Psi > P P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P ; x \ < sharp > \ < Psi > ;
x \ < sharp > A \ < ^ sub > P ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ;
A \ < ^ sub > P \ < sharp > * C ; x \ < sharp > C \ < rbrakk > \ < Longrightarrow >
Prop C \ < Psi > ( \ < lparr > \ < nu > x \ < rparr > P ) ( \ < lparr > \ < nu > x \ < rparr > P ' ) ( x # A \ < ^ sub > P ) \ < Psi > \ < ^ sub > P "
and rBang : " \ < And > \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P C .
\ < lbrakk > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > \ < tau > \ < prec > P ' ; guarded P ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < And > C . Prop C \ < Psi > ( P \ < parallel > ! P ) P ' A \ < ^ sub > P ( \ < Psi > \ < ^ sub > P \ < otimes > \ < one > ) ; \ < Psi > \ < ^ sub > P \ < simeq > \ < one > ; supp \ < Psi > \ < ^ sub > P = ( { } : : name set ) ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop C \ < Psi > ( ! P ) P ' ( [ ] ) ( \ < one > ) "
shows " Prop C \ < Psi > P P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P "
using Trans FrP \ < open > distinct A \ < ^ sub > P \ < close >
proof ( nominal_induct \ < Psi > P Rs = = " \ < tau > \ < prec > P ' " A \ < ^ sub > P \ < Psi > \ < ^ sub > P avoiding : C arbitrary : P ' rule : semanticsFrameInduct )
case cAlpha
thus ? case by ( force intro : rAlpha simp add : residualInject )
next
case cInput
thus ? case by ( simp add : residualInject )
next
case cOutput
thus ? case by ( simp add : residualInject )
next
case cCase
thus ? case by ( force intro : rCase simp add : residualInject )
next
case cPar1
thus ? case by ( force intro : rPar1 simp add : residualInject )
next
case cPar2
thus ? case by ( force intro : rPar2 simp add : residualInject )
next
case cComm1
thus ? case by ( force intro : rComm1 simp add : residualInject )
next
case cComm2
thus ? case by ( force intro : rComm2 simp add : residualInject )
next
case cOpen
thus ? case by ( simp add : residualInject )
next
case cScope
thus ? case by ( force intro : rScope simp add : residualInject )
next
case cBang
thus ? case by ( force intro : rBang simp add : residualInject )
qed
lemma inputFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " x \ < sharp > N "
shows " x \ < sharp > P ' "
proof -
have " bn ( M \ < lparr > N \ < rparr > ) \ < sharp > * subject ( M \ < lparr > N \ < rparr > ) " and " distinct ( bn ( M \ < lparr > N \ < rparr > ) ) " by simp +
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > show ? thesis using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > N \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > N \ < rparr > " P ' avoiding : x rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x )
thus ? case by simp
next
case ( cInput \ < Psi > M ' K xvec N ' Tvec P x )
from \ < open > K \ < lparr > ( N ' [ xvec : : = Tvec ] ) \ < rparr > = M \ < lparr > N \ < rparr > \ < close > have " M = K " and NeqN ' : " N = N ' [ xvec : : = Tvec ] " by ( simp add : action . inject ) +
note \ < open > length xvec = length Tvec \ < close > \ < open > distinct xvec \ < close > then
moreover have " x \ < sharp > Tvec " using \ < open > set xvec \ < subseteq > supp N ' \ < close > \ < open > x \ < sharp > N \ < close > NeqN '
by ( blast intro : substTerm . subst3 )
moreover from \ < open > xvec \ < sharp > * x \ < close > \ < open > x \ < sharp > M ' \ < lparr > \ < lambda > * xvec N ' \ < rparr > . P \ < close >
have " x \ < sharp > P " by ( simp add : inputChainFresh ) ( simp add : name_list_supp fresh_def )
ultimately show ? case using \ < open > xvec \ < sharp > * x \ < close > by auto
next
case ( cOutput \ < Psi > M K N P x )
thus ? case by simp
next
case ( cCase \ < Psi > P P ' \ < phi > Cs x )
thus ? case by ( induct Cs , auto )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P P ' xvec Q x )
thus ? case by simp
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q Q ' xvec P x )
thus ? case by simp
next
case ( cComm1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q x )
thus ? case by simp
next
case ( cComm2 \ < Psi > \ < Psi > \ < ^ sub > Q P M xwec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q x )
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y )
thus ? case by simp
next
case ( cScope \ < Psi > P P ' x y )
thus ? case by ( simp add : abs_fresh )
next
case ( cBang \ < Psi > P P ' x )
thus ? case by simp
qed
qed
lemma inputFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * N "
shows " xvec \ < sharp > * P ' "
using assms
by ( induct xvec )
( auto intro : inputFreshDerivative )
lemma outputFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " distinct xvec "
and " x \ < sharp > P "
and " x \ < sharp > xvec "
shows " x \ < sharp > N "
and " x \ < sharp > P ' "
proof -
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > have " bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) \ < sharp > * subject ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by simp
moreover from \ < open > distinct xvec \ < close > have " distinct ( bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) ) " by simp
ultimately show " x \ < sharp > N " using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > xvec \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " P ' avoiding : x arbitrary : M xvec N rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x M xvec N )
have S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " by fact
from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " ( p \ < bullet > p \ < bullet > \ < alpha > ) = p \ < bullet > ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by ( simp add : fresh_star_bij )
with \ < open > distinctPerm p \ < close > have " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " by simp
moreover from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > x \ < sharp > xvec \ < close > have " x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) " by simp
with \ < open > ( bn \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > xvec \ < close > S have " x \ < sharp > ( p \ < bullet > xvec ) "
by ( drule_tac pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst , where pi = p and x = xvec ] ) simp
ultimately have " x \ < sharp > ( p \ < bullet > N ) " using \ < open > x \ < sharp > P \ < close > by ( rule_tac cAlpha )
hence " ( p \ < bullet > x ) \ < sharp > ( p \ < bullet > p \ < bullet > N ) " by ( simp add : pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > distinctPerm p \ < close > \ < open > bn ( \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > S show ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by ( simp add : action . inject )
next
case cCase
thus ? case
by ( rule_tac cCase ) ( auto dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y M ' zvec N ' )
from \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > = M ' \ < lparr > \ < nu > * zvec \ < rparr > \ < langle > N ' \ < rangle > \ < close > have " zvec = xvec @ x # yvec " and " N = N ' "
by ( simp add : action . inject ) +
from \ < open > y \ < sharp > \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
moreover from \ < open > y \ < sharp > zvec \ < close > \ < open > zvec = xvec @ x # yvec \ < close > have " y \ < sharp > ( xvec @ yvec ) "
by simp
ultimately have " y \ < sharp > N " by ( rule_tac cOpen ) auto
with \ < open > N = N ' \ < close > show ? case by simp
next
case cScope
thus ? case by ( auto simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
next
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > xvec \ < sharp > * M \ < close > have " bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) \ < sharp > * subject ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by simp
moreover from \ < open > distinct xvec \ < close > have " distinct ( bn ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) ) " by simp
ultimately show " x \ < sharp > P ' " using \ < open > x \ < sharp > P \ < close > \ < open > x \ < sharp > xvec \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " P ' avoiding : x arbitrary : M xvec N rule : semanticsInduct )
case ( cAlpha \ < Psi > P \ < alpha > P ' p x M xvec N )
have S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " by fact
from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " ( p \ < bullet > p \ < bullet > \ < alpha > ) = p \ < bullet > ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > ) " by ( simp add : fresh_star_bij )
with \ < open > distinctPerm p \ < close > have " \ < alpha > = ( p \ < bullet > M ) \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > " by simp
moreover from \ < open > ( p \ < bullet > \ < alpha > ) = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > x \ < sharp > xvec \ < close > have " x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) " by simp
with \ < open > ( bn \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > xvec \ < close > S have " x \ < sharp > ( p \ < bullet > xvec ) "
by ( drule_tac pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst , where pi = p and x = xvec ] ) simp
ultimately have " x \ < sharp > P ' " using \ < open > x \ < sharp > P \ < close > by ( rule_tac cAlpha )
hence " ( p \ < bullet > x ) \ < sharp > ( p \ < bullet > P ' ) " by ( simp add : pt_fresh_bij1 [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > distinctPerm p \ < close > \ < open > bn ( \ < alpha > ) \ < sharp > * x \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > S show ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by ( simp add : action . inject )
next
case cCase
thus ? case by ( fastforce simp add : action . inject dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x y M ' zvec N ' )
from \ < open > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > = M ' \ < lparr > \ < nu > * zvec \ < rparr > \ < langle > N ' \ < rangle > \ < close > have " zvec = xvec @ x # yvec "
by ( simp add : action . inject )
from \ < open > y \ < sharp > \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
moreover from \ < open > y \ < sharp > zvec \ < close > \ < open > zvec = xvec @ x # yvec \ < close > have " y \ < sharp > ( xvec @ yvec ) "
by simp
ultimately show " y \ < sharp > P ' " by ( rule_tac cOpen ) auto
next
case cScope
thus ? case by ( auto simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
qed
lemma outputFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and yvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " distinct xvec "
and " yvec \ < sharp > * P "
and " yvec \ < sharp > * xvec "
shows " yvec \ < sharp > * N "
and " yvec \ < sharp > * P ' "
using assms
by ( induct yvec ) ( auto intro : outputFreshDerivative )
lemma tauFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and " x \ < sharp > P "
shows " x \ < sharp > P ' "
proof -
have " bn ( \ < tau > ) \ < sharp > * subject ( \ < tau > ) " and " distinct ( bn ( \ < tau > ) ) " by simp +
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' \ < close > show ? thesis using \ < open > x \ < sharp > P \ < close >
proof ( nominal_induct \ < Psi > P \ < alpha > = = " ( \ < tau > : : ( ' a action ) ) " P ' avoiding : x rule : semanticsInduct )
case cAlpha
thus ? case by simp
next
case cInput
thus ? case by simp
next
case cOutput
thus ? case by simp
next
case cCase
thus ? case by ( auto dest : memFresh )
next
case cPar1
thus ? case by simp
next
case cPar2
thus ? case by simp
next
case cComm1
thus ? case
by ( fastforce dest : inputFreshDerivative outputFreshDerivative simp add : resChainFresh )
next
case cComm2
thus ? case
by ( fastforce dest : inputFreshDerivative outputFreshDerivative simp add : resChainFresh )
next
case cOpen
thus ? case by simp
next
case cScope
thus ? case by ( simp add : abs_fresh )
next
case cBang
thus ? case by simp
qed
qed
lemma tauFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < tau > \ < prec > P ' "
and " xvec \ < sharp > * P "
shows " xvec \ < sharp > * P ' "
using assms
by ( induct xvec ) ( auto intro : tauFreshDerivative )
lemma freeFreshDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " x \ < sharp > \ < alpha > "
and " x \ < sharp > P "
shows " x \ < sharp > P ' "
using assms
by ( rule_tac actionCases [ where \ < alpha > = \ < alpha > ] )
( auto intro : inputFreshDerivative tauFreshDerivative outputFreshDerivative )
lemma freeFreshChainDerivative :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * \ < alpha > "
shows " xvec \ < sharp > * P ' "
using assms
by ( auto intro : freeFreshDerivative simp add : fresh_star_def )
lemma Input :
fixes \ < Psi > : : ' b
and M : : ' a
and K : : ' a
and xvec : : " name list "
and N : : ' a
and Tvec : : " ' a list "
assumes " \ < Psi > \ < turnstile > M \ < leftrightarrow > K "
and " distinct xvec "
and " set xvec \ < subseteq > supp N "
and " length xvec = length Tvec "
shows " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > \ < prec > P [ xvec : : = Tvec ] "
proof -
obtain p where xvecFreshPsi : " ( ( p : : name prm ) \ < bullet > ( xvec : : name list ) ) \ < sharp > * \ < Psi > "
and xvecFreshM : " ( p \ < bullet > xvec ) \ < sharp > * M "
and xvecFreshN : " ( p \ < bullet > xvec ) \ < sharp > * N "
and xvecFreshK : " ( p \ < bullet > xvec ) \ < sharp > * K "
and xvecFreshTvec : " ( p \ < bullet > xvec ) \ < sharp > * Tvec "
and xvecFreshP : " ( p \ < bullet > xvec ) \ < sharp > * P "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
and dp : " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , K , N , P , Tvec ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( p \ < bullet > xvec ) "
by simp
moreover from \ < open > ( set xvec ) \ < subseteq > ( supp N ) \ < close > have " ( p \ < bullet > ( set xvec ) ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by simp
hence " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > have " length ( p \ < bullet > xvec ) = length Tvec "
by simp
ultimately have " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) \ < longmapsto > K \ < lparr > ( p \ < bullet > N ) [ ( p \ < bullet > xvec ) : : = Tvec ] \ < rparr > \ < prec > ( p \ < bullet > P ) [ ( p \ < bullet > xvec ) : : = Tvec ] "
using xvecFreshPsi xvecFreshM xvecFreshK xvecFreshTvec
by ( rule_tac cInput )
thus ? thesis using xvecFreshN xvecFreshP S \ < open > length xvec = length Tvec \ < close > dp
by ( auto simp add : inputChainAlpha ' substTerm . renaming renaming )
qed
lemma residualAlpha :
fixes p : : " name prm "
and \ < alpha > : : " ' a action "
and P : : " ( ' a , ' b , ' c ) psi "
assumes " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * object \ < alpha > "
and " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject \ < alpha > "
and " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) "
shows " \ < alpha > \ < prec > P = ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ) "
using assms
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : eqvts bn . simps )
apply simp
apply ( simp add : boundOutputChainAlpha ' ' residualInject )
by simp
lemma Par1 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
and Q : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " bn \ < alpha > \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * \ < alpha > "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
and Q : : " ( ' a , ' b , ' c ) psi "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * \ < alpha > "
and " distinct A \ < ^ sub > Q "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P ' \ < parallel > Q ) "
proof -
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > have " distinct ( bn \ < alpha > ) " by ( rule boundOutputDistinct )
obtain q : : " name prm " where " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > "
and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " ( set q ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , P ' ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , \ < alpha > , bn \ < alpha > , q \ < bullet > \ < alpha > , P ' , ( q \ < bullet > P ' ) , \ < Psi > \ < ^ sub > Q ) " in name_list_avoiding ) auto
from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( rule_tac \ < alpha > = \ < alpha > in actionCases ) ( auto simp add : eqvts )
from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq have " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) "
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : bn . simps eqvts , simp )
apply ( simp add : freshChainSimps )
by simp
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( q \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( q \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : fresh_star_bij )
hence " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) " by ( simp add : eqvts )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * ( subject \ < alpha > ) \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( auto intro : freeFreshChainDerivative )
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sp have " extractFrame Q = \ < langle > ( p \ < bullet > A \ < ^ sub > Q ) , ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp
have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > Q ) " by simp
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( ( q \ < bullet > P ' ) \ < parallel > Q ) "
using \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( subject ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac cPar1 )
thus ? thesis using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > Sq
by ( force simp add : residualAlpha )
qed
}
note Goal = this
from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
obtain A \ < ^ sub > Q ' where FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * \ < alpha > "
by ( rule_tac C = " ( \ < Psi > , P , \ < alpha > ) " in distinctFrame ) auto
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
from Trans FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
show ? case using \ < open > \ < alpha > = M \ < lparr > N \ < rparr > \ < close > by ( force intro : Goal )
next
case cTau
from Trans FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
show ? case using \ < open > \ < alpha > = \ < tau > \ < close > by ( force intro : Goal )
next
case ( cOutput M xvec N )
from \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > have " xvec \ < sharp > * A \ < ^ sub > Q ' " and " xvec \ < sharp > * Q "
by simp +
obtain p where " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and " ( p \ < bullet > xvec ) \ < sharp > * Q "
and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q ' "
and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
by ( rule_tac xvec = xvec and c = " ( N , P ' , Q , M , A \ < ^ sub > Q ' ) " in name_list_avoiding ) auto
from Trans \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > S
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover from \ < open > xvec \ < sharp > * A \ < ^ sub > Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q ' \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close > S
have " A \ < ^ sub > Q ' \ < sharp > * ( p \ < bullet > \ < alpha > ) " by ( simp add : freshChainSimps del : actionFreshChain )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) \ < parallel > Q "
using FrQ \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * P \ < close > \ < open > distinct A \ < ^ sub > Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q ' \ < sharp > * \ < alpha > \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
by ( force intro : Goal )
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * Q \ < close > S \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
show ? case
by ( simp add : boundOutputChainAlpha ' ' eqvts create_residual . simps )
qed
qed
lemma Par2 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and P : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " bn \ < alpha > \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * \ < alpha > "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and P : : " ( ' a , ' b , ' c ) psi "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * \ < alpha > "
and " distinct A \ < ^ sub > P "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > ( P \ < parallel > Q ' ) "
proof -
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > have " distinct ( bn \ < alpha > ) " by ( rule boundOutputDistinct )
obtain q : : " name prm " where " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > "
and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' " and " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and Sq : " ( set q ) \ < subseteq > ( set ( bn \ < alpha > ) ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , Q ' , ( q \ < bullet > Q ' ) , \ < Psi > \ < ^ sub > P ) " in name_list_avoiding ) auto
from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( rule_tac \ < alpha > = \ < alpha > in actionCases ) ( auto simp add : eqvts )
from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P \ < close > Sq have " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) "
apply ( rule_tac \ < alpha > = \ < alpha > in actionCases )
apply ( simp only : bn . simps eqvts , simp )
apply ( simp add : freshChainSimps )
by simp
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( q \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( q \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : fresh_star_bij )
hence " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) " by ( simp add : eqvts )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * ( subject \ < alpha > ) \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( auto intro : freeFreshChainDerivative )
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > ( p \ < bullet > Q ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp
have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( P \ < parallel > ( q \ < bullet > Q ' ) ) "
using \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( subject ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac cPar2 )
thus ? thesis using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > Sq
by ( force simp add : residualAlpha )
qed
}
note Goal = this
from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
obtain A \ < ^ sub > P ' where FrP : " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * \ < alpha > "
by ( rule_tac C = " ( \ < Psi > , Q , \ < alpha > ) " in distinctFrame ) auto
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
from Trans FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
show ? case using \ < open > \ < alpha > = M \ < lparr > N \ < rparr > \ < close > by ( force intro : Goal )
next
case cTau
from Trans FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
show ? case using \ < open > \ < alpha > = \ < tau > \ < close > by ( force intro : Goal )
next
case ( cOutput M xvec N )
from \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > have " xvec \ < sharp > * A \ < ^ sub > P ' " and " xvec \ < sharp > * P "
by simp +
obtain p where " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * Q ' " and " ( p \ < bullet > xvec ) \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P ' "
and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
by ( rule_tac xvec = xvec and c = " ( N , Q ' , P , M , A \ < ^ sub > P ' ) " in name_list_avoiding ) auto
from Trans \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' " by simp
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q ' \ < close > S
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover from \ < open > xvec \ < sharp > * A \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P ' \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close > S
have " A \ < ^ sub > P ' \ < sharp > * ( p \ < bullet > \ < alpha > ) " by ( simp add : freshChainSimps del : actionFreshChain )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > P \ < parallel > ( p \ < bullet > Q ' ) "
using FrP \ < open > A \ < ^ sub > P ' \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * Q \ < close > \ < open > distinct A \ < ^ sub > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * \ < alpha > \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
by ( force intro : Goal )
with \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * Q ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * P \ < close > S \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close >
show ? case
by ( simp add : boundOutputChainAlpha ' ' eqvts create_residual . simps )
qed
qed
lemma Open :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and yvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes Trans : " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " x \ < in > supp N "
and " x \ < sharp > \ < Psi > "
and " x \ < sharp > M "
and " x \ < sharp > xvec "
and " x \ < sharp > yvec "
shows " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from Trans have " distinct ( xvec @ yvec ) " by ( force dest : boundOutputDistinct )
hence " xvec \ < sharp > * yvec " by ( induct xvec ) auto
obtain p where " ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > yvec ) \ < sharp > * P " and " ( p \ < bullet > yvec ) \ < sharp > * M "
and " ( p \ < bullet > yvec ) \ < sharp > * yvec " and " ( p \ < bullet > yvec ) \ < sharp > * N " and " ( p \ < bullet > yvec ) \ < sharp > * P ' "
and " x \ < sharp > ( p \ < bullet > yvec ) " and " ( p \ < bullet > yvec ) \ < sharp > * xvec "
and Sp : " ( set p ) \ < subseteq > ( set yvec ) \ < times > ( set ( p \ < bullet > yvec ) ) "
by ( rule_tac xvec = yvec and c = " ( \ < Psi > , P , M , xvec , yvec , N , P ' , x ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q where " ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > xvec ) \ < sharp > * P " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and " ( q \ < bullet > xvec ) \ < sharp > * xvec " and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' "
and " x \ < sharp > ( q \ < bullet > xvec ) " and " ( q \ < bullet > xvec ) \ < sharp > * yvec "
and " ( q \ < bullet > xvec ) \ < sharp > * p " and " ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) "
and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , yvec , p \ < bullet > yvec , N , P ' , x , p ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N " apply ( simp only : eqvts ) apply ( simp only : pt2 [ OF pt_name_inst ] )
by simp
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' " by ( simp del : freshAlphaPerm add : eqvts pt2 [ OF pt_name_inst ] )
moreover from Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have Spq : " set ( p @ q ) \ < subseteq > set ( xvec @ yvec ) \ < times > set ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) "
by ( simp add : pt2 [ OF pt_name_inst ] eqvts ) blast
ultimately have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
apply ( simp add : create_residual . simps )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
with Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( p @ q ) \ < bullet > x ) \ < in > ( p @ q ) \ < bullet > ( supp N ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp Sq
have " x \ < in > supp ( ( p @ q ) \ < bullet > N ) " by ( simp add : eqvts pt2 [ OF pt_name_inst ] )
moreover from \ < open > distinct ( xvec @ yvec ) \ < close > have " distinct ( q \ < bullet > xvec ) " and " distinct ( p \ < bullet > yvec ) "
by auto
moreover note \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * M \ < close > \ < open > distinct ( q \ < bullet > xvec ) \ < close >
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ x # ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( rule_tac cOpen )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close >
\ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( p @ q ) \ < bullet > ( xvec @ x # yvec ) ) \ < rparr > \ < langle > ( ( p @ q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
thus ? thesis using \ < open > ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N \ < close > \ < open > ( ( p @ q ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' \ < close > Spq
apply ( simp add : create_residual . simps )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
qed
lemma Scope :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " x \ < sharp > \ < Psi > "
and " x \ < sharp > \ < alpha > "
shows " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' "
proof -
{
fix \ < Psi > P M xvec N P ' x
assume " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " ( x : : name ) \ < sharp > \ < Psi > "
and " x \ < sharp > M "
and " x \ < sharp > xvec "
and " x \ < sharp > N "
obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * P " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * xvec "
and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and " x \ < sharp > ( p \ < bullet > xvec ) "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , N , P ' , x ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > S
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
moreover hence " distinct ( p \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover note \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > ( p \ < bullet > xvec ) \ < close >
moreover from \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > p \ < bullet > xvec \ < close > \ < open > x \ < sharp > N \ < close > S have " x \ < sharp > ( p \ < bullet > N ) "
by ( simp add : fresh_left del : freshAlphaSwap )
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) " using \ < open > ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close >
by ( rule_tac cScope ) auto
moreover from \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > p \ < bullet > xvec \ < close > S have " p \ < bullet > x = x " by simp
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * ( p \ < bullet > xvec ) \ < rparr > \ < langle > ( p \ < bullet > N ) \ < rangle > \ < prec > ( p \ < bullet > ( \ < lparr > \ < nu > x \ < rparr > P ' ) ) " by simp
moreover from \ < open > ( p \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > xvec ) \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * \ < lparr > \ < nu > x \ < rparr > P ' "
by ( simp add : abs_fresh_star )
ultimately have " \ < Psi > \ < rhd > \ < lparr > \ < nu > x \ < rparr > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' " using \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > S
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
}
note Goal = this
show ? thesis
proof ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] )
case ( cInput M N )
with assms show ? case by ( force intro : cScope )
next
case ( cOutput M xvec N )
with assms show ? case by ( force intro : Goal )
next
case cTau
with assms show ? case by ( force intro : cScope )
qed
qed
lemma inputSwapFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : x y rule : inputInduct )
case ( cInput \ < Psi > M K xvec N Tvec P x y )
from \ < open > x \ < sharp > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > have " x \ < sharp > M " by simp
from \ < open > y \ < sharp > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > have " y \ < sharp > M " by simp
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > M ) \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( rule chanEqClosed )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > M \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( simp )
thus ? case using \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close > \ < open > length xvec = length Tvec \ < close >
by ( rule Input )
next
case ( cCase \ < Psi > P M N P ' \ < phi > Cs x y )
from \ < open > x \ < sharp > Cases Cs \ < close > \ < open > y \ < sharp > Cases Cs \ < close > \ < open > ( \ < phi > , P ) mem Cs \ < close > have " x \ < sharp > \ < phi > " and " x \ < sharp > P " and " y \ < sharp > \ < phi > " and " y \ < sharp > P "
by ( auto dest : memFresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by ( rule cCase )
moreover note \ < open > ( \ < phi > , P ) mem Cs \ < close >
moreover from \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > \ < phi > ) " by ( rule statClosed )
with \ < open > x \ < sharp > \ < phi > \ < close > \ < open > y \ < sharp > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > \ < phi > " by simp
ultimately show ? case using \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > ( extractFrame Q ) ) = ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ) "
by simp
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > x \ < sharp > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > \ < open > y \ < sharp > Q \ < close > have " \ < langle > A \ < ^ sub > Q , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > = extractFrame Q "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > Q \ < close > \ < open > y \ < sharp > Q \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > Q ; y \ < sharp > Q \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > Q ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > Q ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > ( extractFrame P ) ) = ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ) "
by simp
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > x \ < sharp > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > \ < open > y \ < sharp > P \ < close > have " \ < langle > A \ < ^ sub > P , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > = extractFrame P "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac Par2 ) auto
next
case ( cScope \ < Psi > P M N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < sharp > N \ < close >
by ( rule_tac Scope ) ( assumption | simp ) +
next
case ( cBang \ < Psi > P M N P ' x y )
thus ? case by ( force intro : Bang )
qed
lemma inputPermFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
using S
proof ( induct p )
case Nil
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
show ? case by simp
next
case ( Cons a p )
from \ < open > set ( a # p ) \ < subseteq > Xs \ < times > Ys \ < close > have " set p \ < subseteq > Xs \ < times > Ys " by auto
with \ < open > set p \ < subseteq > Xs \ < times > Ys \ < Longrightarrow > ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have Trans : " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by simp
from \ < open > set ( a # p ) \ < subseteq > Xs \ < times > Ys \ < close > show ? case
proof ( cases a , clarsimp )
fix a b
assume " a \ < in > Xs " and " b \ < in > Ys "
with \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " a \ < sharp > P " and " b \ < sharp > P "
by ( auto simp add : fresh_star_def )
with Trans show " ( [ ( a , b ) ] \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( a , b ) ] \ < bullet > p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
qed
qed
lemma inputSwapSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > \ < Psi > "
and " y \ < sharp > \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > show ? thesis
by simp
qed
lemma inputPermSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
and " Xs \ < sharp > * \ < Psi > "
and " Ys \ < sharp > * \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > S \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputPermFrameSubject )
with \ < open > Xs \ < sharp > * \ < Psi > \ < close > \ < open > Ys \ < sharp > * \ < Psi > \ < close > S show ? thesis
by simp
qed
lemma inputSwapFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > M "
and " y \ < sharp > M "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputSwapFrameSubject )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > show ? thesis
by simp
qed
lemma inputPermFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and Xs : : " name set "
and Ys : : " name set "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and S : " set p \ < subseteq > Xs \ < times > Ys "
and " Xs \ < sharp > * P "
and " Ys \ < sharp > * P "
and " Xs \ < sharp > * M "
and " Ys \ < sharp > * M "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > S \ < open > Xs \ < sharp > * P \ < close > \ < open > Ys \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' "
by ( rule inputPermFrameSubject )
with \ < open > Xs \ < sharp > * M \ < close > \ < open > Ys \ < sharp > * M \ < close > S show ? thesis
by simp
qed
lemma inputAlpha :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and xvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) "
and " distinctPerm p "
and " xvec \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * P "
shows " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > ( p \ < bullet > N ) \ < rparr > \ < prec > ( p \ < bullet > P ' ) "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close >
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' " by ( rule_tac inputPermFrameSubject ) auto
hence " ( p \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > ( p \ < bullet > ( ( p \ < bullet > M ) \ < lparr > N \ < rparr > \ < prec > P ' ) ) " by ( rule eqvts )
with \ < open > distinctPerm p \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > set p \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) \ < close >
show ? thesis by ( simp add : eqvts )
qed
lemma frameFresh [ dest ] :
fixes x : : name
and A \ < ^ sub > F : : " name list "
and \ < Psi > \ < ^ sub > F : : ' b
assumes " x \ < sharp > A \ < ^ sub > F "
and " x \ < sharp > \ < langle > A \ < ^ sub > F , \ < Psi > \ < ^ sub > F \ < rangle > "
shows " x \ < sharp > \ < Psi > \ < ^ sub > F "
using assms
by ( simp add : frameResChainFresh ) ( simp add : fresh_def name_list_supp )
lemma outputSwapFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : x y rule : outputInduct ' )
case cAlpha
thus ? case by ( simp add : create_residual . simps boundOutputChainAlpha ' ' )
next
case ( cOutput \ < Psi > M K N P x y )
from \ < open > x \ < sharp > M \ < langle > N \ < rangle > . P \ < close > have " x \ < sharp > M " by simp
from \ < open > y \ < sharp > M \ < langle > N \ < rangle > . P \ < close > have " y \ < sharp > M " by simp
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > M ) \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( rule chanEqClosed )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > M \ < leftrightarrow > ( [ ( x , y ) ] \ < bullet > K ) "
by ( simp )
thus ? case by ( rule Output )
next
case ( cCase \ < Psi > P M xvec N P ' \ < phi > Cs x y )
from \ < open > x \ < sharp > Cases Cs \ < close > \ < open > y \ < sharp > Cases Cs \ < close > \ < open > ( \ < phi > , P ) mem Cs \ < close > have " x \ < sharp > \ < phi > " and " x \ < sharp > P " and " y \ < sharp > \ < phi > " and " y \ < sharp > P "
by ( auto dest : memFresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( rule cCase )
moreover note \ < open > ( \ < phi > , P ) mem Cs \ < close >
moreover from \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > ( [ ( x , y ) ] \ < bullet > \ < phi > ) " by ( rule statClosed )
with \ < open > x \ < sharp > \ < phi > \ < close > \ < open > y \ < sharp > \ < phi > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < turnstile > \ < phi > " by simp
ultimately show ? case using \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ) = ( [ ( x , y ) ] \ < bullet > ( extractFrame Q ) ) "
by simp
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > x \ < sharp > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > \ < open > y \ < sharp > Q \ < close > have " \ < langle > A \ < ^ sub > Q , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > = extractFrame Q "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * x \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * y \ < close > have " A \ < ^ sub > Q \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P x y )
from \ < open > x \ < sharp > P \ < parallel > Q \ < close > have " x \ < sharp > P " and " x \ < sharp > Q " by simp +
from \ < open > y \ < sharp > P \ < parallel > Q \ < close > have " y \ < sharp > P " and " y \ < sharp > Q " by simp +
from \ < open > x \ < sharp > Q \ < close > \ < open > y \ < sharp > Q \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > Q ; y \ < sharp > Q \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < otimes > ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > have " ( [ ( x , y ) ] \ < bullet > \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ) = ( [ ( x , y ) ] \ < bullet > ( extractFrame P ) ) "
by simp
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > x \ < sharp > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > \ < open > y \ < sharp > P \ < close > have " \ < langle > A \ < ^ sub > P , ( [ ( x , y ) ] \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > = extractFrame P "
by ( simp add : eqvts )
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > \ < Psi > ) " by simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > have " ( [ ( x , y ) ] \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * x \ < close > \ < open > A \ < ^ sub > P \ < sharp > * y \ < close > have " A \ < ^ sub > P \ < sharp > * ( [ ( x , y ) ] \ < bullet > M ) " by simp
ultimately show ? case using \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close >
by ( rule_tac Par2 ) auto
next
case ( cOpen \ < Psi > P M xvec yvec N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < in > supp N \ < close > \ < open > z \ < sharp > xvec \ < close > \ < open > z \ < sharp > yvec \ < close >
by ( rule_tac Open ) ( assumption | simp ) +
next
case ( cScope \ < Psi > P M xvec N P ' z x y )
from \ < open > x \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > x \ < close > have " x \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > y \ < sharp > \ < lparr > \ < nu > z \ < rparr > P \ < close > \ < open > z \ < sharp > y \ < close > have " y \ < sharp > P " by ( simp add : abs_fresh )
from \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close > \ < open > \ < And > x y . \ < lbrakk > x \ < sharp > P ; y \ < sharp > P \ < rbrakk > \ < Longrightarrow > ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by simp
moreover with \ < open > z \ < sharp > \ < Psi > \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > \ < Psi > " by simp
moreover with \ < open > z \ < sharp > M \ < close > have " ( [ ( x , y ) ] \ < bullet > z ) \ < sharp > [ ( x , y ) ] \ < bullet > M "
by ( simp add : pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > z \ < sharp > x \ < close > \ < open > z \ < sharp > y \ < close > have " z \ < sharp > [ ( x , y ) ] \ < bullet > M " by simp
ultimately show ? case using \ < open > z \ < sharp > N \ < close > \ < open > z \ < sharp > xvec \ < close >
by ( rule_tac Scope ) ( assumption | simp ) +
next
case ( cBang \ < Psi > P M B x y )
thus ? case by ( force intro : Bang )
qed
lemma outputPermFrameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
{
fix xvec N P ' Xs YS
assume " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " and " xvec \ < sharp > * M " and " xvec \ < sharp > * yvec " and " xvec \ < sharp > * zvec "
have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " using S
proof ( induct p )
case Nil
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
show ? case by simp
next
case ( Cons a p )
from \ < open > set ( a # p ) \ < subseteq > set yvec \ < times > set zvec \ < close > have " set p \ < subseteq > set yvec \ < times > set zvec " by auto
then have Trans : " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( rule Cons )
from \ < open > set ( a # p ) \ < subseteq > set yvec \ < times > set zvec \ < close > show ? case
proof ( cases a , clarsimp )
fix x y
note Trans
moreover from \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * zvec \ < close > \ < open > set p \ < subseteq > set yvec \ < times > set zvec \ < close > \ < open > xvec \ < sharp > * M \ < close > have " xvec \ < sharp > * ( p \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover assume " x \ < in > set yvec " and " y \ < in > set zvec "
with \ < open > yvec \ < sharp > * P \ < close > \ < open > zvec \ < sharp > * P \ < close > have " x \ < sharp > P " and " y \ < sharp > P "
by ( auto simp add : fresh_star_def )
ultimately show " ( [ ( x , y ) ] \ < bullet > p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
qed
qed
}
note Goal = this
obtain q : : " name prm " where " ( q \ < bullet > xvec ) \ < sharp > * yvec " and " ( q \ < bullet > xvec ) \ < sharp > * zvec " and " ( q \ < bullet > xvec ) \ < sharp > * xvec "
and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( P , xvec , yvec , zvec , N , M , P ' ) " in name_list_avoiding ) auto
with \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > \ < langle > ( q \ < bullet > N ) \ < rangle > \ < prec > ( q \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > \ < langle > ( q \ < bullet > N ) \ < rangle > \ < prec > ( q \ < bullet > P ' ) "
using \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * zvec \ < close >
by ( rule Goal )
with \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > Sq show ? thesis
by ( simp add : boundOutputChainAlpha ' ' residualInject )
qed
lemma outputSwapSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > \ < Psi > "
and " y \ < sharp > \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > show ? thesis
by simp
qed
lemma outputPermSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
and " yvec \ < sharp > * \ < Psi > "
and " zvec \ < sharp > * \ < Psi > "
shows " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from assms have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule_tac outputPermFrameSubject )
with S \ < open > yvec \ < sharp > * \ < Psi > \ < close > \ < open > zvec \ < sharp > * \ < Psi > \ < close > show ? thesis
by simp
qed
lemma outputSwapFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and x : : name
and y : : name
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " xvec \ < sharp > * M "
and " x \ < sharp > P "
and " y \ < sharp > P "
and " x \ < sharp > M "
and " y \ < sharp > M "
shows " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > x \ < sharp > P \ < close > \ < open > y \ < sharp > P \ < close >
have " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( [ ( x , y ) ] \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule outputSwapFrameSubject )
with \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > show ? thesis
by simp
qed
lemma outputPermFrame :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and B : : " ( ' a , ' b , ' c ) boundOutput "
and p : : " name prm "
and yvec : : " name list "
and zvec : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and S : " set p \ < subseteq > set yvec \ < times > set zvec "
and " yvec \ < sharp > * P "
and " zvec \ < sharp > * P "
and " yvec \ < sharp > * M "
and " zvec \ < sharp > * M "
shows " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
proof -
from assms have " ( p \ < bullet > \ < Psi > ) \ < rhd > P \ < longmapsto > ( p \ < bullet > M ) \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by ( rule_tac outputPermFrameSubject )
with S \ < open > yvec \ < sharp > * M \ < close > \ < open > zvec \ < sharp > * M \ < close > show ? thesis
by simp
qed
lemma Comm1 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and xvec : : " name list "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assumes " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * P "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and xvec : : " name list "
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " distinct A \ < ^ sub > Q "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * P "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " set q \ < subseteq > set A \ < ^ sub > Q \ < times > set ( q \ < bullet > A \ < ^ sub > Q ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , r \ < bullet > N , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , r \ < bullet > N , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) "
by ( rule inputAlpha )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > A \ < ^ sub > P ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover hence " distinct ( r \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) " by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by ( rule_tac cComm1 )
with \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > Sr
show ? thesis
by ( subst resChainAlpha ) auto
qed
}
note Goal = this
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > P ' where " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * P " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * M " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q "
by ( rule_tac C = " ( \ < Psi > , P , Q , M , A \ < ^ sub > Q ) " in distinctFrame ) auto
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > Q ' where " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * Q " and " A \ < ^ sub > Q ' \ < sharp > * K " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q ' "
apply ( rule_tac C = " ( \ < Psi > , P , Q , K , A \ < ^ sub > P ' ) " in distinctFrame ) by auto
ultimately show ? thesis using \ < open > xvec \ < sharp > * P \ < close >
by ( rule_tac Goal )
qed
lemma Comm2 :
fixes \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assumes " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * Q "
shows " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
{
fix \ < Psi > : : ' b
and \ < Psi > \ < ^ sub > Q : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and Q : : " ( ' a , ' b , ' c ) psi "
and K : : ' a
and Q ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > Q : : " name list "
assume " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' "
and " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and " distinct A \ < ^ sub > Q "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * Q "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q "
and " A \ < ^ sub > Q \ < sharp > * \ < Psi > "
and " A \ < ^ sub > Q \ < sharp > * P "
and " A \ < ^ sub > Q \ < sharp > * Q "
and " A \ < ^ sub > Q \ < sharp > * K "
and " xvec \ < sharp > * Q "
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) "
proof -
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and Sq : " set q \ < subseteq > set A \ < ^ sub > Q \ < times > set ( q \ < bullet > A \ < ^ sub > Q ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , r \ < bullet > N , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , r \ < bullet > N , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , r \ < bullet > Q ' , r \ < bullet > P ' ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) "
by ( simp add : boundOutputChainAlpha ' ' create_residual . simps )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover hence " distinct ( r \ < bullet > xvec ) " by ( force dest : boundOutputDistinct )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) "
by ( rule inputAlpha )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
ultimately have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by ( rule_tac cComm2 )
with \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > Sr
show ? thesis
by ( subst resChainAlpha ) auto
qed
}
note Goal = this
note \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > P ' where " extractFrame P = \ < langle > A \ < ^ sub > P ' , \ < Psi > \ < ^ sub > P \ < rangle > " and " distinct A \ < ^ sub > P ' " and " A \ < ^ sub > P ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > P ' \ < sharp > * P " and " A \ < ^ sub > P ' \ < sharp > * Q " and " A \ < ^ sub > P ' \ < sharp > * M " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q "
by ( rule_tac C = " ( \ < Psi > , P , Q , M , A \ < ^ sub > Q ) " in distinctFrame ) auto
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q \ < close >
obtain A \ < ^ sub > Q ' where " extractFrame Q = \ < langle > A \ < ^ sub > Q ' , \ < Psi > \ < ^ sub > Q \ < rangle > " and " distinct A \ < ^ sub > Q ' " and " A \ < ^ sub > Q ' \ < sharp > * \ < Psi > " and " A \ < ^ sub > Q ' \ < sharp > * P " and " A \ < ^ sub > Q ' \ < sharp > * Q " and " A \ < ^ sub > Q ' \ < sharp > * K " and " A \ < ^ sub > P ' \ < sharp > * A \ < ^ sub > Q ' "
by ( rule_tac C = " ( \ < Psi > , P , Q , K , A \ < ^ sub > P ' ) " in distinctFrame ) auto
ultimately show ? thesis using \ < open > xvec \ < sharp > * Q \ < close >
by ( rule_tac Goal )
qed
lemma semanticsCasesAux [ consumes 1 , case_names cInput cOutput cCase cPar1 cPar2 cComm1 cComm2 cOpen cScope cBang ] :
fixes \ < Psi > : : ' b
and cP : : " ( ' a , ' b , ' c ) psi "
and cRs : : " ( ' a , ' b , ' c ) residual "
and C : : " ' d : : fs_name "
and x : : name
assumes " \ < Psi > \ < rhd > cP \ < longmapsto > cRs "
and rInput : " \ < And > M K xvec N Tvec P . \ < lbrakk > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ; cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] ;
\ < Psi > \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ;
xvec \ < sharp > * Tvec ; xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop "
and rOutput : " \ < And > M K N P . \ < lbrakk > cP = M \ < langle > N \ < rangle > . P ; cRs = K \ < langle > N \ < rangle > \ < prec > P ; \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < rbrakk > \ < Longrightarrow > Prop "
and rCase : " \ < And > Cs P \ < phi > . \ < lbrakk > cP = Cases Cs ; \ < Psi > \ < rhd > P \ < longmapsto > cRs ; ( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
and rPar1 : " \ < And > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q . \ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) ;
( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( \ < alpha > \ < prec > P ' ) ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * P ' ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > Q ;
bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow >
Prop "
and rPar2 : " \ < And > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P . \ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) ;
( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > P \ < sharp > * Q ' ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * \ < Psi > \ < ^ sub > P ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * Q ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow > Prop "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rOpen : " \ < And > P M xvec yvec N P ' x .
\ < lbrakk > cP = \ < lparr > \ < nu > x \ < rparr > P ; cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ;
\ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; x \ < in > supp N ; x \ < sharp > xvec ; x \ < sharp > yvec ; x \ < sharp > M ; x \ < sharp > \ < Psi > ; distinct xvec ; distinct yvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * yvec ; yvec \ < sharp > * \ < Psi > ; yvec \ < sharp > * P ; yvec \ < sharp > * M ; xvec \ < sharp > * C ; x \ < sharp > C ; yvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop "
and rScope : " \ < And > P \ < alpha > P ' x . \ < lbrakk > cP = \ < lparr > \ < nu > x \ < rparr > P ; cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' ;
\ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; x \ < sharp > \ < Psi > ; x \ < sharp > \ < alpha > ; x \ < sharp > C ; bn \ < alpha > \ < sharp > * \ < Psi > ; bn \ < alpha > \ < sharp > * P ; bn \ < alpha > \ < sharp > * subject \ < alpha > ; bn \ < alpha > \ < sharp > * C ; distinct ( bn \ < alpha > ) \ < rbrakk > \ < Longrightarrow > Prop "
and rBang : " \ < And > P . \ < lbrakk > cP = ! P ; \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > cRs ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
shows Prop
using \ < open > \ < Psi > \ < rhd > cP \ < longmapsto > cRs \ < close >
proof ( cases rule : semantics . cases )
case ( cInput M K xvec N Tvec P )
obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * K "
and " ( p \ < bullet > xvec ) \ < sharp > * Tvec " and " ( p \ < bullet > xvec ) \ < sharp > * P " and " ( p \ < bullet > xvec ) \ < sharp > * C "
and S : " ( set p ) \ < subseteq > ( set xvec ) \ < times > ( set ( p \ < bullet > xvec ) ) " and " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , K , N , P , C , Tvec ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
from \ < open > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S
have " cP = M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) "
by ( simp add : inputChainAlpha ' )
moreover from \ < open > cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S \ < open > length xvec = length Tvec \ < close > \ < open > distinctPerm p \ < close >
have " cRs = K \ < lparr > ( ( p \ < bullet > N ) [ ( p \ < bullet > xvec ) : : = Tvec ] ) \ < rparr > \ < prec > ( p \ < bullet > P ) [ ( p \ < bullet > xvec ) : : = Tvec ] "
by ( auto simp add : substTerm . renaming renaming residualInject )
moreover note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( p \ < bullet > xvec ) "
by simp
moreover from \ < open > ( set xvec ) \ < subseteq > ( supp N ) \ < close > have " ( p \ < bullet > ( set xvec ) ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by simp
hence " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > have " length ( p \ < bullet > xvec ) = length Tvec "
by simp
ultimately show ? thesis using \ < open > ( p \ < bullet > xvec ) \ < sharp > * Tvec \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * K \ < close >
\ < open > ( p \ < bullet > xvec ) \ < sharp > * C \ < close >
by ( rule rInput )
next
case ( Output M K N P )
thus ? thesis by ( rule rOutput )
next
case ( Case P \ < phi > Cs )
thus ? thesis by ( rule rCase )
next
case ( cPar1 \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q )
obtain q : : " name prm " where " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " distinctPerm q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , P ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > Q ) ) " and " distinctPerm p "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , P ' , ( q \ < bullet > P ' ) , \ < Psi > \ < ^ sub > Q , C ) " in name_list_avoiding ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > Q \ < close > Sq \ < open > distinctPerm q \ < close > have " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm q \ < close > have " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm q \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ q ] ) ( simp add : eqvts )
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > Sq
have " cRs = ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) \ < parallel > Q "
by ( force simp add : residualAlpha )
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( drule_tac freeFreshChainDerivative ) auto
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > ( p \ < bullet > P ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > P ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sp have " extractFrame Q = \ < langle > ( p \ < bullet > A \ < ^ sub > Q ) , ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > Q ) " by simp
ultimately show ? thesis
using \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( q \ < bullet > P ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac rPar1 )
next
case ( cPar2 \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P )
obtain q : : " name prm " where " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' " and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P "
and " distinctPerm q "
and " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( q \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , Q , \ < alpha > , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C "
and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) " and " distinctPerm p "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , \ < alpha > , q \ < bullet > \ < alpha > , Q ' , ( q \ < bullet > Q ' ) , \ < Psi > \ < ^ sub > P , C ) " in name_list_avoiding ) auto
from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * A \ < ^ sub > P \ < close > Sq \ < open > distinctPerm q \ < close > have " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm q \ < close > have " bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ q ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm q \ < close > have " distinct ( bn ( q \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ q ] ) ( simp add : eqvts )
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > Sq
have " cRs = ( q \ < bullet > \ < alpha > ) \ < prec > P \ < parallel > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q ' \ < close > Sq
have Trans : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) "
by ( force simp add : residualAlpha )
hence " A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) " using \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
by ( drule_tac freeFreshChainDerivative ) auto
from Trans have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > ( p \ < bullet > Q ) \ < longmapsto > p \ < bullet > ( ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) ) "
by ( rule semantics . eqvt )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > \ < open > A \ < ^ sub > P \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > Sp
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( q \ < bullet > \ < alpha > ) \ < prec > ( q \ < bullet > Q ' ) " by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha ' eqvts )
moreover from \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close > Sp have " ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshAlphaPerm )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
ultimately show ? thesis
using \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < alpha > ) \ < close >
\ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > Q ' ) \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * Q \ < close > \ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * P \ < close >
\ < open > ( bn ( q \ < bullet > \ < alpha > ) ) \ < sharp > * C \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > bn ( q \ < bullet > \ < alpha > ) \ < sharp > * subject ( q \ < bullet > \ < alpha > ) \ < close > \ < open > distinct ( bn ( q \ < bullet > \ < alpha > ) ) \ < close >
by ( rule_tac rPar2 )
next
case ( cComm1 \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q )
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * C " and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' , C ) " in name_list_avoiding )
( auto simp add : eqvts )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( q \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , N , xvec , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding ) clarsimp
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , N , xvec , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > have " ( r \ < bullet > xvec ) \ < sharp > * ( P ' \ < parallel > Q ' ) "
by simp
with \ < open > cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > Sr
have " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( r \ < bullet > ( P ' \ < parallel > Q ' ) ) " by ( simp add : resChainAlpha residualInject )
hence " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) "
by ( rule inputAlpha )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) "
by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * C \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( r \ < bullet > xvec ) " by simp
ultimately show ? thesis by ( rule rComm1 )
next
case ( cComm2 \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q )
obtain r : : " name prm " where " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( r \ < bullet > xvec ) \ < sharp > * P " and " ( r \ < bullet > xvec ) \ < sharp > * Q " and " ( r \ < bullet > xvec ) \ < sharp > * M "
and " ( r \ < bullet > xvec ) \ < sharp > * K " and " ( r \ < bullet > xvec ) \ < sharp > * N " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * P ' " and " ( r \ < bullet > xvec ) \ < sharp > * Q ' " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q "
and " ( r \ < bullet > xvec ) \ < sharp > * C " and Sr : " ( set r ) \ < subseteq > ( set xvec ) \ < times > ( set ( r \ < bullet > xvec ) ) " and " distinctPerm r "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , Q , M , K , N , A \ < ^ sub > P , A \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , \ < Psi > \ < ^ sub > Q , P ' , Q ' , C ) " in name_list_avoiding )
( auto simp add : eqvts )
obtain q : : " name prm " where " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) "
and " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set A \ < ^ sub > Q ) \ < times > ( set ( q \ < bullet > A \ < ^ sub > Q ) ) "
by ( rule_tac xvec = A \ < ^ sub > Q and c = " ( \ < Psi > , P , Q , K , N , xvec , r \ < bullet > xvec , \ < Psi > \ < ^ sub > Q , A \ < ^ sub > P , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding ) clarsimp
obtain p : : " name prm " where " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) "
and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C " and " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) " and Sp : " ( set p ) \ < subseteq > ( set A \ < ^ sub > P ) \ < times > ( set ( p \ < bullet > A \ < ^ sub > P ) ) "
by ( rule_tac xvec = A \ < ^ sub > P and c = " ( \ < Psi > , P , Q , M , N , xvec , r \ < bullet > xvec , A \ < ^ sub > Q , q \ < bullet > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q , \ < Psi > \ < ^ sub > P , Q ' , P ' , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " by fact
have FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > " by fact
from \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > FrQ \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q "
by ( drule_tac extractFrameFreshChain ) auto
from \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > FrP \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > have " A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P "
by ( drule_tac extractFrameFreshChain ) auto
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q ' \ < close > have " ( r \ < bullet > xvec ) \ < sharp > * ( P ' \ < parallel > Q ' ) "
by simp
with \ < open > cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > Sr
have " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( r \ < bullet > ( P ' \ < parallel > Q ' ) ) " by ( simp add : resChainAlpha residualInject )
hence " cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > ( ( r \ < bullet > P ' ) \ < parallel > ( r \ < bullet > Q ' ) ) "
by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > Sr \ < open > ( r \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " by ( simp add : boundOutputChainAlpha ' ' residualInject )
hence " ( q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close >
by ( rule_tac outputPermFrameSubject ) ( assumption | auto )
hence PTrans : " \ < Psi > \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rhd > P \ < longmapsto > ( q \ < bullet > M ) \ < lparr > \ < nu > * ( r \ < bullet > xvec ) \ < rparr > \ < langle > ( r \ < bullet > N ) \ < rangle > \ < prec > ( r \ < bullet > P ' ) " using Sq \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > Sp \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
have FrP : " extractFrame P = \ < langle > ( p \ < bullet > A \ < ^ sub > P ) , ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > P \ < close > have " distinct ( p \ < bullet > A \ < ^ sub > P ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > Sr \ < open > distinctPerm r \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " by ( rule inputAlpha )
hence " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
by ( rule_tac inputPermFrameSubject ) ( assumption | simp ) +
hence QTrans : " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < rhd > Q \ < longmapsto > ( p \ < bullet > K ) \ < lparr > ( r \ < bullet > N ) \ < rparr > \ < prec > ( r \ < bullet > Q ' ) " using Sp \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
by ( simp add : eqvts )
moreover from \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > Sq \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
have FrQ : " extractFrame Q = \ < langle > ( q \ < bullet > A \ < ^ sub > Q ) , ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < rangle > "
by ( simp add : frameChainAlpha )
moreover from \ < open > distinct A \ < ^ sub > Q \ < close > have " distinct ( q \ < bullet > A \ < ^ sub > Q ) " by simp
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > q \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q ) ) \ < turnstile > ( p \ < bullet > q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > q \ < bullet > K ) "
by ( rule_tac chanEqClosed ) +
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > Sp Sq
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < otimes > ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) \ < turnstile > ( q \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( simp add : eqvts freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > Sq have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * N \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * P ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q \ < close >
moreover from \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * xvec \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * Q ' \ < close > Sr have " ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( q \ < bullet > A \ < ^ sub > Q ) \ < close > Sp Sq have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * N \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > N ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * P ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > P ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q \ < close >
moreover from \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * Q ' \ < close > Sr have " ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > Q ' ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > \ < ^ sub > P ) "
by ( simp add : freshChainSimps )
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > \ < Psi > \ < ^ sub > Q ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * P \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * M \ < close > Sq have " ( r \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > M ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( r \ < bullet > xvec ) \ < sharp > * Q \ < close >
moreover from \ < open > ( r \ < bullet > xvec ) \ < sharp > * A \ < ^ sub > P \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * ( r \ < bullet > xvec ) \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * K \ < close > Sp have " ( r \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) "
by ( simp add : freshChainSimps )
moreover note \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > A \ < ^ sub > Q ) \ < sharp > * C \ < close > \ < open > ( r \ < bullet > xvec ) \ < sharp > * C \ < close >
moreover from \ < open > distinct xvec \ < close > have " distinct ( r \ < bullet > xvec ) " by simp
ultimately show ? thesis by ( rule rComm2 )
next
case ( cOpen P M xvec yvec N P ' x )
from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " distinct ( xvec @ yvec ) " by ( force dest : boundOutputDistinct )
hence " xvec \ < sharp > * yvec " by ( induct xvec ) auto
obtain p where " ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > yvec ) \ < sharp > * P " and " ( p \ < bullet > yvec ) \ < sharp > * M "
and " ( p \ < bullet > yvec ) \ < sharp > * yvec " and " ( p \ < bullet > yvec ) \ < sharp > * N " and " ( p \ < bullet > yvec ) \ < sharp > * P ' "
and " x \ < sharp > ( p \ < bullet > yvec ) " and " ( p \ < bullet > yvec ) \ < sharp > * xvec "
and " ( p \ < bullet > yvec ) \ < sharp > * C " and Sp : " ( set p ) \ < subseteq > ( set yvec ) \ < times > ( set ( p \ < bullet > yvec ) ) "
by ( rule_tac xvec = yvec and c = " ( \ < Psi > , P , M , xvec , yvec , N , P ' , x , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain q where " ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( q \ < bullet > xvec ) \ < sharp > * P " and " ( q \ < bullet > xvec ) \ < sharp > * M "
and " ( q \ < bullet > xvec ) \ < sharp > * xvec " and " ( q \ < bullet > xvec ) \ < sharp > * N " and " ( q \ < bullet > xvec ) \ < sharp > * P ' "
and " x \ < sharp > ( q \ < bullet > xvec ) " and " ( q \ < bullet > xvec ) \ < sharp > * yvec "
and " ( q \ < bullet > xvec ) \ < sharp > * p " and " ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) "
and " ( q \ < bullet > xvec ) \ < sharp > * C " and Sq : " ( set q ) \ < subseteq > ( set xvec ) \ < times > ( set ( q \ < bullet > xvec ) ) "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , P , M , xvec , yvec , p \ < bullet > yvec , N , P ' , x , p , C ) " in name_list_avoiding )
( auto simp add : eqvts fresh_star_prod )
obtain y : : name where " y \ < sharp > P " and " y \ < sharp > C " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " y \ < noteq > x " and " y \ < sharp > N "
and " y \ < sharp > ( q \ < bullet > xvec ) " and " y \ < sharp > ( p \ < bullet > yvec ) " and " y \ < sharp > M " and " y \ < sharp > \ < Psi > " and " y \ < sharp > P ' "
by ( generate_fresh " name " ) ( auto simp add : freshChainSimps )
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > y \ < sharp > P \ < close > have " cP = \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > P ) " by ( simp add : alphaRes )
moreover have " cRs = M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ y # ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
proof -
note \ < open > cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover have " \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > N \ < prec > ' P ' = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > x \ < rparr > ( \ < lparr > \ < nu > * yvec \ < rparr > N \ < prec > ' P ' ) ) " by ( simp add : boundOutputApp )
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > Sp have " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > x \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( p \ < bullet > N ) \ < prec > ' ( p \ < bullet > P ' ) ) ) "
by ( simp add : boundOutputChainAlpha ' ' )
moreover with \ < open > y \ < sharp > N \ < close > \ < open > y \ < sharp > P ' \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp
have " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( [ ( x , y ) ] \ < bullet > p \ < bullet > N ) \ < prec > ' ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) ) ) ) "
by ( subst alphaBoundOutput [ where y = y ] ) ( simp add : freshChainSimps eqvts ) +
moreover hence " \ < dots > = \ < lparr > \ < nu > * xvec \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( ( ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( ( ( x , y ) # p ) \ < bullet > P ' ) ) ) ) "
by simp
moreover from \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > y \ < sharp > xvec \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > Sp Sq
have " \ < dots > = \ < lparr > \ < nu > * ( q \ < bullet > xvec ) \ < rparr > ( \ < lparr > \ < nu > y \ < rparr > ( \ < lparr > \ < nu > * ( p \ < bullet > yvec ) \ < rparr > ( ( q \ < bullet > ( ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( q \ < bullet > ( ( x , y ) # p ) \ < bullet > P ' ) ) ) ) "
apply ( subst boundOutputChainAlpha [ where p = q and xvec = xvec and yvec = " xvec " ] )
defer
apply assumption
apply simp
apply ( simp add : eqvts )
apply ( simp add : eqvts )
apply ( simp add : boundOutputFreshSet ( 4 ) )
apply ( rule conjI )
apply ( simp add : freshChainSimps )
apply ( simp add : freshChainSimps )
done
moreover hence " \ < dots > = \ < lparr > \ < nu > * ( q \ < bullet > xvec @ y # ( p \ < bullet > yvec ) ) \ < rparr > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < prec > ' ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
by ( simp only : pt2 [ OF pt_name_inst ] boundOutputApp BOresChain . simps )
ultimately show ? thesis
by ( simp only : residualInject )
qed
moreover have " \ < Psi > \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ ( x , y ) # p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ ( x , y ) # p ) \ < bullet > P ' ) "
proof -
note \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close >
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * N \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * N " apply ( simp only : eqvts ) apply ( simp only : pt2 [ OF pt_name_inst ] )
by simp
moreover from \ < open > ( p \ < bullet > yvec ) \ < sharp > * P ' \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close > Sp Sq
have " ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < sharp > * P ' " by ( simp del : freshAlphaPerm add : eqvts pt2 [ OF pt_name_inst ] )
moreover from Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have Spq : " set ( q @ p ) \ < subseteq > set ( xvec @ yvec ) \ < times > set ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) "
by ( simp add : pt2 [ OF pt_name_inst ] eqvts ) blast
ultimately have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q @ p ) \ < bullet > ( xvec @ yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) "
apply ( simp only : residualInject )
by ( erule_tac rev_mp ) ( subst boundOutputChainAlpha , auto )
with Sp Sq \ < open > xvec \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * yvec \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * xvec \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] del : freshAlphaPerm )
hence " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > [ ( x , y ) ] \ < bullet > ( M \ < lparr > \ < nu > * ( ( q \ < bullet > xvec ) @ ( p \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( q @ p ) \ < bullet > N ) \ < rangle > \ < prec > ( ( q @ p ) \ < bullet > P ' ) ) "
by ( rule semantics . eqvt )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > M \ < close > \ < open > y \ < sharp > M \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > Sp Sq
show ? thesis
apply ( simp add : eqvts pt2 [ OF pt_name_inst ] )
by ( subst perm_compose [ of q ] , simp ) +
qed
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( q @ ( x , y ) # p ) \ < bullet > x ) \ < in > ( ( q @ ( x , y ) # p ) \ < bullet > ( supp N ) ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > xvec \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > Sp Sq
have " y \ < in > supp ( ( q @ ( x , y ) # p ) \ < bullet > N ) " by ( simp add : pt2 [ OF pt_name_inst ] calc_atm eqvts )
moreover from \ < open > distinct xvec \ < close > have " distinct ( q \ < bullet > xvec ) " by simp
moreover from \ < open > distinct yvec \ < close > have " distinct ( p \ < bullet > yvec ) " by simp
moreover note \ < open > x \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x \ < sharp > \ < Psi > \ < close >
\ < open > ( q \ < bullet > xvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * P \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * M \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > yvec ) \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * P \ < close > \ < open > ( p \ < bullet > yvec ) \ < sharp > * M \ < close > \ < open > y \ < sharp > ( q \ < bullet > xvec ) \ < close > \ < open > y \ < sharp > ( p \ < bullet > yvec ) \ < close > \ < open > y \ < sharp > M \ < close > \ < open > y \ < sharp > C \ < close > \ < open > y \ < sharp > \ < Psi > \ < close >
\ < open > ( p \ < bullet > yvec ) \ < sharp > * C \ < close > \ < open > ( q \ < bullet > xvec ) \ < sharp > * C \ < close >
ultimately show Prop by ( rule_tac rOpen ) ( assumption | simp ) +
next
case ( cScope P \ < alpha > P ' x )
obtain p : : " name prm " where " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < Psi > " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > " and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' " and " x \ < sharp > bn ( p \ < bullet > \ < alpha > ) "
and " distinctPerm p "
and " ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * C " and Sp : " ( set p ) \ < subseteq > set ( bn \ < alpha > ) \ < times > ( set ( bn ( p \ < bullet > \ < alpha > ) ) ) "
by ( rule_tac xvec = " bn \ < alpha > " and c = " ( \ < Psi > , P , \ < alpha > , x , P ' , C ) " in name_list_avoiding ) ( auto simp add : eqvts )
obtain y : : name where " y \ < sharp > \ < Psi > " and " y \ < sharp > P " and " y \ < sharp > ( p \ < bullet > P ' ) " and " y \ < sharp > ( p \ < bullet > \ < alpha > ) " and " y \ < sharp > C "
by ( generate_fresh " name " ) ( auto simp add : freshChainSimps simp del : actionFresh )
from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > distinctPerm p \ < close > have " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , of _ _ p ] ) ( simp add : eqvts )
from \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " distinct ( bn ( p \ < bullet > \ < alpha > ) ) "
by ( subst distinctClosed [ symmetric , of _ p ] ) ( simp add : eqvts )
from \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > \ < open > distinctPerm p \ < close > Sp have " x \ < sharp > ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_bij [ symmetric , of _ _ p ] ) ( simp add : eqvts freshChainSimps )
moreover from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > y \ < sharp > P \ < close > have " cP = \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > P ) " by ( simp add : alphaRes )
moreover from \ < open > cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > x \ < sharp > bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > Sp
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) "
by ( force simp add : residualAlpha )
with \ < open > y \ < sharp > ( p \ < bullet > P ' ) \ < close > have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > y \ < rparr > ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : alphaRes )
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * \ < alpha > \ < close > \ < open > ( bn ( p \ < bullet > \ < alpha > ) ) \ < sharp > * P ' \ < close > Sp
have " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) " by ( force simp add : residualAlpha )
hence " ( [ ( x , y ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > [ ( x , y ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) ) "
by ( rule eqvts )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > x \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > Sp \ < open > distinctPerm p \ < close >
have " \ < Psi > \ < rhd > ( [ ( x , y ) ] \ < bullet > P ) \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( [ ( x , y ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts )
moreover from \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * P \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > y \ < sharp > P \ < close > have " bn ( p \ < bullet > \ < alpha > ) \ < sharp > * ( [ ( x , y ) ] \ < bullet > P ) "
by ( auto simp add : fresh_star_def fresh_left calc_atm ) ( simp add : fresh_def name_list_supp )
moreover from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( p \ < bullet > bn \ < alpha > ) " by simp
hence " distinct ( bn ( p \ < bullet > \ < alpha > ) ) " by ( simp add : eqvts )
ultimately show ? thesis
using \ < open > y \ < sharp > \ < Psi > \ < close > \ < open > y \ < sharp > ( p \ < bullet > \ < alpha > ) \ < close > \ < open > y \ < sharp > C \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < Psi > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * subject ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * C \ < close >
by ( rule_tac rScope )
next
case ( Bang P )
thus ? thesis by ( rule_tac rBang )
qed
nominal_primrec
inputLength : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) psi \ < Rightarrow > nat "
and inputLength ' : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) input \ < Rightarrow > nat "
and inputLength ' ' : : " ( ' a : : fs_name , ' b : : fs_name , ' c : : fs_name ) psiCase \ < Rightarrow > nat "
where
" inputLength ( \ < zero > ) = 0 "
| " inputLength ( M \ < langle > N \ < rangle > . P ) = 0 "
| " inputLength ( M \ < lparr > I ) = inputLength ' I "
| " inputLength ( Case C ) = 0 "
| " inputLength ( P \ < parallel > Q ) = 0 "
| " inputLength ( \ < lparr > \ < nu > x \ < rparr > P ) = 0 "
| " inputLength ( \ < lbrace > \ < Psi > \ < rbrace > ) = 0 "
| " inputLength ( ! P ) = 0 "
| " inputLength ' ( Trm M P ) = 0 "
| " inputLength ' ( \ < nu > y I ) = 1 + ( inputLength ' I ) "
| " inputLength ' ' ( \ < bottom > \ < ^ sub > c ) = 0 "
| " inputLength ' ' ( \ < box > \ < Phi > \ < Rightarrow > P C ) = 0 "
apply ( finite_guess ) +
apply ( rule TrueI ) +
by ( fresh_guess add : fresh_nat ) +
nominal_primrec boundOutputLength : : " ( ' a , ' b , ' c ) boundOutput \ < Rightarrow > nat "
where
" boundOutputLength ( BOut M P ) = 0 "
| " boundOutputLength ( BStep x B ) = ( boundOutputLength B ) + 1 "
apply ( finite_guess ) +
apply ( rule TrueI ) +
by ( fresh_guess add : fresh_nat ) +
nominal_primrec residualLength : : " ( ' a , ' b , ' c ) residual \ < Rightarrow > nat "
where
" residualLength ( RIn M N P ) = 0 "
| " residualLength ( ROut M B ) = boundOutputLength B "
| " residualLength ( RTau P ) = 0 "
by ( rule TrueI ) +
lemma inputLengthProc [ simp ] :
shows " inputLength ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) = length xvec "
by ( induct xvec ) auto
lemma boundOutputLengthSimp [ simp ] :
shows " residualLength ( M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ) = length xvec "
by ( induct xvec ) ( auto simp add : residualInject )
lemma boundOuputLengthSimp2 [ simp ] :
shows " residualLength ( \ < alpha > \ < prec > P ) = length ( bn \ < alpha > ) "
by ( nominal_induct \ < alpha > rule : action . strong_induct , auto ) ( auto simp add : residualInject )
lemmas [ simp del ] = inputLength_inputLength ' _ inputLength ' ' . simps residualLength . simps boundOutputLength . simps
lemma constructPerm :
fixes xvec : : " name list "
and yvec : : " name list "
assumes " length xvec = length yvec "
and " xvec \ < sharp > * yvec "
and " distinct xvec "
and " distinct yvec "
obtains p where " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and " yvec = p \ < bullet > xvec "
proof -
assume " \ < And > p . \ < lbrakk > set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) ; distinctPerm p ; yvec = p \ < bullet > xvec \ < rbrakk > \ < Longrightarrow > thesis "
moreover obtain n where " n = length xvec " by auto
with assms have " \ < exists > p . ( set p ) \ < subseteq > ( set xvec ) \ < times > set ( yvec ) \ < and > distinctPerm p \ < and > yvec = p \ < bullet > xvec "
proof ( induct n arbitrary : xvec yvec )
case ( 0 xvec yvec )
thus ? case by simp
next
case ( Suc n xvec yvec )
from \ < open > Suc n = length xvec \ < close >
obtain x xvec ' where " xvec = x # xvec ' " and " length xvec ' = n "
by ( case_tac xvec ) auto
from \ < open > length xvec = length yvec \ < close > \ < open > xvec = x # xvec ' \ < close >
obtain y yvec ' where " length xvec ' = length yvec ' " and " yvec = y # yvec ' "
by ( case_tac yvec ) auto
from \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close > \ < open > xvec \ < sharp > * yvec \ < close >
have " x \ < noteq > y " and " xvec ' \ < sharp > * yvec ' " and " x \ < sharp > yvec ' " and " y \ < sharp > xvec ' "
by ( auto simp add : fresh_list_cons )
from \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close > have " x \ < sharp > xvec ' " and " y \ < sharp > yvec ' " and " distinct xvec ' " and " distinct yvec ' "
by simp +
from \ < open > Suc n = length xvec \ < close > \ < open > xvec = x # xvec ' \ < close > have " n = length xvec ' " by simp
with \ < open > length xvec ' = length yvec ' \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > distinct xvec ' \ < close > \ < open > distinct yvec ' \ < close >
obtain p where S : " set p \ < subseteq > set xvec ' \ < times > set yvec ' " and " distinctPerm p " and " yvec ' = p \ < bullet > xvec ' "
by ( drule_tac Suc ) auto
from S have " set ( ( x , y ) # p ) \ < subseteq > set ( x # xvec ' ) \ < times > set ( y # yvec ' ) " by auto
moreover from \ < open > x \ < sharp > xvec ' \ < close > \ < open > x \ < sharp > yvec ' \ < close > \ < open > y \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > yvec ' \ < close > S have " x \ < sharp > p " and " y \ < sharp > p "
apply ( induct p )
by ( auto simp add : fresh_list_nil fresh_list_cons fresh_prod name_list_supp ) ( auto simp add : fresh_def )
with S \ < open > distinctPerm p \ < close > \ < open > x \ < noteq > y \ < close > have " distinctPerm ( ( x , y ) # p ) " by auto
moreover from \ < open > yvec ' = p \ < bullet > xvec ' \ < close > \ < open > x \ < sharp > p \ < close > \ < open > y \ < sharp > p \ < close > \ < open > x \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > xvec ' \ < close > have " ( y # yvec ' ) = ( ( x , y ) # p ) \ < bullet > ( x # xvec ' ) "
by ( simp add : calc_atm freshChainSimps )
ultimately show ? case using \ < open > xvec = x # xvec ' \ < close > \ < open > yvec = y # yvec ' \ < close >
by blast
qed
ultimately show ? thesis by blast
qed
lemma distinctApend [ simp ] :
fixes xvec : : " name list "
and yvec : : " name list "
shows " ( set xvec \ < inter > set yvec = { } ) = xvec \ < sharp > * yvec "
by ( auto simp add : fresh_star_def name_list_supp fresh_def )
lemma lengthAux :
fixes xvec : : " name list "
and y : : name
and yvec : : " name list "
assumes " length xvec = length ( y # yvec ) "
obtains z zvec where " xvec = z # zvec " and " length zvec = length yvec "
using assms
by ( induct xvec arbitrary : yvec y ) auto
lemma lengthAux2 :
fixes xvec : : " name list "
and yvec : : " name list "
and zvec : : " name list "
assumes " length xvec = length ( yvec @ y # zvec ) "
obtains xvec1 x xvec2 where " xvec = xvec1 @ x # xvec2 " and " length xvec1 = length yvec " and " length xvec2 = length zvec "
proof -
assume " \ < And > xvec1 x xvec2 .
\ < lbrakk > xvec = xvec1 @ x # xvec2 ; length xvec1 = length yvec ;
length xvec2 = length zvec \ < rbrakk >
\ < Longrightarrow > thesis "
moreover from assms have " \ < exists > xvec1 x xvec2 . xvec = xvec1 @ x # xvec2 \ < and > length xvec1 = length yvec \ < and > length xvec2 = length zvec "
apply ( rule_tac x = " take ( length yvec ) xvec " in exI )
apply ( rule_tac x = " hd ( drop ( length yvec ) xvec ) " in exI )
apply ( rule_tac x = " tl ( drop ( length yvec ) xvec ) " in exI )
by auto
ultimately show ? thesis by blast
qed
lemma semanticsCases [ consumes 11 , case_names cInput cCase cPar1 cPar2 cComm1 cComm2 cScope cBang ] :
fixes \ < Psi > : : ' b
and cP : : " ( ' a , ' b , ' c ) psi "
and cRs : : " ( ' a , ' b , ' c ) residual "
and C : : " ' d : : fs_name "
and x1 : : name
and x2 : : name
and xvec1 : : " name list "
and xvec2 : : " name list "
and xvec3 : : " name list "
and xvec4 : : " name list "
and xvec5 : : " name list "
assumes " \ < Psi > \ < rhd > cP \ < longmapsto > cRs "
and " length xvec1 = inputLength cP " and " distinct xvec1 "
and " length xvec2 = residualLength cRs " and " distinct xvec2 "
and " length xvec3 = residualLength cRs " and " distinct xvec3 "
and " length xvec4 = residualLength cRs " and " distinct xvec4 "
and " length xvec5 = residualLength cRs " and " distinct xvec5 "
and rInput : " \ < And > M K N Tvec P . ( \ < lbrakk > xvec1 \ < sharp > * \ < Psi > ; xvec1 \ < sharp > * cP ; xvec1 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow > cP = M \ < lparr > \ < lambda > * xvec1 N \ < rparr > . P \ < and > cRs = K \ < lparr > ( N [ xvec1 : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec1 : : = Tvec ] \ < and >
\ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < and > distinct xvec1 \ < and > set xvec1 \ < subseteq > supp N \ < and > length xvec1 = length Tvec \ < and >
xvec1 \ < sharp > * Tvec \ < and > xvec1 \ < sharp > * \ < Psi > \ < and > xvec1 \ < sharp > * M \ < and > xvec1 \ < sharp > * K ) \ < Longrightarrow > Prop "
and rOutput : " \ < And > M K N P . \ < lbrakk > cP = M \ < langle > N \ < rangle > . P ; cRs = K \ < langle > N \ < rangle > \ < prec > P ; \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < rbrakk > \ < Longrightarrow > Prop "
and rCase : " \ < And > Cs P \ < phi > . \ < lbrakk > cP = Cases Cs ; \ < Psi > \ < rhd > P \ < longmapsto > cRs ; ( \ < phi > , P ) mem Cs ; \ < Psi > \ < turnstile > \ < phi > ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
and rPar1 : " \ < And > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q . ( \ < lbrakk > xvec2 \ < sharp > * \ < Psi > ; xvec2 \ < sharp > * cP ; xvec2 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow >
cP = P \ < parallel > Q \ < and > cRs = \ < alpha > \ < prec > ( P ' \ < parallel > Q ) \ < and > xvec2 = bn \ < alpha > \ < and >
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < and > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < and > distinct A \ < ^ sub > Q \ < and >
A \ < ^ sub > Q \ < sharp > * P \ < and > A \ < ^ sub > Q \ < sharp > * Q \ < and > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < and > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < and > A \ < ^ sub > Q \ < sharp > * P ' \ < and > A \ < ^ sub > Q \ < sharp > * C ) \ < Longrightarrow > Prop "
and rPar2 : " \ < And > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P . ( \ < lbrakk > xvec3 \ < sharp > * \ < Psi > ; xvec3 \ < sharp > * cP ; xvec3 \ < sharp > * cRs \ < rbrakk > \ < Longrightarrow >
cP = P \ < parallel > Q \ < and > cRs = \ < alpha > \ < prec > ( P \ < parallel > Q ' ) \ < and > xvec3 = bn \ < alpha > \ < and >
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < and > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < and > distinct A \ < ^ sub > P \ < and >
A \ < ^ sub > P \ < sharp > * P \ < and > A \ < ^ sub > P \ < sharp > * Q \ < and > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < and > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < and > A \ < ^ sub > P \ < sharp > * Q ' \ < and > A \ < ^ sub > P \ < sharp > * C ) \ < Longrightarrow > Prop "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q .
\ < lbrakk > cP = P \ < parallel > Q ; cRs = \ < tau > \ < prec > \ < lparr > \ < nu > * xvec \ < rparr > P ' \ < parallel > Q ' ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ;
A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ;
A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * xvec ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * Q ;
xvec \ < sharp > * K ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * C ; xvec \ < sharp > * C ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop "
and rOpen : " \ < And > P M xvec y yvec N P ' .
( \ < lbrakk > xvec4 \ < sharp > * \ < Psi > ; xvec4 \ < sharp > * cP ; xvec4 \ < sharp > * cRs ; x1 \ < sharp > \ < Psi > ; x1 \ < sharp > cP ; x1 \ < sharp > cRs ; x1 \ < sharp > xvec4 \ < rbrakk > \ < Longrightarrow >
cP = \ < lparr > \ < nu > x1 \ < rparr > P \ < and > cRs = M \ < lparr > \ < nu > * ( xvec @ x1 # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < and > xvec4 = xvec @ y # yvec \ < and >
\ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < and > x1 \ < in > supp N \ < and > x1 \ < sharp > xvec \ < and > x1 \ < sharp > yvec \ < and >
distinct xvec \ < and > distinct yvec \ < and > xvec \ < sharp > * \ < Psi > \ < and > xvec \ < sharp > * P \ < and > xvec \ < sharp > * M \ < and > xvec \ < sharp > * yvec \ < and >
yvec \ < sharp > * \ < Psi > \ < and > yvec \ < sharp > * P \ < and > yvec \ < sharp > * M ) \ < Longrightarrow > Prop "
and rScope : " \ < And > P \ < alpha > P ' . ( \ < lbrakk > xvec5 \ < sharp > * \ < Psi > ; xvec5 \ < sharp > * cP ; xvec5 \ < sharp > * cRs ; x2 \ < sharp > \ < Psi > ; x2 \ < sharp > cP ; x2 \ < sharp > cRs ; x2 \ < sharp > xvec5 \ < rbrakk > \ < Longrightarrow >
cP = \ < lparr > \ < nu > x2 \ < rparr > P \ < and > cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x2 \ < rparr > P ' \ < and > xvec5 = bn \ < alpha > \ < and >
\ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < and > x2 \ < sharp > \ < Psi > \ < and > x2 \ < sharp > \ < alpha > \ < and > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < and > distinct ( bn \ < alpha > ) ) \ < Longrightarrow > Prop "
and rBang : " \ < And > P . \ < lbrakk > cP = ! P ; \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > cRs ; guarded P \ < rbrakk > \ < Longrightarrow > Prop "
shows Prop
using \ < open > \ < Psi > \ < rhd > cP \ < longmapsto > cRs \ < close >
proof ( cases rule : semanticsCasesAux [ where C = " ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) " ] )
case ( cInput M K xvec N Tvec P )
have B : " cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P " and C : " cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > ( P [ xvec : : = Tvec ] ) "
by fact +
from \ < open > xvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " xvec \ < sharp > * xvec1 " by simp
from \ < open > length xvec1 = inputLength cP \ < close > B have " length xvec1 = length xvec "
by simp
then obtain p where S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and " xvec1 = p \ < bullet > xvec "
using \ < open > xvec \ < sharp > * xvec1 \ < close > \ < open > distinct xvec \ < close > \ < open > distinct xvec1 \ < close >
by ( rule_tac constructPerm [ where xvec = xvec and yvec = xvec1 ] ) auto
show ? thesis
proof ( rule rInput [ where M = M and K = K and N = " p \ < bullet > N " and Tvec = Tvec and P = " p \ < bullet > P " ] , goal_cases )
case 1
from B \ < open > xvec \ < sharp > * xvec1 \ < close > \ < open > xvec1 \ < sharp > * cP \ < close > have " xvec1 \ < sharp > * N " and " xvec1 \ < sharp > * P "
by ( auto simp add : fresh_star_def inputChainFresh name_list_supp ) ( auto simp add : fresh_def )
from \ < open > cP = M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < close > S \ < open > xvec1 \ < sharp > * N \ < close > \ < open > xvec1 \ < sharp > * P \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close >
have " cP = M \ < lparr > \ < lambda > * xvec1 ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) "
apply simp
by ( subst inputChainAlpha ) auto
moreover from \ < open > cRs = K \ < lparr > ( N [ xvec : : = Tvec ] ) \ < rparr > \ < prec > P [ xvec : : = Tvec ] \ < close > S \ < open > xvec1 \ < sharp > * N \ < close > \ < open > xvec1 \ < sharp > * P \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > \ < open > length xvec = length Tvec \ < close > \ < open > distinctPerm p \ < close >
have " cRs = K \ < lparr > ( ( p \ < bullet > N ) [ xvec1 : : = Tvec ] ) \ < rparr > \ < prec > ( p \ < bullet > P ) [ xvec1 : : = Tvec ] "
by ( simp add : renaming substTerm . renaming )
moreover note \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close >
moreover from \ < open > distinct xvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " distinct xvec1 " by simp
moreover from \ < open > set xvec \ < subseteq > supp N \ < close > have " ( p \ < bullet > set xvec ) \ < subseteq > ( p \ < bullet > ( supp N ) ) "
by ( simp add : eqvts )
with \ < open > xvec1 = p \ < bullet > xvec \ < close > have " set xvec1 \ < subseteq > supp ( p \ < bullet > N ) " by ( simp add : eqvts )
moreover from \ < open > length xvec = length Tvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " length xvec1 = length Tvec "
by simp
moreover from \ < open > xvec1 \ < sharp > * cRs \ < close > C \ < open > length xvec = length Tvec \ < close > \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close >
have " ( set xvec1 ) \ < sharp > * Tvec "
by ( rule_tac substTerm . subst3Chain [ where T = N ] ) auto
hence " xvec1 \ < sharp > * Tvec " by simp
moreover from \ < open > xvec \ < sharp > * Tvec \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > Tvec ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * Tvec \ < close > \ < open > xvec1 \ < sharp > * Tvec \ < close > \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * Tvec " by simp
moreover from \ < open > xvec \ < sharp > * M \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > M ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec1 \ < sharp > * cP \ < close > B \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * M " by simp
moreover from \ < open > xvec \ < sharp > * K \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > K ) " by ( simp add : fresh_star_bij )
with S \ < open > xvec \ < sharp > * K \ < close > \ < open > xvec1 \ < sharp > * cRs \ < close > C \ < open > xvec1 = p \ < bullet > xvec \ < close > have " xvec1 \ < sharp > * K " by simp
ultimately show ? case using \ < open > xvec1 \ < sharp > * \ < Psi > \ < close > by blast
qed
next
case ( cOutput M K N P )
thus ? thesis by ( rule rOutput )
next
case ( cCase Cs P \ < phi > )
thus ? thesis by ( rule rCase )
next
case ( cPar1 \ < Psi > \ < ^ sub > Q P \ < alpha > P ' Q A \ < ^ sub > Q )
have B : " cP = P \ < parallel > Q " and C : " cRs = \ < alpha > \ < prec > P ' \ < parallel > Q "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec2 " by simp
from \ < open > A \ < ^ sub > Q \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " A \ < ^ sub > Q \ < sharp > * xvec2 " and " A \ < ^ sub > Q \ < sharp > * C " by simp +
from \ < open > length xvec2 = residualLength cRs \ < close > C have " length xvec2 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec2 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec2 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec2 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rPar1 [ where P = P and Q = Q and \ < alpha > = " p \ < bullet > \ < alpha > " and P ' = " p \ < bullet > P ' " and A \ < ^ sub > Q = A \ < ^ sub > Q and \ < Psi > \ < ^ sub > Q = \ < Psi > \ < ^ sub > Q ] , goal_cases )
case 1
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > xvec2 \ < sharp > * cRs \ < close > \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec2 \ < sharp > * cP \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) \ < parallel > Q "
apply auto
by ( subst residualAlpha [ where p = p ] ) auto
moreover note \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close >
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec2 \ < close > \ < open > xvec2 \ < sharp > * cRs \ < close > \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec2 \ < sharp > * cP \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
moreover note \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close >
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec2 \ < close > S \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > Q \ < sharp > * ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover from \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec2 \ < close > S \ < open > xvec2 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > Q \ < sharp > * ( p \ < bullet > P ' ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover note \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
ultimately show ? case by blast
qed
next
case ( cPar2 \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' P A \ < ^ sub > P )
have B : " cP = P \ < parallel > Q " and C : " cRs = \ < alpha > \ < prec > P \ < parallel > Q ' "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec3 " by simp
from \ < open > A \ < ^ sub > P \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " A \ < ^ sub > P \ < sharp > * xvec3 " and " A \ < ^ sub > P \ < sharp > * C " by simp +
from \ < open > length xvec3 = residualLength cRs \ < close > C have " length xvec3 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec3 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec3 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec3 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rPar2 [ where P = P and Q = Q and \ < alpha > = " p \ < bullet > \ < alpha > " and Q ' = " p \ < bullet > Q ' " and A \ < ^ sub > P = A \ < ^ sub > P and \ < Psi > \ < ^ sub > P = \ < Psi > \ < ^ sub > P ] , goal_cases )
case 1
note \ < open > cP = P \ < parallel > Q \ < close >
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > xvec3 \ < sharp > * cRs \ < close > \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec3 \ < sharp > * cP \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > P \ < parallel > ( p \ < bullet > Q ' ) "
apply auto
by ( subst residualAlpha [ where p = p ] ) auto
moreover note \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close >
moreover from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec3 \ < close > \ < open > xvec3 \ < sharp > * cRs \ < close > \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec3 \ < sharp > * cP \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > Q ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
moreover note \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
moreover from \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec3 \ < close > S \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > P \ < sharp > * ( p \ < bullet > \ < alpha > ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover from \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec3 \ < close > S \ < open > xvec3 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > distinctPerm p \ < close > have " A \ < ^ sub > P \ < sharp > * ( p \ < bullet > Q ' ) "
by ( subst fresh_star_bij [ symmetric , where pi = p ] ) simp
moreover note \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
ultimately show ? case by blast
qed
next
case ( cComm1 \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K xvec Q ' A \ < ^ sub > Q )
thus ? thesis by ( rule_tac rComm1 [ where P = P and Q = Q ] ) ( assumption | simp ) +
next
case ( cComm2 \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P Q K Q ' A \ < ^ sub > Q )
thus ? thesis by ( rule_tac rComm2 [ where P = P and Q = Q ] ) ( assumption | simp ) +
next
case ( cOpen P M xvec yvec N P ' x )
have B : " cP = \ < lparr > \ < nu > x \ < rparr > P " and C : " cRs = M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
by fact +
from \ < open > xvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " xvec \ < sharp > * xvec4 " and " xvec \ < sharp > * cP " and " xvec \ < sharp > * cRs " and " x1 \ < sharp > xvec " by simp +
from \ < open > x \ < sharp > ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " x \ < sharp > xvec4 " and " x \ < sharp > cP " and " x \ < sharp > cRs " and " x \ < noteq > x1 " by simp +
from \ < open > yvec \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " yvec \ < sharp > * xvec4 " and " yvec \ < sharp > * cP " and " yvec \ < sharp > * cRs " and " x1 \ < sharp > yvec " by simp +
from \ < open > xvec \ < sharp > * cRs \ < close > \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > C have " ( xvec @ x # yvec ) \ < sharp > * M " by simp
from \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( xvec @ x # yvec ) \ < sharp > * \ < Psi > " by simp
from \ < open > length xvec4 = residualLength cRs \ < close > C obtain xvec ' y yvec ' where D : " xvec4 = xvec ' @ y # yvec ' " and " length xvec ' = length xvec " and " length yvec ' = length yvec "
by ( rule_tac lengthAux2 ) auto
with \ < open > distinct xvec \ < close > \ < open > distinct yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > distinct xvec4 \ < close >
have " distinct xvec ' " and " distinct yvec ' " and " xvec ' \ < sharp > * yvec ' " and " x \ < noteq > y " and " y \ < sharp > xvec ' " and " y \ < sharp > yvec ' "
and " x \ < sharp > xvec ' " and " x \ < sharp > yvec ' " and " y \ < sharp > xvec " and " y \ < sharp > yvec " and " xvec \ < sharp > * xvec ' " and " yvec \ < sharp > * yvec ' "
by auto
from \ < open > length xvec ' = length xvec \ < close > \ < open > xvec \ < sharp > * xvec ' \ < close > \ < open > distinct xvec \ < close > \ < open > distinct xvec ' \ < close >
obtain p where Sp : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) " and " distinctPerm p " and E : " xvec ' = p \ < bullet > xvec "
by ( metis constructPerm )
from \ < open > length yvec ' = length yvec \ < close > \ < open > yvec \ < sharp > * yvec ' \ < close > \ < open > distinct yvec \ < close > \ < open > distinct yvec ' \ < close >
obtain q where Sq : " set q \ < subseteq > set yvec \ < times > set ( q \ < bullet > yvec ) " and " distinctPerm q " and F : " yvec ' = q \ < bullet > yvec "
by ( metis constructPerm )
show ? thesis
proof ( rule rOpen [ where P = " ( [ ( x , x1 ) ] \ < bullet > P ) " and xvec = " p \ < bullet > xvec " and y = " y " and yvec = " q \ < bullet > yvec " and N = " ( p @ ( x1 , x ) # q ) \ < bullet > N " and P ' = " ( p @ ( x1 , x ) # q ) \ < bullet > P ' " and M = M ] , goal_cases )
case 1
from \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > D E F
have " x \ < noteq > y " and " x1 \ < noteq > y " and " x1 \ < sharp > p \ < bullet > xvec " and " x1 \ < sharp > q \ < bullet > yvec " by simp +
from \ < open > xvec4 \ < sharp > * cRs \ < close > \ < open > x1 \ < sharp > cRs \ < close > C have " xvec4 \ < sharp > * M " and " x1 \ < sharp > M " by simp +
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x \ < sharp > cP \ < close > \ < open > x \ < noteq > x1 \ < close > have " ( [ ( x , x1 ) ] \ < bullet > cP ) = [ ( x , x1 ) ] \ < bullet > \ < lparr > \ < nu > x \ < rparr > P "
by simp
with \ < open > x \ < sharp > cP \ < close > \ < open > x1 \ < sharp > cP \ < close > have " cP = \ < lparr > \ < nu > x1 \ < rparr > ( [ ( x , x1 ) ] \ < bullet > P ) " by ( simp add : eqvts calc_atm )
moreover from C have " ( ( p @ ( x1 , x ) # q ) \ < bullet > cRs ) = ( p @ ( x1 , x ) # q ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ x # yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) " by ( simp add : fresh_star_bij )
with Sp Sq \ < open > xvec4 \ < sharp > * cRs \ < close > D E F \ < open > xvec \ < sharp > * cRs \ < close > \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > \ < open > xvec4 \ < sharp > * M \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec \ < sharp > * yvec \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > y \ < sharp > xvec ' \ < close > \ < open > y \ < sharp > yvec ' \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > x1 \ < noteq > y \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > x1 \ < sharp > M \ < close >
have " cRs = M \ < lparr > \ < nu > * ( ( p \ < bullet > xvec ) @ x1 # ( q \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt2 [ OF pt_name_inst ] calc_atm )
moreover from D E F have " xvec4 = ( p \ < bullet > xvec ) @ y # ( q \ < bullet > yvec ) " by simp
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > have " ( ( p @ ( x1 , x ) # q ) \ < bullet > \ < Psi > ) \ < rhd > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ) \ < longmapsto > ( ( p @ ( x1 , x ) # q ) \ < bullet > ( M \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ) ) "
by ( intro eqvts )
with Sp Sq B C D E F \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * \ < Psi > \ < close > \ < open > xvec4 \ < sharp > * cRs \ < close > \ < open > x \ < sharp > xvec4 \ < close > C D \ < open > x \ < sharp > cRs \ < close > \ < open > yvec \ < sharp > * cRs \ < close > \ < open > xvec4 \ < sharp > * M \ < close > \ < open > ( xvec @ x # yvec ) \ < sharp > * M \ < close > \ < open > x \ < sharp > M \ < close > \ < open > x1 \ < sharp > cRs \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x1 \ < sharp > \ < Psi > \ < close > \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > x \ < noteq > x1 \ < close > \ < open > xvec \ < sharp > * yvec \ < close >
have " \ < Psi > \ < rhd > ( [ ( x , x1 ) ] \ < bullet > P ) \ < longmapsto > M \ < lparr > \ < nu > * ( ( p \ < bullet > xvec ) @ ( q \ < bullet > yvec ) ) \ < rparr > \ < langle > ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) \ < rangle > \ < prec > ( ( p @ ( x1 , x ) # q ) \ < bullet > P ' ) "
by ( simp add : eqvts pt_fresh_bij [ OF pt_name_inst , OF at_name_inst ] pt2 [ OF pt_name_inst ] name_swap )
moreover from \ < open > x \ < in > supp N \ < close > have " ( ( p @ ( x1 , x ) # q ) \ < bullet > x ) \ < in > ( ( p @ ( x1 , x ) # q ) \ < bullet > supp N ) "
by ( simp add : pt_set_bij [ OF pt_name_inst , OF at_name_inst ] )
hence " x1 \ < in > supp ( ( p @ ( x1 , x ) # q ) \ < bullet > N ) "
using \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > \ < open > x1 \ < sharp > xvec \ < close > \ < open > x1 \ < sharp > yvec \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > \ < open > xvec \ < sharp > * xvec4 \ < close > \ < open > yvec \ < sharp > * xvec4 \ < close > \ < open > xvec ' \ < sharp > * yvec ' \ < close > D E F Sp Sq \ < open > x \ < noteq > x1 \ < close >
by ( simp add : eqvts pt2 [ OF pt_name_inst ] calc_atm )
moreover from \ < open > x1 \ < sharp > xvec4 \ < close > D E F have " x1 \ < sharp > ( p \ < bullet > xvec ) " and " x1 \ < sharp > ( q \ < bullet > yvec ) " by simp +
moreover from \ < open > distinct xvec ' \ < close > \ < open > distinct yvec ' \ < close > E F have " distinct ( p \ < bullet > xvec ) " and " distinct ( q \ < bullet > yvec ) " by simp +
moreover from \ < open > xvec ' \ < sharp > * yvec ' \ < close > E F have " ( p \ < bullet > xvec ) \ < sharp > * ( q \ < bullet > yvec ) " by auto
moreover from \ < open > xvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * ( p \ < bullet > \ < Psi > ) " by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with Sp D E \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " by ( simp add : eqvts )
moreover from \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( p \ < bullet > yvec ) \ < sharp > * ( p \ < bullet > \ < Psi > ) " by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with Sq D F \ < open > xvec4 \ < sharp > * \ < Psi > \ < close > \ < open > yvec \ < sharp > * \ < Psi > \ < close > have " ( q \ < bullet > yvec ) \ < sharp > * \ < Psi > " by ( simp add : eqvts )
moreover from \ < open > xvec4 \ < sharp > * cP \ < close > \ < open > x \ < sharp > xvec4 \ < close > \ < open > x1 \ < sharp > xvec4 \ < close > B D E F have " ( p \ < bullet > xvec ) \ < sharp > * ( [ ( x , x1 ) ] \ < bullet > P ) " and " ( q \ < bullet > yvec ) \ < sharp > * ( [ ( x , x1 ) ] \ < bullet > P ) "
by simp +
moreover from \ < open > xvec4 \ < sharp > * M \ < close > C D E F have " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( q \ < bullet > yvec ) \ < sharp > * M " by simp +
ultimately show ? case
by blast
qed
next
case ( cScope P \ < alpha > P ' x )
have B : " cP = \ < lparr > \ < nu > x \ < rparr > P " and C : " cRs = \ < alpha > \ < prec > \ < lparr > \ < nu > x \ < rparr > P ' "
by fact +
from \ < open > bn \ < alpha > \ < sharp > * ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " bn \ < alpha > \ < sharp > * xvec5 " and " x2 \ < sharp > bn \ < alpha > " by simp +
from \ < open > x \ < sharp > ( xvec1 , xvec2 , xvec3 , xvec4 , xvec5 , x1 , x2 , cP , cRs , C ) \ < close > have " x \ < sharp > xvec5 " and " x \ < noteq > x2 " and " x \ < sharp > cRs " by simp +
from \ < open > length xvec5 = residualLength cRs \ < close > C have " length xvec5 = length ( bn \ < alpha > ) "
by simp
then obtain p where S : " set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) " and " distinctPerm p " and " xvec5 = bn ( p \ < bullet > \ < alpha > ) "
using \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close > \ < open > distinct xvec5 \ < close >
by ( rule_tac constructPerm [ where xvec = " bn \ < alpha > " and yvec = xvec5 ] ) ( auto simp add : eqvts )
show ? thesis
proof ( rule rScope [ where P = " [ ( x , x2 ) ] \ < bullet > P " and \ < alpha > = " [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > " and P ' = " [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' " ] , goal_cases )
case 1
from \ < open > x2 \ < sharp > cRs \ < close > C \ < open > x2 \ < sharp > bn \ < alpha > \ < close > \ < open > x \ < noteq > x2 \ < close > have " x2 \ < sharp > \ < alpha > " and " x2 \ < sharp > P ' " by ( auto simp add : abs_fresh )
from \ < open > cP = \ < lparr > \ < nu > x \ < rparr > P \ < close > \ < open > x2 \ < sharp > cP \ < close > \ < open > x \ < noteq > x2 \ < close > have " cP = \ < lparr > \ < nu > x2 \ < rparr > ( [ ( x , x2 ) ] \ < bullet > P ) "
by ( simp add : alphaRes abs_fresh )
moreover from B C S \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > xvec5 \ < sharp > * cRs \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec5 \ < sharp > * cP \ < close > \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > xvec5 \ < close >
have " cRs = ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) "
apply auto
by ( subst residualAlpha [ where p = p ] alphaRes ) ( auto simp del : actionFresh )
hence " ( [ ( x , x2 ) ] \ < bullet > cRs ) = [ ( x , x2 ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x \ < rparr > ( p \ < bullet > P ' ) ) "
by simp
with \ < open > x2 \ < sharp > cRs \ < close > \ < open > x \ < sharp > cRs \ < close > have " cRs = ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < prec > \ < lparr > \ < nu > x2 \ < rparr > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts calc_atm )
moreover from \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > have " ( [ ( x , x2 ) ] \ < bullet > xvec5 ) = ( [ ( x , x2 ) ] \ < bullet > bn ( p \ < bullet > \ < alpha > ) ) "
by simp
with \ < open > x \ < sharp > xvec5 \ < close > \ < open > x2 \ < sharp > xvec5 \ < close > have " xvec5 = bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) "
by ( simp add : eqvts )
moreover from \ < open > \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' \ < close > S B C S \ < open > bn \ < alpha > \ < sharp > * xvec5 \ < close > \ < open > xvec5 \ < sharp > * cRs \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > xvec5 \ < sharp > * cP \ < close > \ < open > x \ < sharp > xvec5 \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) "
by ( subst residualAlpha [ symmetric ] ) auto
hence " ( [ ( x , x2 ) ] \ < bullet > \ < Psi > ) \ < rhd > ( [ ( x , x2 ) ] \ < bullet > P ) \ < longmapsto > ( [ ( x , x2 ) ] \ < bullet > ( ( p \ < bullet > \ < alpha > ) \ < prec > ( p \ < bullet > P ' ) ) ) "
by ( rule eqvt )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x2 \ < sharp > \ < Psi > \ < close > have " \ < Psi > \ < rhd > ( [ ( x , x2 ) ] \ < bullet > P ) \ < longmapsto > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < prec > ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > P ' ) "
by ( simp add : eqvts )
moreover note \ < open > x2 \ < sharp > \ < Psi > \ < close >
moreover from \ < open > x \ < sharp > \ < alpha > \ < close > \ < open > x2 \ < sharp > \ < alpha > \ < close > \ < open > x \ < sharp > xvec5 \ < close > \ < open > x2 \ < sharp > xvec5 \ < close > S \ < open > x \ < noteq > x2 \ < close > \ < open > xvec5 = bn ( p \ < bullet > \ < alpha > ) \ < close > have " x2 \ < sharp > [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > "
apply ( subgoal_tac " x \ < sharp > p \ < and > x2 \ < sharp > p " )
apply ( simp add : perm_compose freshChainSimps del : actionFresh )
by ( auto dest : freshAlphaSwap )
moreover from \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > have " ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( bn \ < alpha > ) ) \ < sharp > * ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( subject \ < alpha > ) ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
hence " bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) \ < sharp > * subject ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) "
by ( simp add : eqvts )
moreover from \ < open > distinct ( bn \ < alpha > ) \ < close > have " distinct ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > ( bn \ < alpha > ) ) " by simp
hence " distinct ( bn ( [ ( x , x2 ) ] \ < bullet > p \ < bullet > \ < alpha > ) ) " by ( simp add : eqvts )
ultimately show ? case by blast
qed
next
case ( cBang P )
thus ? thesis by ( rule_tac rBang ) auto
qed
lemma parCases [ consumes 5 , case_names cPar1 cPar2 cComm1 cComm2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and T : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > T "
and " bn \ < alpha > \ < sharp > * \ < Psi > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P \ < parallel > Q ' ) "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
shows " Prop \ < alpha > T "
proof -
from Trans have " distinct ( bn \ < alpha > ) " by ( auto dest : boundOutputDistinct )
have " length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) " by simp
note Trans
moreover have " length [ ] = inputLength ( P \ < parallel > Q ) " and " distinct [ ] "
by ( auto simp add : inputLength_inputLength ' _ inputLength ' ' . simps )
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > T ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover obtain x : : name where " x \ < sharp > \ < Psi > " and " x \ < sharp > P " and " x \ < sharp > Q " and " x \ < sharp > \ < alpha > " and " x \ < sharp > T "
by ( generate_fresh " name " ) auto
ultimately show ? thesis using \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close >
apply ( cases rule : semanticsCases [ of _ _ _ _ _ _ _ _ _ C x x ] )
apply ( auto simp add : psi . inject )
apply ( force simp add : residualInject residualInject ' intro : rPar1 )
apply ( force simp add : residualInject residualInject ' intro : rPar2 )
apply ( fastforce simp add : residualInject residualInject ' intro : rComm1 )
by ( fastforce simp add : residualInject residualInject ' intro : rComm2 )
qed
lemma parInputCases [ consumes 1 , case_names cPar1 cPar2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > R "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop ( P \ < parallel > Q ' ) "
shows " Prop R "
proof -
from Trans obtain \ < alpha > where " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R " and " bn \ < alpha > \ < sharp > * \ < Psi > " and " bn \ < alpha > \ < sharp > * P " and " bn \ < alpha > \ < sharp > * Q " and " bn \ < alpha > \ < sharp > * subject \ < alpha > " and " \ < alpha > = M \ < lparr > N \ < rparr > " by auto
thus ? thesis using rPar1 rPar2
by ( induct rule : parCases ) ( auto simp add : residualInject )
qed
lemma parOutputCases [ consumes 5 , case_names cPar1 cPar2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > R "
and " xvec \ < sharp > * \ < Psi > "
and " xvec \ < sharp > * P "
and " xvec \ < sharp > * Q "
and " xvec \ < sharp > * M "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * C ; A \ < ^ sub > Q \ < sharp > * xvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * C ; A \ < ^ sub > P \ < sharp > * xvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( P \ < parallel > Q ' ) "
shows " Prop R "
proof -
from Trans have " distinct xvec " by ( auto dest : boundOutputDistinct )
obtain \ < alpha > where " \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " by simp
with Trans \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * M \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R " and " bn \ < alpha > \ < sharp > * \ < Psi > " and " bn \ < alpha > \ < sharp > * P " and " bn \ < alpha > \ < sharp > * Q " " bn \ < alpha > \ < sharp > * subject \ < alpha > "
by simp +
thus ? thesis using \ < open > \ < alpha > = M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < close > rPar1 rPar2 \ < open > distinct xvec \ < close >
by ( induct rule : parCases [ where C = " ( xvec , C ) " ] ) ( auto simp add : residualInject )
qed
lemma theEqvt [ eqvt_force ] :
fixes p : : " name prm "
and \ < alpha > : : " ' a action "
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " ( p \ < bullet > the ( subject \ < alpha > ) ) = the ( p \ < bullet > ( subject \ < alpha > ) ) "
using assms
by ( induct rule : actionCases [ where \ < alpha > = \ < alpha > ] ) auto
lemma theSubjectFresh [ simp ] :
fixes \ < alpha > : : " ' a action "
and x : : name
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " x \ < sharp > the ( subject \ < alpha > ) = x \ < sharp > subject \ < alpha > "
using assms
by ( cases rule : actionCases ) auto
lemma theSubjectFreshChain [ simp ] :
fixes \ < alpha > : : " ' a action "
and xvec : : " name list "
assumes " \ < alpha > \ < noteq > \ < tau > "
shows " xvec \ < sharp > * the ( subject \ < alpha > ) = xvec \ < sharp > * subject \ < alpha > "
using assms
by ( cases rule : actionCases ) auto
lemma obtainPrefix :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
and B : : " name list "
assumes " \ < Psi > \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " distinct ( bn \ < alpha > ) "
and " \ < alpha > \ < noteq > \ < tau > "
and " B \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * B "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * subject \ < alpha > "
obtains M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
using assms
proof ( nominal_induct avoiding : B arbitrary : thesis rule : semanticsFrameInduct ' )
case ( cAlpha \ < Psi > P \ < alpha > P ' p A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where subjEq : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cAlpha ) auto
from \ < open > set p \ < subseteq > set ( bn \ < alpha > ) \ < times > set ( bn ( p \ < bullet > \ < alpha > ) ) \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close > \ < open > bn ( p \ < bullet > \ < alpha > ) \ < sharp > * \ < alpha > \ < close > subjEq
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject ( p \ < bullet > \ < alpha > ) ) \ < leftrightarrow > M "
by ( simp add : subjectEqvt [ symmetric ] )
thus ? case using cAlpha \ < open > B \ < sharp > * M \ < close >
by auto
next
case ( cFrameAlpha \ < Psi > P A \ < ^ sub > P \ < Psi > \ < ^ sub > P p \ < alpha > P ' B )
then obtain M where subjEq : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cFrameAlpha ) auto
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from subjEq have " ( p \ < bullet > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ) \ < turnstile > ( p \ < bullet > the ( subject \ < alpha > ) ) \ < leftrightarrow > ( p \ < bullet > M ) "
by ( rule chanEqClosed )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * subject \ < alpha > \ < close > S \ < open > \ < alpha > \ < noteq > \ < tau > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < alpha > \ < close >
have " \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > ( p \ < bullet > M ) "
by ( simp add : eqvts del : subjectEqvt )
moreover from \ < open > B \ < sharp > * M \ < close > have " ( p \ < bullet > B ) \ < sharp > * ( p \ < bullet > M ) "
by ( simp add : pt_fresh_star_bij [ OF pt_name_inst , OF at_name_inst ] )
with \ < open > A \ < ^ sub > P \ < sharp > * B \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * B \ < close > S have " B \ < sharp > * ( p \ < bullet > M ) " by ( simp add : eqvts )
ultimately show ? case by ( rule cFrameAlpha )
next
case ( cInput \ < Psi > M K xvec N Tvec P B )
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt AssertionStatEqSym [ OF Identity ] )
hence " \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > M " by ( rule chanEqSym )
moreover from \ < open > B \ < sharp > * ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) \ < close > have " B \ < sharp > * M " by simp
ultimately show ? case by ( rule_tac cInput ) auto
next
case ( cOutput \ < Psi > M K N P B )
from \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt AssertionStatEqSym [ OF Identity ] )
hence " \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > M "
by ( rule chanEqSym )
moreover from \ < open > B \ < sharp > * ( M \ < langle > N \ < rangle > . P ) \ < close > have " B \ < sharp > * M " by simp
ultimately show ? case by ( rule_tac cOutput ) auto
next
case ( cCase \ < Psi > P \ < alpha > P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cCase ) ( auto dest : memFreshChain )
with \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > show ? case by ( blast intro : cCase statEqEnt compositionSym Identity )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P \ < alpha > P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
apply ( rule_tac cPar1 ) by assumption auto
thus ? case
by ( metis cPar1 statEqEnt Associativity Commutativity AssertionStatEqTrans Composition )
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q \ < alpha > Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q B )
then obtain M where " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cPar2 ) auto
thus ? case by ( metis cPar2 statEqEnt Associativity )
next
case cComm1
thus ? case by simp
next
case cComm2
thus ? case by simp
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain K where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " and " B \ < sharp > * K "
apply ( rule_tac cOpen ) by force auto
thus ? case by ( fastforce intro : cOpen )
next
case ( cScope \ < Psi > P \ < alpha > P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain M where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > M " and " B \ < sharp > * M "
by ( rule_tac cScope ) auto
thus ? case by ( fastforce intro : cScope )
next
case ( cBang \ < Psi > P \ < alpha > P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P B )
then obtain K where " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > the ( subject \ < alpha > ) \ < leftrightarrow > K " and " B \ < sharp > * K "
by ( rule_tac cBang ) auto
with \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > show ? case by ( metis cBang statEqEnt compositionSym Identity )
qed
lemma inputRenameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * K "
shows " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' "
using assms
proof ( nominal_induct avoiding : K rule : inputFrameInduct )
case ( cAlpha \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P p K )
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from \ < open > \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > ( \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) ) ) \ < turnstile > ( p \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( rule chanEqClosed )
with S \ < open > distinctPerm p \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * K \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " by ( simp add : eqvts )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
show ? case by blast
next
case ( cInput \ < Psi > M K xvec N Tvec P K ' )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > K ' \ < close > have " \ < Psi > \ < turnstile > K \ < leftrightarrow > K ' "
by ( blast intro : statEqEnt Identity )
with \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < turnstile > M \ < leftrightarrow > K ' "
by ( rule chanEqTrans )
thus ? case using \ < open > distinct xvec \ < close > \ < open > set xvec \ < subseteq > supp N \ < close > \ < open > length xvec = length Tvec \ < close >
by ( rule Input )
next
case ( cCase \ < Psi > P M N P ' \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > ( \ < phi > , P ) mem Cs \ < close > \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( metis statEqEnt Associativity Composition AssertionStatEqTrans Commutativity )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close >
by ( rule_tac Par1 ) auto
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
by ( rule statEqEnt [ OF AssertionStatEqSym [ OF Associativity ] ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > Q \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' " by force
thus ? case using \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close >
by ( rule_tac Par2 ) auto
next
case ( cScope \ < Psi > P M N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > N \ < close > show ? case
by ( rule_tac Scope ) auto
next
case ( cBang \ < Psi > P M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * ( P \ < parallel > ! P ) ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > P ' " by force
thus ? case using \ < open > guarded P \ < close > by ( rule Bang )
qed
lemma outputRenameSubject :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P ' : : " ( ' a , ' b , ' c ) psi "
and A \ < ^ sub > P : : " name list "
and \ < Psi > \ < ^ sub > P : : ' b
assumes " \ < Psi > \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
and " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > "
and " distinct A \ < ^ sub > P "
and " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
and " A \ < ^ sub > P \ < sharp > * \ < Psi > "
and " A \ < ^ sub > P \ < sharp > * P "
and " A \ < ^ sub > P \ < sharp > * M "
and " A \ < ^ sub > P \ < sharp > * K "
shows " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' "
using assms
apply ( simp add : residualInject )
proof ( nominal_induct avoiding : K rule : outputFrameInduct )
case ( cAlpha \ < Psi > P M A \ < ^ sub > P \ < Psi > \ < ^ sub > P p B K )
have S : " set p \ < subseteq > set A \ < ^ sub > P \ < times > set ( p \ < bullet > A \ < ^ sub > P ) " by fact
from \ < open > \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( p \ < bullet > ( \ < Psi > \ < otimes > ( p \ < bullet > \ < Psi > \ < ^ sub > P ) ) ) \ < turnstile > ( p \ < bullet > M ) \ < leftrightarrow > ( p \ < bullet > K ) "
by ( rule chanEqClosed )
with S \ < open > distinctPerm p \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * \ < Psi > \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * M \ < close > \ < open > ( p \ < bullet > A \ < ^ sub > P ) \ < sharp > * K \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K " by ( simp add : eqvts )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
show ? case by ( blast intro : cAlpha )
next
case ( cOutput \ < Psi > M K N P K ' )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > K \ < leftrightarrow > K ' \ < close > have " \ < Psi > \ < turnstile > K \ < leftrightarrow > K ' "
by ( blast intro : statEqEnt Identity )
with \ < open > \ < Psi > \ < turnstile > M \ < leftrightarrow > K \ < close > have " \ < Psi > \ < turnstile > M \ < leftrightarrow > K ' "
by ( rule chanEqTrans )
thus ? case using Output by ( force simp add : residualInject )
next
case ( cCase \ < Psi > P M B \ < phi > Cs A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < longmapsto > ( ROut K B ) \ < close >
have " \ < Psi > \ < rhd > P \ < longmapsto > ROut K B " by force
thus ? case using \ < open > ( \ < phi > , P ) mem Cs \ < close > \ < open > \ < Psi > \ < turnstile > \ < phi > \ < close > \ < open > guarded P \ < close > by ( rule Case )
next
case ( cPar1 \ < Psi > \ < Psi > \ < ^ sub > Q P M xvec N P ' A \ < ^ sub > Q Q A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K "
by ( metis statEqEnt Associativity Composition AssertionStatEqTrans Commutativity )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > ( ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' P ' ) ) \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
thus ? case using \ < open > extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > Par1 [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ]
by ( auto simp add : residualInject )
next
case ( cPar2 \ < Psi > \ < Psi > \ < ^ sub > P Q M xvec N Q ' A \ < ^ sub > P P A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q K )
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K \ < close > have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K "
by ( rule statEqEnt [ OF AssertionStatEqSym [ OF Associativity ] ] )
with \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > Q \ < sharp > * ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * M ; A \ < ^ sub > Q \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > ROut K ( \ < lparr > \ < nu > * xvec \ < rparr > N \ < prec > ' Q ' ) " by force
thus ? case using \ < open > extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > Par2 [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ]
by ( auto simp add : residualInject )
next
case ( cOpen \ < Psi > P M xvec yvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * ( xvec @ yvec ) \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
with \ < open > x \ < in > supp N \ < close > \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > yvec \ < close > Open show ? case
by ( auto simp add : residualInject )
next
case ( cScope \ < Psi > P M xvec N P ' x A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
hence " \ < Psi > \ < rhd > P \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " by ( force simp add : residualInject )
with \ < open > x \ < sharp > \ < Psi > \ < close > \ < open > x \ < sharp > K \ < close > \ < open > x \ < sharp > xvec \ < close > \ < open > x \ < sharp > N \ < close > Scope [ where \ < alpha > = " K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > " ] show ? case
by ( auto simp add : residualInject )
next
case ( cBang \ < Psi > P M B A \ < ^ sub > P \ < Psi > \ < ^ sub > P K )
from \ < open > \ < Psi > \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K \ < close > \ < open > \ < Psi > \ < ^ sub > P \ < simeq > \ < one > \ < close > have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K "
by ( blast intro : statEqEnt Identity compositionSym AssertionStatEqSym )
with \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K \ < close >
\ < open > \ < And > K . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < one > \ < turnstile > M \ < leftrightarrow > K ; A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * ( P \ < parallel > ! P ) ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * K \ < rbrakk > \ < Longrightarrow > \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut K B \ < close >
have " \ < Psi > \ < rhd > P \ < parallel > ! P \ < longmapsto > ROut K B " by force
thus ? case using \ < open > guarded P \ < close > by ( rule Bang )
qed
lemma parCasesSubject [ consumes 7 , case_names cPar1 cPar2 cComm1 cComm2 ] :
fixes \ < Psi > : : ' b
and P : : " ( ' a , ' b , ' c ) psi "
and Q : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and R : : " ( ' a , ' b , ' c ) psi "
and C : : " ' d : : fs_name "
and yvec : : " name list "
assumes Trans : " \ < Psi > \ < rhd > P \ < parallel > Q \ < longmapsto > \ < alpha > \ < prec > R "
and " bn \ < alpha > \ < sharp > * \ < Psi > "
and " bn \ < alpha > \ < sharp > * P "
and " bn \ < alpha > \ < sharp > * Q "
and " bn \ < alpha > \ < sharp > * subject \ < alpha > "
and " yvec \ < sharp > * P "
and " yvec \ < sharp > * Q "
and rPar1 : " \ < And > P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > \ < alpha > \ < prec > P ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * \ < alpha > ; A \ < ^ sub > Q \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P ' \ < parallel > Q ) "
and rPar2 : " \ < And > Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P . \ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > \ < alpha > \ < prec > Q ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * \ < alpha > ; A \ < ^ sub > P \ < sharp > * C \ < rbrakk > \ < Longrightarrow > Prop \ < alpha > ( P \ < parallel > Q ' ) "
and rComm1 : " \ < And > \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; yvec \ < sharp > * M ; yvec \ < sharp > * K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
and rComm2 : " \ < And > \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q .
\ < lbrakk > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' ; extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > ; distinct A \ < ^ sub > P ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' ; extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > ; distinct A \ < ^ sub > Q ;
\ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K ; yvec \ < sharp > * M ; yvec \ < sharp > * K ; distinct xvec ;
A \ < ^ sub > P \ < sharp > * \ < Psi > ; A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * P ; A \ < ^ sub > P \ < sharp > * M ; A \ < ^ sub > P \ < sharp > * N ; A \ < ^ sub > P \ < sharp > * P ' ; A \ < ^ sub > P \ < sharp > * Q ; A \ < ^ sub > P \ < sharp > * xvec ; A \ < ^ sub > P \ < sharp > * Q ' ; A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q ; A \ < ^ sub > P \ < sharp > * C ;
A \ < ^ sub > Q \ < sharp > * \ < Psi > ; A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P ; A \ < ^ sub > Q \ < sharp > * P ; A \ < ^ sub > Q \ < sharp > * K ; A \ < ^ sub > Q \ < sharp > * N ; A \ < ^ sub > Q \ < sharp > * P ' ; A \ < ^ sub > Q \ < sharp > * Q ; A \ < ^ sub > Q \ < sharp > * xvec ; A \ < ^ sub > Q \ < sharp > * Q ' ; A \ < ^ sub > Q \ < sharp > * C ;
xvec \ < sharp > * \ < Psi > ; xvec \ < sharp > * \ < Psi > \ < ^ sub > P ; xvec \ < sharp > * P ; xvec \ < sharp > * M ; xvec \ < sharp > * K ; xvec \ < sharp > * Q ; xvec \ < sharp > * \ < Psi > \ < ^ sub > Q ; xvec \ < sharp > * C \ < rbrakk > \ < Longrightarrow >
Prop ( \ < tau > ) ( \ < lparr > \ < nu > * xvec \ < rparr > ( P ' \ < parallel > Q ' ) ) "
shows " Prop \ < alpha > R "
using Trans \ < open > bn \ < alpha > \ < sharp > * \ < Psi > \ < close > \ < open > bn \ < alpha > \ < sharp > * P \ < close > \ < open > bn \ < alpha > \ < sharp > * Q \ < close > \ < open > bn \ < alpha > \ < sharp > * subject \ < alpha > \ < close >
proof ( induct rule : parCases [ where C = " ( C , yvec ) " ] )
case ( cPar1 P ' A \ < ^ sub > Q \ < Psi > \ < ^ sub > Q )
thus ? case by ( rule_tac rPar1 ) auto
next
case ( cPar2 Q ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P )
thus ? case by ( rule_tac rPar2 ) auto
next
case ( cComm1 \ < Psi > \ < ^ sub > Q M N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K xvec Q ' A \ < ^ sub > Q )
from \ < open > A \ < ^ sub > P \ < sharp > * ( C , yvec ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( C , yvec ) \ < close > \ < open > xvec \ < sharp > * ( C , yvec ) \ < close >
have " A \ < ^ sub > P \ < sharp > * C " and " A \ < ^ sub > Q \ < sharp > * C " and " xvec \ < sharp > * C " and " A \ < ^ sub > P \ < sharp > * yvec " and " A \ < ^ sub > Q \ < sharp > * yvec " and " xvec \ < sharp > * yvec "
by simp +
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and MeqK : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K " by fact +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close >
obtain M ' where MeqM ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > M ' " and " xvec \ < sharp > * M ' " and " yvec \ < sharp > * M ' " and " A \ < ^ sub > Q \ < sharp > * M ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > Q " in obtainPrefix ) ( assumption | force ) +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > yvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * K \ < close > \ < open > distinct xvec \ < close >
obtain K ' where KeqK ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > K ' " and " xvec \ < sharp > * K ' " and " yvec \ < sharp > * K ' " and " A \ < ^ sub > P \ < sharp > * K ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > P " in obtainPrefix ) ( assumption | force | metis freshChainSym ) +
from MeqK KeqK ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > N \ < rparr > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K ' \ < lparr > N \ < rparr > \ < prec > P ' " using \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close >
by ( rule_tac inputRenameSubject ) ( assumption | force ) +
moreover note FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from MeqK MeqM ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M ' \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > Q ' " using \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close >
by ( rule_tac outputRenameSubject ) ( assumption | force ) +
moreover note FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from MeqM ' KeqK ' MeqK have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K ' \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M ' \ < close > \ < open > xvec \ < sharp > * K ' \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * M ' \ < close > \ < open > yvec \ < sharp > * K ' \ < close > \ < open > distinct xvec \ < close >
ultimately show ? case
by ( rule_tac rComm1 )
next
case ( cComm2 \ < Psi > \ < ^ sub > Q M xvec N P ' A \ < ^ sub > P \ < Psi > \ < ^ sub > P K Q ' A \ < ^ sub > Q )
from \ < open > A \ < ^ sub > P \ < sharp > * ( C , yvec ) \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * ( C , yvec ) \ < close > \ < open > xvec \ < sharp > * ( C , yvec ) \ < close >
have " A \ < ^ sub > P \ < sharp > * C " and " A \ < ^ sub > Q \ < sharp > * C " and " xvec \ < sharp > * C " and " A \ < ^ sub > P \ < sharp > * yvec " and " A \ < ^ sub > Q \ < sharp > * yvec " and " xvec \ < sharp > * yvec "
by simp +
have FrP : " extractFrame P = \ < langle > A \ < ^ sub > P , \ < Psi > \ < ^ sub > P \ < rangle > " and FrQ : " extractFrame Q = \ < langle > A \ < ^ sub > Q , \ < Psi > \ < ^ sub > Q \ < rangle > "
and MeqK : " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > M \ < leftrightarrow > K " by fact +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > yvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > distinct xvec \ < close >
obtain M ' where MeqM ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > M ' " and " xvec \ < sharp > * M ' " and " yvec \ < sharp > * M ' " and " A \ < ^ sub > Q \ < sharp > * M ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > Q " in obtainPrefix ) ( assumption | force ) +
from \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > yvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close >
\ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * yvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close >
obtain K ' where KeqK ' : " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > K ' " and " xvec \ < sharp > * K ' " and " yvec \ < sharp > * K ' " and " A \ < ^ sub > P \ < sharp > * K ' "
by ( rule_tac B = " xvec @ yvec @ A \ < ^ sub > P " in obtainPrefix ) ( assumption | force | metis freshChainSym ) +
from MeqK KeqK ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q ) \ < otimes > \ < Psi > \ < ^ sub > P \ < turnstile > M \ < leftrightarrow > K ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > M \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' \ < close > FrP \ < open > distinct A \ < ^ sub > P \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > Q \ < rhd > P \ < longmapsto > K ' \ < lparr > \ < nu > * xvec \ < rparr > \ < langle > N \ < rangle > \ < prec > P ' " using \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * M \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close >
by ( rule_tac outputRenameSubject ) ( assumption | force ) +
moreover note FrP \ < open > distinct A \ < ^ sub > P \ < close >
moreover from MeqK MeqM ' have " ( \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P ) \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
with \ < open > \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > K \ < lparr > N \ < rparr > \ < prec > Q ' \ < close > FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < rhd > Q \ < longmapsto > M ' \ < lparr > N \ < rparr > \ < prec > Q ' " using \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * K \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close >
by ( rule_tac inputRenameSubject ) ( assumption | force ) +
moreover note FrQ \ < open > distinct A \ < ^ sub > Q \ < close >
moreover from MeqM ' KeqK ' MeqK have " \ < Psi > \ < otimes > \ < Psi > \ < ^ sub > P \ < otimes > \ < Psi > \ < ^ sub > Q \ < turnstile > K ' \ < leftrightarrow > M ' "
by ( metis statEqEnt Associativity Commutativity Composition chanEqTrans chanEqSym )
moreover note \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > P \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P \ < close > \ < open > A \ < ^ sub > P \ < sharp > * K ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * N \ < close > \ < open > A \ < ^ sub > P \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > P \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > P \ < sharp > * A \ < ^ sub > Q \ < close > \ < open > A \ < ^ sub > P \ < sharp > * C \ < close >
\ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * M ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * N \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * Q ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * xvec \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * P ' \ < close > \ < open > A \ < ^ sub > Q \ < sharp > * C \ < close >
\ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > P \ < close > \ < open > xvec \ < sharp > * P \ < close > \ < open > xvec \ < sharp > * M ' \ < close > \ < open > xvec \ < sharp > * K ' \ < close > \ < open > xvec \ < sharp > * Q \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < ^ sub > Q \ < close > \ < open > xvec \ < sharp > * C \ < close > \ < open > yvec \ < sharp > * M ' \ < close > \ < open > yvec \ < sharp > * K ' \ < close > \ < open > distinct xvec \ < close >
ultimately show ? case
by ( rule_tac rComm2 )
qed
lemma inputCases [ consumes 1 , case_names cInput ] :
fixes \ < Psi > : : ' b
and M : : ' a
and xvec : : " name list "
and N : : ' a
and P : : " ( ' a , ' b , ' c ) psi "
and \ < alpha > : : " ' a action "
and P ' : : " ( ' a , ' b , ' c ) psi "
assumes Trans : " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' "
and rInput : " \ < And > K Tvec . \ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > ) ( P [ xvec : : = Tvec ] ) "
shows " Prop \ < alpha > P ' "
proof -
{
fix xvec N P
assume Trans : " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' "
and " xvec \ < sharp > * \ < Psi > " and " xvec \ < sharp > * M " and " xvec \ < sharp > * \ < alpha > " and " xvec \ < sharp > * P ' " and " distinct xvec "
and rInput : " \ < And > K Tvec . \ < lbrakk > \ < Psi > \ < turnstile > M \ < leftrightarrow > K ; set xvec \ < subseteq > supp N ; length xvec = length Tvec ; distinct xvec \ < rbrakk > \ < Longrightarrow > Prop ( K \ < lparr > N [ xvec : : = Tvec ] \ < rparr > ) ( P [ xvec : : = Tvec ] ) "
from Trans have " bn \ < alpha > = [ ] "
apply -
by ( ind_cases " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * xvec N \ < rparr > . P \ < longmapsto > \ < alpha > \ < prec > P ' " ) ( auto simp add : residualInject )
from Trans have " distinct ( bn \ < alpha > ) " by ( auto dest : boundOutputDistinct )
have " length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) " by simp
note Trans
moreover have " length xvec = inputLength ( M \ < lparr > \ < lambda > * xvec N \ < rparr > . P ) " by auto
moreover note \ < open > distinct xvec \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover note \ < open > length ( bn \ < alpha > ) = residualLength ( \ < alpha > \ < prec > P ' ) \ < close > \ < open > distinct ( bn \ < alpha > ) \ < close >
moreover obtain x : : name where " x \ < sharp > \ < Psi > " and " x \ < sharp > P " and " x \ < sharp > M " and " x \ < sharp > xvec " and " x \ < sharp > \ < alpha > " and " x \ < sharp > P ' " and " x \ < sharp > N "
by ( generate_fresh " name " ) auto
ultimately have " Prop \ < alpha > P ' " using \ < open > bn \ < alpha > = [ ] \ < close > \ < open > xvec \ < sharp > * \ < Psi > \ < close > \ < open > xvec \ < sharp > * M \ < close > \ < open > xvec \ < sharp > * \ < alpha > \ < close > \ < open > xvec \ < sharp > * P ' \ < close >
apply ( cases rule : semanticsCases [ of _ _ _ _ _ _ _ _ _ C x ] )
apply ( force simp add : residualInject psi . inject rInput )
by ( fastforce simp add : residualInject psi . inject inputChainFresh ) +
}
note Goal = this
moreover obtain p : : " name prm " where " ( p \ < bullet > xvec ) \ < sharp > * \ < Psi > " and " ( p \ < bullet > xvec ) \ < sharp > * M " and " ( p \ < bullet > xvec ) \ < sharp > * N " and " ( p \ < bullet > xvec ) \ < sharp > * P "
and " ( p \ < bullet > xvec ) \ < sharp > * \ < alpha > " and " ( p \ < bullet > xvec ) \ < sharp > * P ' " and S : " set p \ < subseteq > set xvec \ < times > set ( p \ < bullet > xvec ) "
and " distinctPerm p "
by ( rule_tac xvec = xvec and c = " ( \ < Psi > , M , N , P , \ < alpha > , P ' ) " in name_list_avoiding ) auto
from Trans \ < open > ( p \ < bullet > xvec ) \ < sharp > * N \ < close > \ < open > ( p \ < bullet > xvec ) \ < sharp > * P \ < close > S have " \ < Psi > \ < rhd > M \ < lparr > \ < lambda > * ( p \ < bullet > xvec ) ( p \ < bullet > N ) \ < rparr > . ( p \ < bullet > P ) \ < longmapsto > \ < alpha > \ < prec > P ' "
by ( simp add : inputChainAlpha ' )
moreover {
fix K Tvec
assume " \ < Psi > \ < turnstile > M \ < leftrightarrow > K "
moreover assume " set ( p \ < bullet > xvec ) \ < subseteq > supp ( p \ < bullet > N ) "
hence " ( p \ < bullet > set ( p \ < bullet > xvec ) ) \ < subseteq > ( p \ < bullet > supp ( p \ < bullet > N ) ) " by simp
with \ < open > distinctPerm p \ < close > have " set xvec \ < subseteq > supp N " by ( simp add : eqvts )
moreover assume " length ( p \ < bullet > xvec ) = length ( Tvec : : ' a list ) "
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 in Prozent C=86 H=95 G=90
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.5.974Bemerkung:
¤
*Bot Zugriff
Wurzel
Suchen
NIST Cobol Testsuite
Haftungshinweis
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.
2026-06-12