Theory CSP_T_law_fp

Up to index of Isabelle/HOL/HOL-Complex/CSP/CSP_T

theory CSP_T_law_fp
imports CSP_T_law_ufp
begin

           (*-------------------------------------------*
            |        CSP-Prover on Isabelle2004         |
            |               February 2005               |
            |                   June 2005  (modified)   |
            |                 August 2005  (modified)   |
            |                                           |
            |        CSP-Prover on Isabelle2005         |
            |                October 2005  (modified)   |
            |                                           |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)

theory CSP_T_law_fp = CSP_T_law_ufp:

(*****************************************************************

         1. cpo fixed point theory in CSP-Prover
         2.
         3.
         4. 

 *****************************************************************)

(*  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]

(*=======================================================*
 |                                                       |
 |                        CPO                            |
 |                                                       |
 *=======================================================*)

lemma cspT_Tarski_fix:
   "(FIX PF)(p) =T (!nat n .. (((PF^n) (%q. DIV)) p))"
apply (simp add: FIX_def FIXn_def)
done

lemmas cspT_FIX_eq = cspT_Banach_fix cspT_Tarski_fix

(*-----------*
 |    Bot    |
 *-----------*)

lemma traces_prod_Bot: "(%p. traces DIV) = 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 traces_prod_Bot)

(*-----------*
 |   FIX P   |
 *-----------*)

lemma traces_FIX:
    "PF : ProcFun ==>
     traces ((FIX PF) p)
     = UnionT {u. EX n. u = ((tracesFun PF) ^ n) Bot p}"
apply (simp add: FIX_def FIXn_def)
apply (subgoal_tac "{u. EX n. u = ((tracesFun PF) ^ 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 ^ a) (%q. DIV) p)" in exI)
 apply (simp)
 apply (rule_tac x="a" in exI)
 apply (simp add: tracesFun_compo_n_Tf[THEN sym])
 apply (simp add: iteration_in_ProcFun tracesFun_f_p)
 apply (simp add: traces_prod_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: tracesFun_compo_n_Tf[THEN sym])
 apply (simp add: iteration_in_ProcFun tracesFun_f_p)
 apply (simp add: traces_prod_Bot)
by (auto)

(*** [[ ]]T ***)

lemma semT_FIX:
    "PF : ProcFun ==>
     [[(FIX PF) p]]T
     = UnionT {u. EX n. u = ([[PF]]TFun ^ n) Bot p}"
apply (simp add: semT_to_traces)
apply (simp add: traces_FIX)
done

(*** FIX is LUB ***)

