Theory CSP_T_law_ref

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

theory CSP_T_law_ref
imports CSP_T_law_basic
begin

           (*-------------------------------------------*
            |        CSP-Prover on Isabelle2004         |
            |               December 2004               |
            |                   June 2005  (modified)   |
            |              September 2005  (modified)   |
            |                                           |
            |        CSP-Prover on Isabelle2005         |
            |                October 2005  (modified)   |
            |                                           |
            |        Yoshinao Isobe (AIST JAPAN)        |
            *-------------------------------------------*)

theory CSP_T_law_ref = CSP_T_law_basic:

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

         1. rules for refinement

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

(*-------------------------------------------------------*
 |              decompose Internal choice                |
 *-------------------------------------------------------*)

(*** or <= ***)                                         (* unsafe *)

lemma cspT_Int_choice_left1:
  "P1 <=T Q ==> P1 |~| P2 <=T Q"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

lemma cspT_Int_choice_left2:
  "P2 <=T Q ==> P1 |~| P2 <=T Q"
apply (rule cspT_rw_left)
apply (rule cspT_commut)
by (simp add: cspT_Int_choice_left1)

(*** <= and ***)                                          (* safe *)

lemma cspT_Int_choice_right:
  "[| P <=T Q1 ; P <=T Q2 |]
      ==> P <=T Q1 |~| Q2"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

(*-------------------------------------------------------*
 |        decompose Replicated internal choice           |
 *-------------------------------------------------------*)

(*** EX <= ***)                                           (* unsafe *)

lemma cspT_Rep_int_choice0_left:
  "(EX c. c:C & Pf c <=T Q)
      ==> !! :C .. Pf <=T Q"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

lemma cspT_Rep_int_choice0_left_x:
  "[| x:C ; Pf x <=T Q |]
  ==> !! :C .. Pf <=T Q"
apply (rule cspT_Rep_int_choice0_left)
by (fast)

lemma cspT_Rep_int_choice_fun_left:
  "[| inj f ; (EX a. a:X & Pf a <=T Q) |]
      ==> !!<f> :X .. Pf <=T Q"
apply (simp add: Rep_int_choice_fun_def)
apply (rule cspT_Rep_int_choice0_left)
apply (force)
done

lemma cspT_Rep_int_choice_fun_left_x:
  "[| inj f ; x:X ; Pf x <=T Q |]
  ==> !!<f> :X .. Pf <=T Q"
apply (rule cspT_Rep_int_choice_fun_left)
by (auto)

lemma cspT_Rep_int_choice2_left:
  "(EX X. X:Xs & Pf X <=T Q)
      ==> !set :Xs .. Pf <=T Q"
by (simp add: cspT_Rep_int_choice_fun_left)

lemma cspT_Rep_int_choice3_left:
  "(EX n. n:N & Pf n <=T Q)
      ==> !nat :N .. Pf <=T Q"
by (simp add: cspT_Rep_int_choice_fun_left)

lemma cspT_Rep_int_choice1_left:
  "(EX a. a:X & Pf a <=T Q)
      ==> ! :X .. Pf <=T Q"
apply (simp add: Rep_int_choice_com_def)
apply (rule cspT_Rep_int_choice2_left)
apply (elim conjE exE)
apply (rule_tac x="{a}" in exI)
apply (simp)
done

lemma cspT_Rep_int_choice_f_left:
  "[| inj f ; (EX a. a:X & Pf a <=T Q) |]
      ==> !<f> :X .. Pf <=T Q"
apply (simp add: Rep_int_choice_f_def)
apply (rule cspT_Rep_int_choice1_left)
apply (erule exE)
apply (rule_tac x="f a" in exI)
apply (simp)
done

(* x *)

lemma cspT_Rep_int_choice2_left_x:
  "[| x:Xs ; Pf x <=T Q |]
  ==> !set :Xs .. Pf <=T Q"
by (simp add: cspT_Rep_int_choice_fun_left_x)

lemma cspT_Rep_int_choice3_left_x:
  "[| x:N ; Pf x <=T Q |]
  ==> !nat :N .. Pf <=T Q"
by (simp add: cspT_Rep_int_choice_fun_left_x)

lemma cspT_Rep_int_choice1_left_x:
  "[| x:X ; Pf x <=T Q |]
  ==> ! :X .. Pf <=T Q"
