Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T
theory CSP_T_law_fix (*-------------------------------------------*
| CSP-Prover on Isabelle2005 |
| March 2007 |
| |
| Yoshinao Isobe (AIST JAPAN) |
*-------------------------------------------*)
theory CSP_T_law_fix
imports CSP_T_law_fp
begin
(* The following simplification rules are deleted in this theory file *)
(* because they unexpectly rewrite UnionT and InterT. *)
(* Union (B ` A) = (UN x:A. B x) *)
(* Inter (B ` A) = (INT x:A. B x) *)
declare Union_image_eq [simp del]
declare Inter_image_eq [simp del]
consts
FIXn :: "nat => ('p => ('p,'a) proc) => ('p => ('p,'a) proc)"
("FIX[_] _" [0,1000] 55)
FIX :: "(('p) => ('p,'a) proc) => ('p => ('p,'a) proc)"
("FIX _" [1000] 55)
defs
FIXn_def : "FIX[n] Pf == ((Pf <<< )^n) (%q. DIV)"
FIX_def : "FIX Pf == (%p. (!nat n .. ((FIX[n] Pf) p)))"
(* ----- test ----- *
consts
FIXnrec :: "nat => ('p => ('p,'a) proc) => ('p => ('p,'a) proc)"
("FIXrec[_] _" [0,1000] 55)
primrec
"FIXrec[0] Pf = (%p. DIV)"
"FIXrec[Suc n] Pf = (%p. (Pf p)<<(FIXrec[n] Pf))"
lemma FIXn_FIXnrec: "FIX[n] Pf = FIXrec[n] Pf"
apply (induct_tac n)
apply (simp_all add: FIXn_def)
done
* ----- test ----- *)
(*-----------*
| noPN |
*-----------*)
lemma noPNfun_FIXn: "noPNfun (%p. (FIX[n] Pf)(p))"
apply (simp add: FIXn_def)
apply (induct_tac n)
apply (simp add: noPNfun_def)
apply (simp (no_asm) add: noPNfun_def)
apply (intro allI)
apply (simp add: Subst_procfun_prod_def)
apply (simp add: noPN_Subst_Pf)
done
lemma noPN_FIXn: "noPN ((FIX[n] Pf)p)"
apply (insert noPNfun_FIXn[of _ Pf])
apply (simp add: noPNfun_def)
done
lemma noPN_FIX: "noPN ((FIX Pf) p)"
apply (simp add: FIX_def)
apply (simp add: noPN_FIXn)
done
(*-----------*
| Bot |
*-----------*)
lemma traces_prod_Bot: "(%p. traces DIV M) = Bot"
apply (simp add: prod_Bot_def)
apply (simp add: expand_fun_eq)
apply (simp add: traces_def)
apply (simp add: bottom_domT_def)
done
lemma semT_prod_Bot: "(%p. [[DIV]]T) = Bot"
by (simp add: semT_def semTf_def traces_prod_Bot)
(*-----------*
| FIX P |
*-----------*)
lemma traces_subst_Bot: "traces (P<<(%q. DIV)) M = (traces P) Bot"
apply (induct_tac P)
apply (simp_all add: traces_def)
apply (simp add: prod_Bot_def)
apply (simp add: bottom_domT_def)
done
lemma traces_iteration_semTfun_Bot:
"ALL p. traces (((Pf <<<) ^ n) (%q. DIV) p) M = ([[Pf]]Tfun ^ n) Bot p"
apply (simp add: semTfun_def)
apply (simp add: semTf_def)
apply (induct_tac n)
(* base *)
apply (simp_all add: traces_def)
apply (simp add: prod_Bot_def)
apply (simp add: bottom_domT_def)
(* step *)
apply (simp add: Subst_procfun_prod_def)
apply (simp add: traces_subst)
done
lemma traces_FIX:
"traces ((FIX Pf) p) M
= UnionT {u. EX n. u = ([[Pf]]Tfun ^ n) Bot p}"
apply (simp add: FIX_def FIXn_def)
apply (subgoal_tac "{u. EX n. u = ([[Pf]]Tfun ^ n) Bot p} ~= {}")
apply (rule order_antisym)
(* <= *)
apply (rule)
apply (simp add: in_traces)
apply (erule disjE, simp)
apply (elim conjE exE)
apply (rule_tac x="traces (((Pf <<<) ^ n) (%q. DIV) p) M" in exI)
apply (simp)
apply (rule_tac x="n" in exI)
apply (simp add: traces_iteration_semTfun_Bot)
(* => *)
apply (rule)
apply (simp add: in_traces)
apply (rule disjI2)
apply (elim conjE exE)
apply (simp)
apply (rule_tac x="na" in exI)
apply (simp add: traces_iteration_semTfun_Bot)
by (auto)
(*** [[ ]]T ***)
lemma semT_FIX:
"[[(FIX Pf) p]]T
= UnionT {u. EX n. u = ([[Pf]]Tfun ^ n) Bot p}"
apply (simp add: semT_def semTf_def)
apply (simp add: traces_FIX)
done
(*** FIX is LUB ***)
lemma semT_FIX_isLUB:
"(%p. [[(FIX Pf) p]]T) isLUB {x. EX n. x = ([[Pf]]Tfun ^ n) Bot}"
apply (simp add: prod_LUB_decompo)
apply (intro allI)
apply (simp add: proj_fun_def)
apply (simp add: image_def)
apply (simp add: semT_FIX)
apply (subgoal_tac
"{y. EX x. (EX n. x = ([[Pf]]Tfun ^ n) Bot) & y = x i} =
{u. EX n. u = ([[Pf]]Tfun ^ n) Bot i}")
apply (simp)
apply (rule UnionT_isLUB)
apply (auto)
done
lemma semT_FIX_LUB:
"(%p. [[(FIX Pf) p]]T) = LUB {x. EX n. x = ([[Pf]]Tfun ^ n) Bot}"
apply (rule sym)
apply (rule isLUB_LUB)
apply (simp add: semT_FIX_isLUB)
done
lemma semT_FIX_LFP:
"(%p. [[(FIX Pf) p]]T) = LFP [[Pf]]Tfun"
apply (simp add: semT_FIX_LUB)
apply (simp add: Tarski_thm_LFP_LUB continuous_semTfun)
done
lemma semT_FIX_LFP_p:
"[[(FIX Pf) p]]T = LFP [[Pf]]Tfun p"
apply (insert semT_FIX_LFP[of Pf])
apply (simp add: expand_fun_eq)
done
lemma semT_FIX_isLFP:
"(%p. [[(FIX Pf) p]]T) isLFP [[Pf]]Tfun"
apply (simp add: semT_FIX_LFP)
apply (simp add: LFP_is Tarski_thm_EX continuous_semTfun)
done
lemma semT_FIX_LFP_fixed_point:
"[[Pf]]Tfun (%p. [[(FIX Pf) p]]T) = (%p. [[(FIX Pf) p]]T)"
apply (insert semT_FIX_isLFP[of Pf])
apply (simp add: isLFP_def)
done
lemma semT_FIX_LFP_least:
"ALL Tf. [[Pf]]Tfun Tf = Tf --> (%p. [[(FIX Pf) p]]T) <= Tf"
apply (insert semT_FIX_isLFP[of Pf])
apply (simp add: isLFP_def)
done
(*=======================================================*
| |
| CPO |
| |
*=======================================================*)
lemma cspT_FIX_cpo:
"[| FPmode = CPOmode |
FPmode = MIXmode ;
Pf = PNfun |]
==> $p =T (FIX Pf)(p)"
apply (simp add: eqT_def)
apply (fold semT_def)
apply (simp add: semT_FIX_LFP_p)
apply (simp add: semT_LFP_cpo)
done
lemma cspT_FIX_cms:
"[| FPmode = CMSmode ;
Pf = PNfun ;
guardedfun (Pf) |]
==> $p =T (FIX Pf)(p)"
apply (simp add: eqT_def)
apply (fold semT_def)
apply (simp add: semT_FIX_LFP_p)
apply (simp add: semT_guarded_LFP_UFP)
apply (simp add: semT_UFP_cms)
done
lemma cspT_FIX:
"[| FPmode = CPOmode |
FPmode = CMSmode & guardedfun (Pf) |
FPmode = MIXmode ;
Pf = PNfun |]
==> $p =T (FIX Pf)(p)"
apply (erule disjE)
apply (simp add: cspT_FIX_cpo)
apply (erule disjE)
apply (simp add: cspT_FIX_cms)
apply (simp add: cspT_FIX_cpo)
done
(*==============================================================*
| |
| replace process names by infinite repcicated internal choice |
| rmPN (FIX) |
| |
*==============================================================*)
consts
rmPN :: "('p,'a) proc => ('p,'a) proc"
primrec
"rmPN(STOP) = STOP"
"rmPN(SKIP) = SKIP"
"rmPN(DIV) = DIV"
"rmPN(a -> P) = a -> (rmPN P)"
"rmPN(? :A -> Pf) = ? a:A -> (rmPN (Pf a))"
"rmPN(P [+] Q) = (rmPN P) [+] (rmPN Q)"
"rmPN(P |~| Q) = (rmPN P) |~| (rmPN Q)"
"rmPN(!! :C .. Pf) = !! c:C .. rmPN (Pf c)"
"rmPN(IF b THEN P ELSE Q) = (IF b THEN rmPN(P) ELSE rmPN(Q))"
"rmPN(P |[X]| Q) = (rmPN P) |[X]| (rmPN Q)"
"rmPN(P -- X) = (rmPN P) -- X"
"rmPN(P [[r]]) = (rmPN P) [[r]]"
"rmPN(P ;; Q) = (rmPN P) ;; (rmPN Q)"
"rmPN(P |. n) = (rmPN P) |. n"
"rmPN($p) = (FIX PNfun)(p)"
lemma noPN_rmPN: "noPN (rmPN P)"
apply (induct_tac P)
apply (simp_all)
apply (simp add: noPN_FIX)
done
lemma cspT_rmPN_eqT:
"FPmode = CPOmode |
FPmode = CMSmode & guardedfun (PNfun::('p=>('p,'a) proc)) |
FPmode = MIXmode
==> (P::('p,'a) proc) =T rmPN(P)"
apply (induct_tac P)
apply (simp_all add: cspT_decompo)
apply (rule cspT_FIX)
apply (simp_all)
done
(*-------------------------------------------------------*
| |
| FIX expansion (CSP-Prover intro rule) |
| |
*-------------------------------------------------------*)
lemma traces_FIXn_plus_sub_lm:
"ALL n m p. traces ((FIX[n] Pf) p) M <= traces ((FIX[n+m] Pf) p) M"
apply (rule)
apply (induct_tac n)
apply (simp add: FIXn_def Subst_procfun_prod_def)
apply (intro allI)
apply (rule)
apply (simp add: in_traces)
apply (rule allI)
apply (simp add: FIXn_def Subst_procfun_prod_def)
apply (drule_tac x="m" in spec)
apply (simp add: traces_subst)
apply (rule allI)
apply (fold order_prod_def)
apply (simp add: mono_traces[simplified mono_def])
done
lemma traces_FIXn_plus_sub:
"traces ((FIX[n] Pf) p) M <= traces ((FIX[n+m] Pf) p) M"
by (simp add: traces_FIXn_plus_sub_lm)
lemma semT_FIXn_plus_sub:
"[[(FIX[n] Pf) p]]Tf M <= [[(FIX[n+m] Pf) p]]Tf M"
apply (simp add: semTf_def)
apply (simp add: traces_FIXn_plus_sub)
done
lemma in_traces_FIXn_plus_sub:
"t :t traces ((FIX[n] Pf) p) M ==> t :t traces ((FIX[n+m] Pf) p) M"
apply (insert traces_FIXn_plus_sub[of n Pf p M m])
by (auto)
(*-----------------------------------------------------*
| sometimes FIX[n + f n] is useful more than FIX[n] |
*-----------------------------------------------------*)
lemma cspT_FIX_plus_eq:
"ALL f p. (FIX Pf) p =T[M,M] (!nat n .. ((FIX[n + f n] Pf) p))"
apply (simp add: FIX_def)
apply (simp add: eqT_def)
apply (intro allI)
apply (simp add: semTf_def)
apply (rule order_antisym)
apply (rule)
apply (simp add: in_traces)
apply (rule disjI2)
apply (elim conjE exE disjE, simp)
apply (rule_tac x="n" in exI)
apply (simp add: in_traces_FIXn_plus_sub)
apply (rule)
apply (simp add: in_traces)
apply (elim conjE exE disjE)
apply (simp)
apply (rule disjI2)
apply (rule_tac x="n + f n" in exI)
apply (simp)
done
(****************** to add them again ******************)
declare Union_image_eq [simp]
declare Inter_image_eq [simp]
end
lemma noPNfun_FIXn:
noPNfun (FIX[n] Pf)
lemma noPN_FIXn:
noPN ((FIX[n] Pf) p)
lemma noPN_FIX:
noPN ((FIX Pf) p)
lemma traces_prod_Bot:
(%p. traces DIV M) = Bot
lemma semT_prod_Bot:
(%p. [[DIV]]T) = Bot
lemma traces_subst_Bot:
traces (P << (%q. DIV)) M = traces P Bot
lemma traces_iteration_semTfun_Bot:
∀p. traces ((Pf <<< ^ n) (%q. DIV) p) M = ([[Pf]]Tfun ^ n) Bot p
lemma traces_FIX:
traces ((FIX Pf) p) M = UnionT {u. ∃n. u = ([[Pf]]Tfun ^ n) Bot p}
lemma semT_FIX:
[[(FIX Pf) p]]T = UnionT {u. ∃n. u = ([[Pf]]Tfun ^ n) Bot p}
lemma semT_FIX_isLUB:
(%p. [[(FIX Pf) p]]T) isLUB {x. ∃n. x = ([[Pf]]Tfun ^ n) Bot}
lemma semT_FIX_LUB:
(%p. [[(FIX Pf) p]]T) = LUB {x. ∃n. x = ([[Pf]]Tfun ^ n) Bot}
lemma semT_FIX_LFP:
(%p. [[(FIX Pf) p]]T) = LFP [[Pf]]Tfun
lemma semT_FIX_LFP_p:
[[(FIX Pf) p]]T = LFP [[Pf]]Tfun p
lemma semT_FIX_isLFP:
(%p. [[(FIX Pf) p]]T) isLFP [[Pf]]Tfun
lemma semT_FIX_LFP_fixed_point:
[[Pf]]Tfun (%p. [[(FIX Pf) p]]T) = (%p. [[(FIX Pf) p]]T)
lemma semT_FIX_LFP_least:
∀Tf. [[Pf]]Tfun Tf = Tf --> (%p. [[(FIX Pf) p]]T) ≤ Tf
lemma cspT_FIX_cpo:
[| FPmode = CPOmode ∨ FPmode = MIXmode; Pf = PNfun |] ==> $p =T (FIX Pf) p
lemma cspT_FIX_cms:
[| FPmode = CMSmode; Pf = PNfun; guardedfun Pf |] ==> $p =T (FIX Pf) p
lemma cspT_FIX:
[| FPmode = CPOmode ∨ FPmode = CMSmode ∧ guardedfun Pf ∨ FPmode = MIXmode; Pf = PNfun |] ==> $p =T (FIX Pf) p
lemma noPN_rmPN:
noPN (rmPN P)
lemma cspT_rmPN_eqT:
FPmode = CPOmode ∨ FPmode = CMSmode ∧ guardedfun PNfun ∨ FPmode = MIXmode ==> P =T rmPN P
lemma traces_FIXn_plus_sub_lm:
∀n m p. traces ((FIX[n] Pf) p) M ≤ traces ((FIX[n + m] Pf) p) M
lemma traces_FIXn_plus_sub:
traces ((FIX[n] Pf) p) M ≤ traces ((FIX[n + m] Pf) p) M
lemma semT_FIXn_plus_sub:
[[(FIX[n] Pf) p]]Tf M ≤ [[(FIX[n + m] Pf) p]]Tf M
lemma in_traces_FIXn_plus_sub:
t :t traces ((FIX[n] Pf) p) M ==> t :t traces ((FIX[n + m] Pf) p) M
lemma cspT_FIX_plus_eq:
∀f p. (FIX Pf) p =T[M,M] !nat n .. (FIX[n + f n] Pf) p