lemma semT_FIX_isLUB:
   "PF : ProcFun ==>
    (%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:
   "PF : ProcFun ==>
    (%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:
   "PF : ProcFun ==> (%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:
   "PF : ProcFun ==> [[(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:
   "PF : ProcFun ==> (%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 : ProcFun
    ==> [[PF]]TFun (%p. [[(FIX PF) p]]T) = (%p. [[(FIX PF) p]]T)"
apply (insert semT_FIX_isLFP[of PF], simp)
apply (simp add: isLFP_def)
done

lemma semT_FIX_LFP_least:
   "PF : ProcFun ==> 
    ALL Tf. [[PF]]TFun Tf = Tf --> (%p. [[(FIX PF) p]]T) <= Tf"
apply (insert semT_FIX_isLFP[of PF], simp)
apply (simp add: isLFP_def)
done

(*---------------------------------------------------------------------*
 |   FIX is the greatest fixed point of process-expression-functions   |
 |   (semantically least fixed point)                                  |
 *---------------------------------------------------------------------*)

lemma cspT_FIX_isGFP:
  "PF : ProcFun ==> 
   (FIX PF) =T' (PF (FIX PF)) & (ALL f. f =T' PF f --> f <=T' (FIX PF))"
apply (simp add: refT_prod_def eqT_prod_def)
apply (simp add: refT_def eqT_def)
apply (insert semT_FIX_isLFP[of PF], simp)
apply (rule)

 (* FP *)
 apply (simp add: expand_fun_eq[THEN sym])
 apply (simp add: semTFun_f_p)
 apply (simp add: isLFP_def)

 (* LFP *)
 apply (intro allI impI)
 apply (simp add: expand_fun_eq[THEN sym])
 apply (drule sym)
 apply (simp add: expand_fun_eq)
 apply (simp add: expand_fun_eq[THEN sym])
 apply (simp add: semTFun_f_p)
 apply (simp add: isLFP_def)
 apply (erule conjE)
 apply (drule_tac x="(%p. [[f p]]T)" in spec)
 apply (simp add: order_prod_def)
done

(*-------------------------------------------------------*
 |                                                       |
 |           Fixpoint unwind (CSP-Prover rule)           |
 |                                                       |
 *-------------------------------------------------------*)

lemma cspT_unwind_cpo_lm:
  "PF : ProcFun ==> ALL p. (FIX PF) p =T PF (FIX PF) p"
apply (simp add: eqT_def)
apply (simp add: expand_fun_eq[THEN sym])
apply (simp add: semTFun_f_p)
apply (simp add: semT_FIX_LFP_fixed_point)
done

(*** csp rule ***)

lemma cspT_unwind_cpo:
  "PF : ProcFun ==> (FIX PF) p =T PF (FIX PF) p"
by (simp add: cspT_unwind_cpo_lm)

lemmas cspT_unwind = cspT_unwind_cpo cspT_unwind_cms

(*-------------------------------------------------------*
 |                                                       |
 |        Check fixpoint  (CSP-Prover intro rule)        |
 |                                                       |
 *-------------------------------------------------------*)

lemma cspT_fp_induct_cpo_lm:
   "[| PF : ProcFun ; Q <=T f p ; ALL p. f p <=T (PF f) p |]
    ==> Q <=T (FIX PF) p"
apply (simp add: refT_def)
apply (simp add: fold_order_prod_def)
apply (simp add: semTFun_f_p)
apply (simp add: semT_FIX_LFP_p)
apply (insert cpo_fixpoint_induction_rev
       [of "[[PF]]TFun" "(%p. [[f p]]T)"])
apply (simp add: continuous_semTFun)
apply (simp add: order_prod_def)
apply (rotate_tac -1)
apply (drule_tac x="p" in spec)
apply (auto)
done

(*** csp rule ***)

lemma cspT_fp_induct_cpo:
   "[| PF : ProcFun ; Q <=T f p ; !!p. f p <=T (PF f) p |]
    ==> Q <=T (FIX PF) p"
by (simp add: cspT_fp_induct_cpo_lm)

(*=======================================================*
 |                                                       |
 |                           UFP                         |
 |                                                       |
 *=======================================================*)

lemma semT_FIX_UFP:
   "PF : gProcFun ==>
    (%p. [[(FIX PF) p]]T) = UFP [[PF]]TFun"
apply (subgoal_tac "[[PF]]TFun hasUFP")
apply (insert semT_FIX_isLFP[of PF], simp)
apply (subgoal_tac "UFP [[PF]]TFun isUFP [[PF]]TFun")
apply (simp add: isUFP_def)
apply (simp add: isLFP_def)
apply (elim conjE exE)
apply (rotate_tac -1)
apply (drule_tac x="(%p. [[(FIX PF) p]]T)" in spec)
apply (simp)
apply (simp add: UFP_is)
apply (simp add: contraction_semTFun Banach_thm_EX)
done

lemma traces_FIX_UFP:
   "PF : gProcFun ==>
    (%p. traces((FIX PF) p)) = UFP (tracesFun PF)"
apply (insert semT_FIX_UFP[of PF])
apply (simp add: semT_to_traces)
done

lemma semT_FIX_UFP_p:
   "PF : gProcFun ==>
    [[(FIX PF) p]]T = UFP [[PF]]TFun p"
apply (insert semT_FIX_UFP[of PF])
apply (simp add: expand_fun_eq)
done

lemma semT_FIX_isUFP:
   "PF : gProcFun ==>
    (%p. [[(FIX PF) p]]T) isUFP [[PF]]TFun"
apply (simp add: semT_FIX_UFP)
apply (simp add: contraction_semTFun Banach_thm_EX UFP_is)
done

lemma semT_FIX_UFP_unique:
   "PF : gProcFun ==>
    ALL Tf. [[PF]]TFun Tf = Tf --> (%p. [[(FIX PF) p]]T) = Tf"
apply (insert semT_FIX_isUFP[of PF], simp)
apply (simp add: isUFP_def)
done

(*=======================================================*
 |                                                       |
 |                   FIX <==> FIX1                       |
 |                                                       |
 *=======================================================*)

lemma semT_FIX_FIX1:
   "PF : gProcFun ==>
    (%p. [[(FIX PF) p]]T) = (%p. [[(FIX! PF) p]]T)"
apply (simp add: semT_FIX_UFP)
apply (simp add: semT_FIX1_UFP)
done

lemma semT_FIX_FIX1_p:
   "PF : gProcFun ==>
    [[(FIX PF) p]]T = [[(FIX! PF) p]]T"
apply (simp add: semT_FIX_UFP_p)
apply (simp add: semT_FIX1_UFP_p)
done

lemma cspT_FIX_FIX1:
   "PF : gProcFun ==>
    (FIX PF) p =T (FIX! PF) p"
apply (simp add: eqT_def)
apply (simp add: semT_FIX_FIX1_p)
done

(*------------------------------------------------------------------*
 |   FIX is the unique fixed point of process-expression-functions  |
 *------------------------------------------------------------------*)

lemma cspT_FIX_isUFP:
   "PF : gProcFun ==>
   (FIX PF) =T' (PF (FIX PF)) & (ALL f. f =T' PF f --> f =T' (FIX PF))"
apply (simp add: cspT_FIX_isGFP)
apply (simp add: eqT_prod_def)
apply (simp add: eqT_def)
apply (insert semT_FIX_isUFP[of PF], simp)

 (* UFP *)
 apply (intro allI impI)
 apply (simp add: expand_fun_eq[THEN sym])
 apply (drule sym)
 apply (simp add: expand_fun_eq)
 apply (simp add: expand_fun_eq[THEN sym])
 apply (simp add: semTFun_f_p)
 apply (simp add: isUFP_def)
 apply (erule conjE)
 apply (drule_tac x="(%p. [[f p]]T)" in spec)
 apply (simp add: expand_fun_eq)
done

(*-------------------------------------------------------*
 |                                                       |
 |        Check fixpoint  (CSP-Prover intro rule)        |
 |                                                       |
 *-------------------------------------------------------*)

(* refinement *)

lemma cspT_fp_induct_cpo_ref_left_lm:
   "[| PF : gProcFun  ;
       f p <=T Q ; ALL p. (PF f) p <=T f p |]
    ==> (FIX PF) p <=T Q"
apply (rule cspT_rw_left)
apply (rule cspT_FIX_FIX1)
apply (simp_all)
apply (simp add: cspT_fp_induct_cms_ref_left_lm)
done

(*** csp rule ***)

lemma cspT_fp_induct_cpo_ref_left:
   "[| PF : gProcFun  ;
       f p <=T Q ; !! p. (PF f) p <=T f p |]
    ==> (FIX PF) p <=T Q"