apply (simp add: Rep_int_choice_com_def)
apply (rule cspT_Rep_int_choice2_left_x[of "{x}"])
apply (simp)
apply (simp)
done

lemma cspT_Rep_int_choice_f_left_x:
  "[| inj f ; x:X ; Pf x <=T Q |]
      ==> !<f> :X .. Pf <=T Q"
apply (simp add: Rep_int_choice_f_def)
apply (rule cspT_Rep_int_choice1_left)
apply (rule_tac x="f x" in exI)
apply (simp)
done

lemmas cspT_Rep_int_choice_left = cspT_Rep_int_choice0_left
                                  cspT_Rep_int_choice1_left
                                  cspT_Rep_int_choice2_left
                                  cspT_Rep_int_choice3_left
                                  cspT_Rep_int_choice_f_left

lemmas cspT_Rep_int_choice_left_x = cspT_Rep_int_choice0_left_x
                                    cspT_Rep_int_choice1_left_x
                                    cspT_Rep_int_choice2_left_x
                                    cspT_Rep_int_choice3_left_x
                                    cspT_Rep_int_choice_f_left_x


(*** <= ALL ***)                                         (* safe *)

lemma cspT_Rep_int_choice0_right:
  "[| !!c. c:C ==> P <=T Qf c |]
               ==> P <=T !! :C .. Qf"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

lemma cspT_Rep_int_choice0_rightE:
  "[| P <=T !! :C .. Qf ;
      ALL c:C. P <=T Qf c ==> R
   |] ==> R"
apply (simp add: cspT_semantics)
apply (simp add: subdomT_iff)
apply (simp add: in_traces)
apply (force)
done

(* f *)

lemma cspT_Rep_int_choice_fun_right:
  "[| inj f ; !!a. a:X ==> P <=T Qf a |]
               ==> P <=T !!<f> :X .. Qf"
apply (simp add: Rep_int_choice_fun_def)
apply (rule cspT_Rep_int_choice0_right)
apply (force)
done

lemma cspT_Rep_int_choice_fun_rightE:
  "[| P <=T !!<f> :X .. Qf ; inj f ;
      ALL a:X. P <=T Qf a ==> R
   |] ==> R"
apply (simp add: Rep_int_choice_fun_def)
apply (erule cspT_Rep_int_choice0_rightE)
apply (force)
done

(* 1,2,3,f *)

lemma cspT_Rep_int_choice2_right:
  "[| !!X. X:Xs ==> P <=T Qf X |]
               ==> P <=T !set :Xs .. Qf"
by (simp add: cspT_Rep_int_choice_fun_right)

lemma cspT_Rep_int_choice3_right:
  "[| !!n. n:N ==> P <=T Qf n |]
               ==> P <=T !nat :N .. Qf"
by (simp add: cspT_Rep_int_choice_fun_right)

lemma cspT_Rep_int_choice1_right:
  "[| !!a. a:X ==> P <=T Qf a |]
               ==> P <=T ! :X .. Qf"
apply (simp add: Rep_int_choice_com_def)
apply (rule cspT_Rep_int_choice2_right)
apply (force)
done

lemma cspT_Rep_int_choice_f_right:
  "[| inj f ; !!a. a:X ==> P <=T Qf a |]
               ==> P <=T !<f> :X .. Qf"
apply (simp add: Rep_int_choice_f_def)
apply (rule cspT_Rep_int_choice1_right)
apply (simp add: image_iff)
apply (elim bexE)
apply (simp)
done

(* 1,2,3,f E *)

lemma cspT_Rep_int_choice2_rightE:
  "[| P <=T !set :Xs .. Qf ;
      ALL X:Xs. P <=T Qf X ==> R
   |] ==> R"
apply (erule cspT_Rep_int_choice_fun_rightE)
by (auto)

lemma cspT_Rep_int_choice3_rightE:
  "[| P <=T !nat :N .. Qf ;
      ALL n:N. P <=T Qf n ==> R
   |] ==> R"
apply (erule cspT_Rep_int_choice_fun_rightE)
by (auto)

lemma cspT_Rep_int_choice1_rightE:
  "[| P <=T ! :X .. Qf ;
      ALL a:X. P <=T Qf a ==> R
   |] ==> R"
apply (simp add: Rep_int_choice_com_def)
apply (erule cspT_Rep_int_choice2_rightE)
apply (force)
done

