Theory Tau_Stat_Imp
theory Tau_Stat_Imp
imports Tau_Sim Weaken_Stat_Imp
begin
locale weakTauLaws = weak + tau
begin
lemma tauLaw1StatImpLeft:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⪅⇩w<Rel> Q"
and "(Ψ, τ.(P), Q) ∈ Rel"
shows "Ψ ⊳ τ.(P) ⪅⇩w<Rel> Q"
proof -
have "Ψ ⊳ Q ⟹⇧^⇩τ Q" by simp
moreover have "insertAssertion (extractFrame(τ.(P))) Ψ ≃⇩F ⟨ε, Ψ⟩" by(rule insertTauAssertion)
hence "insertAssertion (extractFrame(τ.(P))) Ψ ↪⇩F insertAssertion (extractFrame Q) Ψ"
by(metis FrameStatImpTrans FrameStatEq_def insertAssertionWeaken)
ultimately show ?thesis using ‹(Ψ, τ.(P), Q) ∈ Rel›
by(rule weakenStatImpI)
qed
lemma tauLaw1StatImpRight:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
assumes "Ψ ⊳ P ⪅<Rel> Q"
and C1: "⋀Ψ P Q R. ⟦(Ψ, P, Q) ∈ Rel; Ψ ⊳ Q ∼ R⟧ ⟹ (Ψ, P, R) ∈ Rel'"
shows "Ψ ⊳ P ⪅<Rel'> τ.(Q)"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
from ‹Ψ ⊳ P ⪅<Rel> Q› obtain Q' Q''
where QChain: "Ψ ⊳ Q ⟹⇧^⇩τ Q'" and PImpQ': "insertAssertion (extractFrame P) Ψ ↪⇩F insertAssertion (extractFrame Q') Ψ"
and Q'Chain: "Ψ ⊗ Ψ' ⊳ Q' ⟹⇧^⇩τ Q''" and PRelQ'': "(Ψ ⊗ Ψ', P, Q'') ∈ Rel"
by(rule weakStatImpE)
obtain Q''' where QTrans: "Ψ ⊳ τ.(Q) ⟼τ ≺ Q'''" and "Ψ ⊳ Q ∼ Q'''" using tauActionI by auto
from ‹Ψ ⊳ Q ∼ Q'''› QChain bisimE(2) obtain Q'''' where Q'''Chain: "Ψ ⊳ Q''' ⟹⇧^⇩τ Q''''" and "Ψ ⊳ Q' ∼ Q''''"
by(metis bisimE(4) simTauChain)
from QTrans Q'''Chain have "Ψ ⊳ τ.(Q) ⟹⇧^⇩τ Q''''" by(drule_tac tauActTauChain) auto
moreover from ‹Ψ ⊳ Q' ∼ Q''''› have "insertAssertion (extractFrame Q') Ψ ↪⇩F insertAssertion (extractFrame Q'''') Ψ"
by(metis bisimE FrameStatEq_def)
with PImpQ' have "insertAssertion (extractFrame P) Ψ ↪⇩F insertAssertion (extractFrame Q'''') Ψ"
by(rule FrameStatImpTrans)
moreover from ‹Ψ ⊳ Q' ∼ Q''''› have "Ψ ⊗ Ψ' ⊳ Q' ∼ Q''''" by(rule bisimE)
then obtain Q''''' where Q''''Chain: "Ψ ⊗ Ψ' ⊳ Q'''' ⟹⇧^⇩τ Q'''''" and "Ψ ⊗ Ψ' ⊳ Q'' ∼ Q'''''" using Q'Chain bisimE(2)
by(metis bisimE(4) simTauChain)
note Q''''Chain
moreover from ‹(Ψ ⊗ Ψ', P, Q'') ∈ Rel› ‹Ψ ⊗ Ψ' ⊳ Q'' ∼ Q'''''› have "(Ψ ⊗ Ψ', P, Q''''') ∈ Rel'"
by(rule C1)
ultimately show ?case by blast
qed
end
context tau begin
lemma tauLaw3StatImpLeft:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and α :: "'a prefix"
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', α⋅(τ.(P)), α⋅Q) ∈ Rel"
shows "Ψ ⊳ α⋅(τ.(P)) ⪅<Rel> α⋅Q"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ α⋅Q ⟹⇧^⇩τ α⋅Q" by auto
moreover have "insertAssertion (extractFrame(α⋅(τ.(P)))) Ψ ↪⇩F insertAssertion (extractFrame(α⋅Q)) Ψ" using insertTauAssertion
by(nominal_induct α rule: prefix.strong_inducts) (auto simp add: FrameStatEq_def intro: FrameStatImpTrans)
moreover have "Ψ ⊗ Ψ' ⊳ α⋅Q ⟹⇧^⇩τ α⋅Q" by auto
moreover have "(Ψ ⊗ Ψ', α⋅(τ.(P)), α⋅Q) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
lemma tauLaw3StatImpRight:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', α⋅P, α⋅(τ.(Q))) ∈ Rel"
shows "Ψ ⊳ α⋅P ⪅<Rel> α⋅(τ.(Q))"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ α⋅(τ.(Q)) ⟹⇧^⇩τ α⋅(τ.(Q))" by auto
moreover have "insertAssertion (extractFrame(α⋅P)) Ψ ↪⇩F insertAssertion (extractFrame(α⋅(τ.(Q)))) Ψ" using insertTauAssertion
by(nominal_induct α rule: prefix.strong_inducts) (auto simp add: FrameStatEq_def intro: FrameStatImpTrans)
moreover have "Ψ ⊗ Ψ' ⊳ α⋅(τ.(Q)) ⟹⇧^⇩τ α⋅(τ.(Q))" by auto
moreover have "(Ψ ⊗ Ψ', α⋅P, α⋅(τ.(Q))) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
end
context tauSum begin
lemma tauLaw2StatImpLeft:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', P ⊕ τ.(P), τ.(P)) ∈ Rel"
shows "Ψ ⊳ P ⊕ τ.(P) ⪅<Rel> τ.(P)"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ τ.(P) ⟹⇧^⇩τ τ.(P)" by auto
moreover have "insertAssertion (extractFrame(τ.(P))) Ψ ≃⇩F ⟨ε, Ψ⟩" by(rule insertTauAssertion)
hence "insertAssertion (extractFrame(P ⊕ τ.(P))) Ψ ↪⇩F insertAssertion (extractFrame(τ.(P))) Ψ" using Identity
by(rule_tac FrameStatImpTrans) (auto simp add: FrameStatEq_def AssertionStatEq_def)
moreover have "Ψ ⊗ Ψ' ⊳ τ.(P) ⟹⇧^⇩τ τ.(P)" by auto
moreover have "(Ψ ⊗ Ψ', P ⊕ τ.(P), τ.(P)) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
lemma tauLaw2StatImpRight:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', τ.(P), P ⊕ τ.(P)) ∈ Rel"
shows "Ψ ⊳ τ.(P) ⪅<Rel> P ⊕ τ.(P)"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ P ⊕ τ.(P) ⟹⇧^⇩τ P ⊕ τ.(P)" by auto
moreover have "insertAssertion (extractFrame(τ.(P))) Ψ ≃⇩F ⟨ε, Ψ⟩" by(rule insertTauAssertion)
hence "insertAssertion (extractFrame(τ.(P))) Ψ ↪⇩F insertAssertion (extractFrame(P ⊕ τ.(P))) Ψ" using Identity
by(rule_tac FrameStatImpTrans) (auto simp add: FrameStatEq_def AssertionStatEq_def)
moreover have "Ψ ⊗ Ψ' ⊳ P ⊕ τ.(P) ⟹⇧^⇩τ P ⊕ τ.(P)" by auto
moreover have "(Ψ ⊗ Ψ', τ.(P), P ⊕ τ.(P)) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
lemma tauLaw4StatImpLeft:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and M :: 'a
and N :: 'a
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', α⋅P ⊕ α⋅(τ.(P) ⊕ Q), α⋅(τ.(P) ⊕ Q)) ∈ Rel"
shows "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⪅<Rel> α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ α⋅(τ.(P) ⊕ Q) ⟹⇧^⇩τ α⋅(τ.(P) ⊕ Q)" by auto
hence "insertAssertion (extractFrame(α⋅P ⊕ α⋅(τ.(P) ⊕ Q))) Ψ ↪⇩F insertAssertion (extractFrame(α⋅(τ.(P) ⊕ Q))) Ψ"
using insertTauAssertion Identity
by(nominal_induct α rule: prefix.strong_inducts, auto)
(rule FrameStatImpTrans[where G="⟨ε, Ψ⟩"], auto simp add: FrameStatEq_def AssertionStatEq_def)
moreover have "Ψ ⊗ Ψ' ⊳ α⋅(τ.(P) ⊕ Q) ⟹⇧^⇩τ α⋅(τ.(P) ⊕ Q)" by auto
moreover have "(Ψ ⊗ Ψ', α⋅P ⊕ α⋅(τ.(P) ⊕ Q), α⋅(τ.(P) ⊕ Q)) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
lemma tauLaw4StatImpRight:
fixes Ψ :: 'b
and P :: "('a, 'b, 'c) psi"
and Q :: "('a, 'b, 'c) psi"
and α :: "'a prefix"
assumes C1: "⋀Ψ'. (Ψ ⊗ Ψ', α⋅(τ.(P) ⊕ Q), α⋅P ⊕ α⋅(τ.(P) ⊕ Q)) ∈ Rel"
shows "Ψ ⊳ α⋅(τ.(P) ⊕ Q) ⪅<Rel> α⋅P ⊕ α⋅(τ.(P) ⊕ Q)"
proof(induct rule: weakStatImpI)
case(cStatImp Ψ')
have "Ψ ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⟹⇧^⇩τ α⋅P ⊕ α⋅(τ.(P) ⊕ Q)" by auto
hence "insertAssertion (extractFrame(α⋅(τ.(P) ⊕ Q))) Ψ ↪⇩F insertAssertion (extractFrame(α⋅P ⊕ α⋅(τ.(P) ⊕ Q))) Ψ"
using insertTauAssertion Identity
by(nominal_induct α rule: prefix.strong_inducts, auto)
(rule FrameStatImpTrans[where G="⟨ε, Ψ⟩"], auto simp add: FrameStatEq_def AssertionStatEq_def)
moreover have "Ψ ⊗ Ψ' ⊳ α⋅P ⊕ α⋅(τ.(P) ⊕ Q) ⟹⇧^⇩τ α⋅P ⊕ α⋅(τ.(P) ⊕ Q)" by auto
moreover have "(Ψ ⊗ Ψ', α⋅(τ.(P) ⊕ Q), α⋅P ⊕ α⋅(τ.(P) ⊕ Q)) ∈ Rel" by(rule C1)
ultimately show ?case by blast
qed
end
end