by (simp add: cspT_fp_induct_cpo_ref_left_lm)

(* equivalence *)

lemma cspT_fp_induct_cpo_eq_left_lm:
   "[| PF : gProcFun  ;
       f p =T Q ; ALL p. (PF f) p =T f p |]
    ==> (FIX PF) p =T Q"
apply (rule cspT_rw_left)
apply (rule cspT_FIX_FIX1)
apply (simp_all)
apply (simp add: cspT_fp_induct_cms_eq_left_lm)
done

(*** csp rule ***)

lemma cspT_fp_induct_cpo_eq_left:
   "[| PF : gProcFun ;
       f p =T Q ; !! p. (PF f) p =T f p |]
    ==> (FIX PF) p =T Q"
by (simp add: cspT_fp_induct_cpo_eq_left_lm)


lemma cspT_fp_induct_cpo_eq_right:
   "[| PF : gProcFun ; 
       Q =T f p ; !! p. f p =T (PF f) p |]
    ==> Q =T (FIX PF) p"
apply (rule cspT_sym)
apply (rule cspT_fp_induct_cpo_eq_left)
apply (simp)
apply (rule cspT_sym)
apply (simp)
apply (rule cspT_sym)
apply (simp)
done

lemmas cspT_fp_induct_cpo_right = 
       cspT_fp_induct_cpo cspT_fp_induct_cpo_eq_right