lemma cspT_Rep_int_choice_f_rightE:
  "[| P <=T !<f> :X .. Qf ; inj f ;
      [| ALL a:X. P <=T Qf a |] ==> R
   |] ==> R"
apply (simp add: Rep_int_choice_f_def)
apply (erule cspT_Rep_int_choice1_rightE)
apply (simp add: image_iff)
done

lemmas cspT_Rep_int_choice_right 
     = cspT_Rep_int_choice0_right
       cspT_Rep_int_choice1_right
       cspT_Rep_int_choice2_right
       cspT_Rep_int_choice3_right
       cspT_Rep_int_choice_f_right

lemmas cspT_Rep_int_choice_rightE
     = cspT_Rep_int_choice0_rightE
       cspT_Rep_int_choice1_rightE
       cspT_Rep_int_choice2_rightE
       cspT_Rep_int_choice3_rightE
       cspT_Rep_int_choice_f_rightE

(*-------------------------------------------------------*
 |             decomposition with subset                 |
 *-------------------------------------------------------*)

(*** Rep_int_choice ***)                                        (* unsafe *)

lemma cspT_Rep_int_choice0_subset:
  "[| C2 <= C1  ; !!c. c:C2 ==> Pf c <=T Qf c |]
                    ==> !! :C1 .. Pf <=T !! :C2 .. Qf"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

lemma cspT_Rep_int_choice_fun_subset:
  "[| inj f ; Y <= X  ; !!a. a:Y ==> Pf a <=T Qf a |]
                    ==> !!<f> :X .. Pf <=T !!<f> :Y .. Qf"
apply (simp add: Rep_int_choice_fun_def)
apply (rule cspT_Rep_int_choice0_subset)
apply (force)
apply (force)
done

lemma cspT_Rep_int_choice2_subset:
  "[| Ys <= Xs  ; !!X. X:Ys ==> Pf X <=T Qf X |]
                    ==> !set :Xs .. Pf <=T !set :Ys .. Qf"
by (simp add: cspT_Rep_int_choice_fun_subset)

lemma cspT_Rep_int_choice3_subset:
  "[| N2 <= N1  ; !!n. n:N2 ==> Pf n <=T Qf n |]
                    ==> !nat :N1 .. Pf <=T !nat :N2 .. Qf"
by (simp add: cspT_Rep_int_choice_fun_subset)

lemma cspT_Rep_int_choice1_subset:
  "[| Y <= X  ; !!a. a:Y ==> Pf a <=T Qf a |]
                    ==> ! :X .. Pf <=T ! :Y .. Qf"
apply (simp add: Rep_int_choice_com_def)
apply (rule cspT_Rep_int_choice2_subset)
apply (auto)
done

lemma cspT_Rep_int_choice_f_subset:
  "[| inj f ; Y <= X  ; !!a. a:Y ==> Pf a <=T Qf a |]
                    ==> !<f> :X .. Pf <=T !<f> :Y .. Qf"
apply (simp add: Rep_int_choice_f_def)
apply (rule cspT_Rep_int_choice1_subset)
apply (auto simp add: image_def)
done

lemmas cspT_Rep_int_choice_subset 
     = cspT_Rep_int_choice0_subset
       cspT_Rep_int_choice1_subset
       cspT_Rep_int_choice2_subset
       cspT_Rep_int_choice3_subset
       cspT_Rep_int_choice_f_subset

(*** ! x:X .. and ? -> ***)

lemma cspT_Int_Ext_pre_choice_subset:
  "[| Y ~={} ; Y <= X ; !!a. a:Y ==> Pf a <=T Qf a |]
        ==> ! x:X .. (x -> Pf x) <=T
            ? :Y -> Qf"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

lemmas cspT_decompo_subset = cspT_Rep_int_choice_subset
                             cspT_Int_Ext_pre_choice_subset

(*-------------------------------------------------------*
 |               decompose external choice               |
 *-------------------------------------------------------*)

lemma cspT_Ext_choice_right:
  "[| P <=T Q1 ;
      P <=T Q2 |]
      ==> P <=T Q1 [+] Q2"
apply (simp add: cspT_semantics)
apply (rule, simp add: in_traces)
apply (force)
done

end

lemma cspT_Int_choice_left1:

  P1.0 <=T Q ==> P1.0 |~| P2.0 <=T Q

lemma cspT_Int_choice_left2:

  P2.0 <=T Q ==> P1.0 |~| P2.0 <=T Q