lemmas cspT_fp_induct_cpo_left = 
       cspT_fp_induct_cpo_ref_left cspT_fp_induct_cpo_eq_left

(*** cpo and cms ***)

lemmas cspT_fp_induct_right = cspT_fp_induct_cpo_right cspT_fp_induct_cms_right
lemmas cspT_fp_induct_left = cspT_fp_induct_cpo_left cspT_fp_induct_cms_left

(*-------------------------------------------------------*
 |                                                       |
 |         FIX expansion (CSP-Prover intro rule)         |
 |                                                       |
 *-------------------------------------------------------*)

lemma traces_FIXn_plus_sub_lm:
 "PF : ProcFun ==>
  ALL n m p. traces ((FIX[n] PF) p) <= traces ((FIX[n+m] PF) p)"
apply (rule)
apply (induct_tac n)
apply (simp add: FIXn_def)
apply (intro allI)
apply (rule)
apply (simp add: in_traces)

apply (rule allI)
apply (simp add: FIXn_def)
apply (drule_tac x="m" in spec)
apply (simp add: tracesFun_f_p)
apply (fold order_prod_def)
apply (simp add: mono_tracesFun[simplified mono_def])
done

lemma traces_FIXn_plus_sub: 
   "PF : ProcFun ==> traces ((FIX[n] PF) p) <= traces ((FIX[n+m] PF) p)"
by (simp add: traces_FIXn_plus_sub_lm)

lemma semT_FIXn_plus_sub:
 "PF : ProcFun ==> [[(FIX[n] PF) p]]T <= [[(FIX[n+m] PF) p]]T"
apply (simp add: semT_to_traces)
apply (simp add: traces_FIXn_plus_sub)
done

lemma in_traces_FIXn_plus_sub: 
  "[| PF : ProcFun ; t :t traces ((FIX[n] PF) p) |] ==> t :t traces ((FIX[n+m] PF) p)"
apply (insert traces_FIXn_plus_sub[of PF n p m])
by (auto)

(*-----------------------------------------------------*
 |  sometimes FIX[n + f n] is useful more than FIX[n]  |
 *-----------------------------------------------------*)

lemma cspT_FIX_plus_eq: 
     "PF : ProcFun ==>
      ALL f p. (FIX PF) p =T (!nat n .. ((FIX[n + f n] PF) p))"
apply (simp add: FIX_def)
apply (simp add: eqT_def)
apply (intro allI)
apply (simp add: semT_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="a" 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="a + f a" in exI)
 apply (simp)
done

lemma cspT_FIX_plus_eq_fun: 
     "PF : ProcFun ==>
      ALL f p. (%p. (FIX PF) p) =T' (%p. (!nat n .. ((FIX[n + f n] PF) p)))"
apply (simp add: eqT_prod_def)
apply (simp add: cspT_FIX_plus_eq)
done

(*=======================================================*
 |                                                       |
 |                Single recursion MU                    |
 |                                                       |
 *=======================================================*)

(*=======================================================*
 |                         cpo                           |
 *=======================================================*)

(*---------------------------------------------------------------------*
 |   MU is the greatest fixed point of process-expression-functions    |
 |   (semantically least fixed point)                                  |
 *---------------------------------------------------------------------*)

lemma cspT_MU_isGFP:
  "PX : ProcX
    ==> MUX PX =T PX (MUX PX) & (ALL P. P =T PX P --> P <=T (MUX PX))"
apply (simp add: MUX_def)
apply (insert cspT_FIX_isGFP[of "(%f p. PX (f MUp))"])
apply (simp add: ProcX_def ProcFun_def)
apply (simp add: eqT_prod_def refT_prod_def)
apply (intro allI impI)
apply (elim conjE)
apply (drule_tac x="(%p. P)" in spec)
apply (simp)
done

(*-------------------------------------------------------*
 |            unwinding (CSP-Prover intro rule)          |
 *-------------------------------------------------------*)

lemma cspT_unwind_MU_cpo:
  "PX : ProcX ==> MUX PX =T PX (MUX PX)"
apply (simp add: MUX_def)
apply (insert cspT_unwind[of "(%f p. PX (f MUp))" "MUp"])
apply (simp add: ProcX_def)
apply (simp add: ProcFun_def)
done

lemmas cspT_unwind_MU = cspT_unwind_MU_cms cspT_unwind_MU_cpo

(*-------------------------------------------------------*
 |        Check fixpoint  (CSP-Prover intro rule)        |
 *-------------------------------------------------------*)

lemma cspT_fp_induct_MU_cpo:
   "[| PX : ProcX ; Q <=T PX Q |] ==> Q <=T (MUX PX)"
apply (simp add: MUX_def)
apply (rule cspT_fp_induct_cpo[of _ _ "(%X. Q)"])
apply (simp add: ProcX_def)
apply (simp add: ProcFun_def)
apply (simp)
apply (simp)
done

(*=======================================================*
 |                      unique                           |
 *=======================================================*)

(*-------------------------------------------------------*
 |        Check fixpoint  (CSP-Prover intro rule)        |
 *-------------------------------------------------------*)

lemma cspT_fp_induct_MU_cpo_ref_left:
   "[| PX : gProcX ; PX Q <=T Q |]
    ==> (MUX PX) <=T Q"
apply (simp add: MUX_def)
apply (rule cspT_fp_induct_cpo_ref_left[of _ "(%X. Q)"])
apply (simp add: gProcX_def)
apply (simp add: gProcFun_def)
apply (simp)
apply (simp)
done

lemma cspT_fp_induct_MU_cpo_eq_left:
   "[| PX : gProcX ; PX Q =T Q |]
    ==> (MUX PX) =T Q"
apply (simp add: MUX_def)
apply (rule cspT_fp_induct_cpo_eq_left[of _ "(%X. Q)"])
apply (simp add: gProcX_def)
apply (simp add: gProcFun_def)
apply (simp)
apply (simp)
done

lemma cspT_fp_induct_MU_cpo_eq_right:
   "[| PX : gProcX ; Q =T PX Q |]
    ==> Q =T (MUX PX)"
apply (rule cspT_sym)
apply (rule cspT_fp_induct_MU_cpo_eq_left)
apply (simp)
apply (rule cspT_sym)
apply (simp)
done

lemmas cspT_fp_induct_MU_cpo_right
     = cspT_fp_induct_MU_cpo cspT_fp_induct_MU_cpo_eq_right

lemmas cspT_fp_induct_MU_cpo_left
     = cspT_fp_induct_MU_cpo_ref_left cspT_fp_induct_MU_cpo_eq_left

(*** cpo and cms ***)

lemmas cspT_fp_induct_MU_right = cspT_fp_induct_MU_cpo_right
                                 cspT_fp_induct_MU_cms_right

lemmas cspT_fp_induct_MU_left = cspT_fp_induct_MU_cpo_left
                                cspT_fp_induct_MU_cms_left

(*=======================================================*
 |                   MUX <==> MUX1                       |
 *=======================================================*)

lemma cspT_MU_MU1:
   "PX : gProcX ==> (MUX PX) =T (MUX! PX)"
apply (simp add: MUX_def)
apply (simp add: MUX1_def)
apply (rule cspT_FIX_FIX1)
apply (simp add: gProcX_def)
apply (simp add: gProcFun_def)
done

(*=======================================================*
 |                   expand by Tariski                   |
 *=======================================================*)

lemma cspT_MU_plus_eq_lm: 
     "((%f p. (PX::'a proc => 'a proc) (f MUp)) ^ n) (%q. DIV) MUp = (PX ^ n) DIV"
apply (induct_tac n)
apply (simp_all)
done

lemma cspT_MU_plus_eq: 
     "PX : ProcX ==>
      ALL f. (MUX PX) =T (!nat n .. (PX ^ (n + f n)) DIV)"
apply (insert cspT_FIX_plus_eq[of "(%f p. PX (f MUp))"])
apply (simp add: ProcX_def)
apply (simp add: ProcFun_def)
apply (rule allI)
apply (drule_tac x="f" in spec)
apply (simp add: MUX_def)
apply (drule_tac x="MUp" in spec)
apply (simp add: FIXn_def)
apply (simp add: cspT_MU_plus_eq_lm)
done