lemma cspT_Int_choice_right:

  [| P <=T Q1.0; P <=T Q2.0 |] ==> P <=T Q1.0 |~| Q2.0

lemma cspT_Rep_int_choice0_left:

c. cCPf c <=T Q ==> !! :C .. Pf <=T Q

lemma cspT_Rep_int_choice0_left_x:

  [| xC; Pf x <=T Q |] ==> !! :C .. Pf <=T Q

lemma cspT_Rep_int_choice_fun_left:

  [| inj f; ∃a. aXPf a <=T Q |] ==> !!<f> :X .. Pf <=T Q

lemma cspT_Rep_int_choice_fun_left_x:

  [| inj f; xX; Pf x <=T Q |] ==> !!<f> :X .. Pf <=T Q

lemma cspT_Rep_int_choice2_left:

X. XXsPf X <=T Q ==> !set :Xs .. Pf <=T Q

lemma cspT_Rep_int_choice3_left:

n. nNPf n <=T Q ==> !nat :N .. Pf <=T Q

lemma cspT_Rep_int_choice1_left:

a. aXPf a <=T Q ==> ! :X .. Pf <=T Q

lemma cspT_Rep_int_choice_f_left:

  [| inj f; ∃a. aXPf a <=T Q |] ==> !<f> :X .. Pf <=T Q

lemma cspT_Rep_int_choice2_left_x:

  [| xXs; Pf x <=T Q |] ==> !set :Xs .. Pf <=T Q

lemma cspT_Rep_int_choice3_left_x:

  [| xN; Pf x <=T Q |] ==> !nat :N .. Pf <=T Q

lemma cspT_Rep_int_choice1_left_x:

  [| xX; Pf x <=T Q |] ==> ! :X .. Pf <=T Q

lemma cspT_Rep_int_choice_f_left_x:

  [| inj f; xX; Pf x <=T Q |] ==> !<f> :X .. Pf <=T Q

lemmas cspT_Rep_int_choice_left:

c. cCPf c <=T Q ==> !! :C .. Pf <=T Q
a. aXPf a <=T Q ==> ! :X .. Pf <=T Q
X. XXsPf X <=T Q ==> !set :Xs .. Pf <=T Q
n. nNPf n <=T Q ==> !nat :N .. Pf <=T Q
  [| inj f; ∃a. aXPf a <=T Q |] ==> !<f> :X .. Pf <=T Q

lemmas cspT_Rep_int_choice_left:

c. cCPf c <=T Q ==> !! :C .. Pf <=T Q
a. aXPf a <=T Q ==> ! :X .. Pf <=T Q
X. XXsPf X <=T Q ==> !set :Xs .. Pf <=T Q
n. nNPf n <=T Q ==> !nat :N .. Pf <=T Q
  [| inj f; ∃a. aXPf a <=T Q |] ==> !<f> :X .. Pf <=T Q

lemmas cspT_Rep_int_choice_left_x:

  [| xC; Pf x <=T Q |] ==> !! :C .. Pf <=T Q
  [| xX; Pf x <=T Q |] ==> ! :X .. Pf <=T Q
  [| xXs; Pf x <=T Q |] ==> !set :Xs .. Pf <=T Q
  [| xN; Pf x <=T Q |] ==> !nat :N .. Pf <=T Q
  [| inj f; xX; Pf x <=T Q |] ==> !<f> :X .. Pf <=T Q

lemmas cspT_Rep_int_choice_left_x:

  [| xC; Pf x <=T Q |] ==> !! :C .. Pf <=T Q
  [| xX; Pf x <=T Q |] ==> ! :X .. Pf <=T Q
  [| xXs; Pf x <=T Q |] ==> !set :Xs .. Pf <=T Q
  [| xN; Pf x <=T Q |] ==> !nat :N .. Pf <=T Q
  [| inj f; xX; Pf x <=T Q |] ==> !<f> :X .. Pf <=T Q

lemma cspT_Rep_int_choice0_right:

  (!!c. cC ==> P <=T Qf c) ==> P <=T !! :C .. Qf

lemma cspT_Rep_int_choice0_rightE:

  [| P <=T !! :C .. Qf; ∀cC. P <=T Qf c ==> R |] ==> R

lemma cspT_Rep_int_choice_fun_right:

  [| inj f; !!a. aX ==> P <=T Qf a |] ==> P <=T !!<f> :X .. Qf

lemma cspT_Rep_int_choice_fun_rightE:

  [| P <=T !!<f> :X .. Qf; inj f; ∀aX. P <=T Qf a ==> R |] ==> R

lemma cspT_Rep_int_choice2_right:

  (!!X. XXs ==> P <=T Qf X) ==> P <=T !set :Xs .. Qf

lemma cspT_Rep_int_choice3_right:

  (!!n. nN ==> P <=T Qf n) ==> P <=T !nat :N .. Qf

lemma cspT_Rep_int_choice1_right:

  (!!a. aX ==> P <=T Qf a) ==> P <=T ! :X .. Qf

lemma cspT_Rep_int_choice_f_right:

  [| inj f; !!a. aX ==> P <=T Qf a |] ==> P <=T !<f> :X .. Qf

lemma cspT_Rep_int_choice2_rightE:

  [| P <=T !set :Xs .. Qf; ∀XXs. P <=T Qf X ==> R |] ==> R

lemma cspT_Rep_int_choice3_rightE:

  [| P <=T !nat :N .. Qf; ∀nN. P <=T Qf n ==> R |] ==> R

lemma cspT_Rep_int_choice1_rightE:

  [| P <=T ! :X .. Qf; ∀aX. P <=T Qf a ==> R |] ==> R

lemma cspT_Rep_int_choice_f_rightE:

  [| P <=T !<f> :X .. Qf; inj f; ∀aX. P <=T Qf a ==> R |] ==> R

lemmas cspT_Rep_int_choice_right:

  (!!c. cC ==> P <=T Qf c) ==> P <=T !! :C .. Qf
  (!!a. aX ==> P <=T Qf a) ==> P <=T ! :X .. Qf
  (!!X. XXs ==> P <=T Qf X) ==> P <=T !set :Xs .. Qf
  (!!n. nN ==> P <=T Qf n) ==> P <=T !nat :N .. Qf
  [| inj f; !!a. aX ==> P <=T Qf a |] ==> P <=T !<f> :X .. Qf

lemmas cspT_Rep_int_choice_right:

  (!!c. cC ==> P <=T Qf c) ==> P <=T !! :C .. Qf
  (!!a. aX ==> P <=T Qf a) ==> P <=T ! :X .. Qf
  (!!X. XXs ==> P <=T Qf X) ==> P <=T !set :Xs .. Qf
  (!!n. nN ==> P <=T Qf n) ==> P <=T !nat :N .. Qf
  [| inj f; !!a. aX ==> P <=T Qf a |] ==> P <=T !<f> :X .. Qf

lemmas cspT_Rep_int_choice_rightE:

  [| P <=T !! :C .. Qf; ∀cC. P <=T Qf c ==> R |] ==> R
  [| P <=T ! :X .. Qf; ∀aX. P <=T Qf a ==> R |] ==> R
  [| P <=T !set :Xs .. Qf; ∀XXs. P <=T Qf X ==> R |] ==> R
  [| P <=T !nat :N .. Qf; ∀nN. P <=T Qf n ==> R |] ==> R
  [| P <=T !<f> :X .. Qf; inj f; ∀aX. P <=T Qf a ==> R |] ==> R

lemmas cspT_Rep_int_choice_rightE:

  [| P <=T !! :C .. Qf; ∀cC. P <=T Qf c ==> R |] ==> R
  [| P <=T ! :X .. Qf; ∀aX. P <=T Qf a ==> R |] ==> R
  [| P <=T !set :Xs .. Qf; ∀XXs. P <=T Qf X ==> R |] ==> R
  [| P <=T !nat :N .. Qf; ∀nN. P <=T Qf n ==> R |] ==> R
  [| P <=T !<f> :X .. Qf; inj f; ∀aX. P <=T Qf a ==> R |] ==> R

lemma cspT_Rep_int_choice0_subset:

  [| C2.0C1.0; !!c. cC2.0 ==> Pf c <=T Qf c |]
  ==> !! :C1.0 .. Pf <=T !! :C2.0 .. Qf

lemma cspT_Rep_int_choice_fun_subset:

  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !!<f> :X .. Pf <=T !!<f> :Y .. Qf

lemma cspT_Rep_int_choice2_subset:

  [| YsXs; !!X. XYs ==> Pf X <=T Qf X |]
  ==> !set :Xs .. Pf <=T !set :Ys .. Qf