lemma cspT_MU_eq_cpo: 
     "PX : ProcX ==>
      (MUX PX) =T (!nat n .. (PX ^ n) DIV)"
apply (insert cspT_MU_plus_eq[of PX])
apply (simp)
apply (drule_tac x="(%n. (0::nat))" in spec)
apply (simp)
done

lemmas cspT_MU_eq = cspT_MU_eq_cms cspT_MU_eq_cpo

(****************** to add them again ******************)

declare Union_image_eq [simp]
declare Inter_image_eq [simp]

end

lemma cspT_Tarski_fix:

  (FIX PF) p =T !nat n .. (PF ^ n) (%q. DIV) p

lemmas cspT_FIX_eq:

  (FIX! PF) p =T !nat n .. (PF ^ n) (%q. AnyInitProc) p |. n
  (FIX PF) p =T !nat n .. (PF ^ n) (%q. DIV) p

lemmas cspT_FIX_eq:

  (FIX! PF) p =T !nat n .. (PF ^ n) (%q. AnyInitProc) p |. n
  (FIX PF) p =T !nat n .. (PF ^ n) (%q. DIV) p

lemma traces_prod_Bot:

  (%p. traces DIV) = Bot

lemma semT_prod_Bot:

  (%p. [[DIV]]T) = Bot

lemma traces_FIX:

  PF ∈ ProcFun
  ==> traces ((FIX PF) p) = UnionT {u. ∃n. u = (tracesFun PF ^ n) Bot p}

lemma semT_FIX:

  PF ∈ ProcFun ==> [[(FIX PF) p]]T = UnionT {u. ∃n. u = ([[PF]]TFun ^ n) Bot p}

lemma semT_FIX_isLUB:

  PF ∈ ProcFun ==> (%p. [[(FIX PF) p]]T) isLUB {x. ∃n. x = ([[PF]]TFun ^ n) Bot}

lemma semT_FIX_LUB:

  PF ∈ ProcFun ==> (%p. [[(FIX PF) p]]T) = LUB {x. ∃n. x = ([[PF]]TFun ^ n) Bot}

lemma semT_FIX_LFP:

  PF ∈ ProcFun ==> (%p. [[(FIX PF) p]]T) = LFP [[PF]]TFun

lemma semT_FIX_LFP_p:

  PF ∈ ProcFun ==> [[(FIX PF) p]]T = LFP [[PF]]TFun p

lemma semT_FIX_isLFP:

  PF ∈ ProcFun ==> (%p. [[(FIX PF) p]]T) isLFP [[PF]]TFun

lemma semT_FIX_LFP_fixed_point:

  PF ∈ ProcFun ==> [[PF]]TFun (%p. [[(FIX PF) p]]T) = (%p. [[(FIX PF) p]]T)

lemma semT_FIX_LFP_least:

  PF ∈ ProcFun ==> ∀Tf. [[PF]]TFun Tf = Tf --> (%p. [[(FIX PF) p]]T) ≤ Tf

lemma cspT_FIX_isGFP:

  PF ∈ ProcFun ==> FIX PF =T' PF (FIX PF) ∧ (∀f. f =T' PF f --> f <=T' FIX PF)

lemma cspT_unwind_cpo_lm:

  PF ∈ ProcFun ==> ∀p. (FIX PF) p =T PF (FIX PF) p

lemma cspT_unwind_cpo:

  PF ∈ ProcFun ==> (FIX PF) p =T PF (FIX PF) p

lemmas cspT_unwind:

  PF ∈ ProcFun ==> (FIX PF) p =T PF (FIX PF) p
  PF ∈ gProcFun ==> (FIX! PF) p =T PF (FIX! PF) p

lemmas cspT_unwind:

  PF ∈ ProcFun ==> (FIX PF) p =T PF (FIX PF) p
  PF ∈ gProcFun ==> (FIX! PF) p =T PF (FIX! PF) p

lemma cspT_fp_induct_cpo_lm:

  [| PF ∈ ProcFun; Q <=T f p; ∀p. f p <=T PF f p |] ==> Q <=T (FIX PF) p

lemma cspT_fp_induct_cpo:

  [| PF ∈ ProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX PF) p

lemma semT_FIX_UFP:

  PF ∈ gProcFun ==> (%p. [[(FIX PF) p]]T) = UFP [[PF]]TFun

lemma traces_FIX_UFP:

  PF ∈ gProcFun ==> (%p. traces ((FIX PF) p)) = UFP (tracesFun PF)

lemma semT_FIX_UFP_p:

  PF ∈ gProcFun ==> [[(FIX PF) p]]T = UFP [[PF]]TFun p

lemma semT_FIX_isUFP:

  PF ∈ gProcFun ==> (%p. [[(FIX PF) p]]T) isUFP [[PF]]TFun

lemma semT_FIX_UFP_unique:

  PF ∈ gProcFun ==> ∀Tf. [[PF]]TFun Tf = Tf --> (%p. [[(FIX PF) p]]T) = Tf

lemma semT_FIX_FIX1:

  PF ∈ gProcFun ==> (%p. [[(FIX PF) p]]T) = (%p. [[(FIX! PF) p]]T)

lemma semT_FIX_FIX1_p:

  PF ∈ gProcFun ==> [[(FIX PF) p]]T = [[(FIX! PF) p]]T

lemma cspT_FIX_FIX1:

  PF ∈ gProcFun ==> (FIX PF) p =T (FIX! PF) p

lemma cspT_FIX_isUFP:

  PF ∈ gProcFun ==> FIX PF =T' PF (FIX PF) ∧ (∀f. f =T' PF f --> f =T' FIX PF)

lemma cspT_fp_induct_cpo_ref_left_lm:

  [| PF ∈ gProcFun; f p <=T Q; ∀p. PF f p <=T f p |] ==> (FIX PF) p <=T Q

lemma cspT_fp_induct_cpo_ref_left:

  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX PF) p <=T Q

lemma cspT_fp_induct_cpo_eq_left_lm:

  [| PF ∈ gProcFun; f p =T Q; ∀p. PF f p =T f p |] ==> (FIX PF) p =T Q

lemma cspT_fp_induct_cpo_eq_left:

  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX PF) p =T Q

lemma cspT_fp_induct_cpo_eq_right:

  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX PF) p

lemmas cspT_fp_induct_cpo_right:

  [| PF ∈ ProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX PF) p

lemmas cspT_fp_induct_cpo_right:

  [| PF ∈ ProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX PF) p

lemmas cspT_fp_induct_cpo_left:

  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX PF) p =T Q

lemmas cspT_fp_induct_cpo_left:

  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX PF) p =T Q

lemmas cspT_fp_induct_right:

  [| PF ∈ ProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX PF) p
  [| PF ∈ gProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX! PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX! PF) p

lemmas cspT_fp_induct_right:

  [| PF ∈ ProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX PF) p
  [| PF ∈ gProcFun; Q <=T f p; !!p. f p <=T PF f p |] ==> Q <=T (FIX! PF) p
  [| PF ∈ gProcFun; Q =T f p; !!p. f p =T PF f p |] ==> Q =T (FIX! PF) p

lemmas cspT_fp_induct_left:

  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX PF) p =T Q
  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX! PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX! PF) p =T Q

lemmas cspT_fp_induct_left:

  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX PF) p =T Q
  [| PF ∈ gProcFun; f p <=T Q; !!p. PF f p <=T f p |] ==> (FIX! PF) p <=T Q
  [| PF ∈ gProcFun; f p =T Q; !!p. PF f p =T f p |] ==> (FIX! PF) p =T Q

lemma traces_FIXn_plus_sub_lm:

  PF ∈ ProcFun ==> ∀n m p. traces ((FIX[n] PF) p) ≤ traces ((FIX[n + m] PF) p)

lemma traces_FIXn_plus_sub:

  PF ∈ ProcFun ==> traces ((FIX[n] PF) p) ≤ traces ((FIX[n + m] PF) p)

lemma semT_FIXn_plus_sub:

  PF ∈ ProcFun ==> [[(FIX[n] PF) p]]T ≤ [[(FIX[n + m] PF) p]]T