lemma cspT_Rep_int_choice3_subset:

  [| N2.0N1.0; !!n. nN2.0 ==> Pf n <=T Qf n |]
  ==> !nat :N1.0 .. Pf <=T !nat :N2.0 .. Qf

lemma cspT_Rep_int_choice1_subset:

  [| YX; !!a. aY ==> Pf a <=T Qf a |] ==> ! :X .. Pf <=T ! :Y .. Qf

lemma cspT_Rep_int_choice_f_subset:

  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !<f> :X .. Pf <=T !<f> :Y .. Qf

lemmas cspT_Rep_int_choice_subset:

  [| C2.0C1.0; !!c. cC2.0 ==> Pf c <=T Qf c |]
  ==> !! :C1.0 .. Pf <=T !! :C2.0 .. Qf
  [| YX; !!a. aY ==> Pf a <=T Qf a |] ==> ! :X .. Pf <=T ! :Y .. Qf
  [| YsXs; !!X. XYs ==> Pf X <=T Qf X |]
  ==> !set :Xs .. Pf <=T !set :Ys .. Qf
  [| N2.0N1.0; !!n. nN2.0 ==> Pf n <=T Qf n |]
  ==> !nat :N1.0 .. Pf <=T !nat :N2.0 .. Qf
  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !<f> :X .. Pf <=T !<f> :Y .. Qf

lemmas cspT_Rep_int_choice_subset:

  [| C2.0C1.0; !!c. cC2.0 ==> Pf c <=T Qf c |]
  ==> !! :C1.0 .. Pf <=T !! :C2.0 .. Qf
  [| YX; !!a. aY ==> Pf a <=T Qf a |] ==> ! :X .. Pf <=T ! :Y .. Qf
  [| YsXs; !!X. XYs ==> Pf X <=T Qf X |]
  ==> !set :Xs .. Pf <=T !set :Ys .. Qf
  [| N2.0N1.0; !!n. nN2.0 ==> Pf n <=T Qf n |]
  ==> !nat :N1.0 .. Pf <=T !nat :N2.0 .. Qf
  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !<f> :X .. Pf <=T !<f> :Y .. Qf

lemma cspT_Int_Ext_pre_choice_subset:

  [| Y ≠ {}; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> ! x:X .. x -> Pf x <=T ? :Y -> Qf

lemmas cspT_decompo_subset:

  [| C2.0C1.0; !!c. cC2.0 ==> Pf c <=T Qf c |]
  ==> !! :C1.0 .. Pf <=T !! :C2.0 .. Qf
  [| YX; !!a. aY ==> Pf a <=T Qf a |] ==> ! :X .. Pf <=T ! :Y .. Qf
  [| YsXs; !!X. XYs ==> Pf X <=T Qf X |]
  ==> !set :Xs .. Pf <=T !set :Ys .. Qf
  [| N2.0N1.0; !!n. nN2.0 ==> Pf n <=T Qf n |]
  ==> !nat :N1.0 .. Pf <=T !nat :N2.0 .. Qf
  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !<f> :X .. Pf <=T !<f> :Y .. Qf
  [| Y ≠ {}; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> ! x:X .. x -> Pf x <=T ? :Y -> Qf

lemmas cspT_decompo_subset:

  [| C2.0C1.0; !!c. cC2.0 ==> Pf c <=T Qf c |]
  ==> !! :C1.0 .. Pf <=T !! :C2.0 .. Qf
  [| YX; !!a. aY ==> Pf a <=T Qf a |] ==> ! :X .. Pf <=T ! :Y .. Qf
  [| YsXs; !!X. XYs ==> Pf X <=T Qf X |]
  ==> !set :Xs .. Pf <=T !set :Ys .. Qf
  [| N2.0N1.0; !!n. nN2.0 ==> Pf n <=T Qf n |]
  ==> !nat :N1.0 .. Pf <=T !nat :N2.0 .. Qf
  [| inj f; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> !<f> :X .. Pf <=T !<f> :Y .. Qf
  [| Y ≠ {}; YX; !!a. aY ==> Pf a <=T Qf a |]
  ==> ! x:X .. x -> Pf x <=T ? :Y -> Qf

lemma cspT_Ext_choice_right:

  [| P <=T Q1.0; P <=T Q2.0 |] ==> P <=T Q1.0 [+] Q2.0