lemma in_traces_FIXn_plus_sub:

  [| PF ∈ ProcFun; t :t traces ((FIX[n] PF) p) |]
  ==> t :t traces ((FIX[n + m] PF) p)

lemma cspT_FIX_plus_eq:

  PF ∈ ProcFun ==> ∀f p. (FIX PF) p =T !nat n .. (FIX[n + f n] PF) p

lemma cspT_FIX_plus_eq_fun:

  PF ∈ ProcFun ==> ∀f p. FIX PF =T' (%p. !nat n .. (FIX[n + f n] PF) p)

lemma cspT_MU_isGFP:

  PX ∈ ProcX ==> MUX PX =T PX (MUX PX) ∧ (∀P. P =T PX P --> P <=T MUX PX)

lemma cspT_unwind_MU_cpo:

  PX ∈ ProcX ==> MUX PX =T PX (MUX PX)

lemmas cspT_unwind_MU:

  PX ∈ gProcX ==> MUX! PX =T PX (MUX! PX)
  PX ∈ ProcX ==> MUX PX =T PX (MUX PX)

lemmas cspT_unwind_MU:

  PX ∈ gProcX ==> MUX! PX =T PX (MUX! PX)
  PX ∈ ProcX ==> MUX PX =T PX (MUX PX)

lemma cspT_fp_induct_MU_cpo:

  [| PX ∈ ProcX; Q <=T PX Q |] ==> Q <=T MUX PX

lemma cspT_fp_induct_MU_cpo_ref_left:

  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX PX <=T Q

lemma cspT_fp_induct_MU_cpo_eq_left:

  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX PX =T Q

lemma cspT_fp_induct_MU_cpo_eq_right:

  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX PX

lemmas cspT_fp_induct_MU_cpo_right:

  [| PX ∈ ProcX; Q <=T PX Q |] ==> Q <=T MUX PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX PX

lemmas cspT_fp_induct_MU_cpo_right:

  [| PX ∈ ProcX; Q <=T PX Q |] ==> Q <=T MUX PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX PX

lemmas cspT_fp_induct_MU_cpo_left:

  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX PX =T Q

lemmas cspT_fp_induct_MU_cpo_left:

  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX PX =T Q

lemmas cspT_fp_induct_MU_right:

  [| PX ∈ ProcX; Q <=T PX Q |] ==> Q <=T MUX PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX PX
  [| PX ∈ gProcX; Q <=T PX Q |] ==> Q <=T MUX! PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX! PX

lemmas cspT_fp_induct_MU_right:

  [| PX ∈ ProcX; Q <=T PX Q |] ==> Q <=T MUX PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX PX
  [| PX ∈ gProcX; Q <=T PX Q |] ==> Q <=T MUX! PX
  [| PX ∈ gProcX; Q =T PX Q |] ==> Q =T MUX! PX

lemmas cspT_fp_induct_MU_left:

  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX PX =T Q
  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX! PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX! PX =T Q

lemmas cspT_fp_induct_MU_left:

  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX PX =T Q
  [| PX ∈ gProcX; PX Q <=T Q |] ==> MUX! PX <=T Q
  [| PX ∈ gProcX; PX Q =T Q |] ==> MUX! PX =T Q

lemma cspT_MU_MU1:

  PX ∈ gProcX ==> MUX PX =T MUX! PX

lemma cspT_MU_plus_eq_lm:

  ((%f p. PX (f MUp)) ^ n) (%q. DIV) MUp = (PX ^ n) DIV

lemma cspT_MU_plus_eq:

  PX ∈ ProcX ==> ∀f. MUX PX =T !nat n .. (PX ^ (n + f n)) DIV

lemma cspT_MU_eq_cpo:

  PX ∈ ProcX ==> MUX PX =T !nat n .. (PX ^ n) DIV

lemmas cspT_MU_eq:

  PX ∈ gProcX ==> MUX! PX =T !nat n .. (PX ^ n) AnyInitProc |. n
  PX ∈ ProcX ==> MUX PX =T !nat n .. (PX ^ n) DIV

lemmas cspT_MU_eq:

  PX ∈ gProcX ==> MUX! PX =T !nat n .. (PX ^ n) AnyInitProc |. n
  PX ∈ ProcX ==> MUX PX =T !nat n .. (PX ^ n) DIV