Theory ProofRulesCostes

Up to index of Isabelle/HOL/Bounds

theory ProofRulesCostes
imports CostesDepth
begin

(*  Title:      Proof Rules
    Author:     Ricardo Peņa and Javier de Dios
    Copyright:  December 2010, Universidad Complutense de Madrid
*)

header {* Proof-rules for certifying memory bounds, and soundness theorem *}

theory ProofRulesCostes
imports CostesDepth Finite_Set
begin


(* Auxiliary definitions *)
constdefs costs_le:: "Cost => Cost => bool"  ("_ \<sqsubseteq>c _" 1000)
 "costs_le c1 c2 ≡ (dom c1 = dom c2) ∧ (∀ x ∈ dom c1. the (c1 x) ≤ the (c2 x))"

constdefs abstractDelta_le:: "AbstractDelta => AbstractDelta => bool"  
                             ("_ \<sqsubseteq>Δ _" 1000)
 "abstractDelta_le Δ1 Δ2 ≡ (dom Δ1 = dom Δ2) ∧ 
  (∀ ρ ∈ dom Δ1. (the (Δ1 ρ)) \<sqsubseteq>c (the (Δ2 ρ)))"

constdefs resources_le :: "AbstractDelta => AbstractMu => AbstractSigma 
                          => AbstractDelta => AbstractMu => AbstractSigma => bool"
   ("'( _ , _ , _ ') \<sqsubseteq>R '( _ , _ , _ ')" 1000)
 "( Δ' , μ' , σ' )  \<sqsubseteq>R ( Δ , μ , σ ) ≡ 
  Δ'  \<sqsubseteq>Δ Δ ∧ μ' \<sqsubseteq>c μ ∧ σ' \<sqsubseteq>c σ"

inductive
  ProofRulesCostes :: 
  "unit Exp => FunctionResourcesSignature =>
   FunName => ThetaMapping => PhiMapping => real => 
   AbstractDelta => AbstractMu => AbstractSigma => bool"
    ("_ , _  \<turnstile>_ _ _ _ '( _ , _ , _ ')" 1000)
where
   litInt : "ConstE (LitN i) a, Σb 
   \<turnstile>f (ϑ1, ϑ2) Φ td ([]f , 
   []0, []1)"

|  litBool: "ConstE (LitB b) a, Σb 
   \<turnstile>f (ϑ1, ϑ2) Φ td ([]f , 
   []0, []1)" 

|  var1   : "VarE x a, Σb 
   \<turnstile>f (ϑ1, ϑ2) Φ td ([]f , 
   []0, []1)"

|  var2   : "[|(typesRegsAPP Σϑ f) r = Some ρ; 
              (sizesAPP ΣΦ f) x = Some η |] 
              ==> CopyE x r d, Σb 
                  \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td ([ρ \<mapsto> η], η, []2)"

|  var3   : "[| (typesRegsAPP Σϑ f) r = Some ρ; 
               (sizesAPP ΣΦ f) x = Some η |] 
             ==> ReuseE x a, Σb 
                 \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td ([]f , 
                 []0, []1)"

|  let1   : "[| ∀C as r a'. e1 ≠ ConstrE C as r a'; 
               x1 ∉ fv e1; 
               x1 ∉ set (varsAPP Σd f);
               defined_AbstractDelta Δ1 f;
               defined_bound |Δ1| f;
               defined_bound μ1 f;
               defined_bound σ1 f;
               defined_AbstractDelta Δ2 f;
               defined_bound μ2 f;
               defined_bound σ2 f;
               e1, Σb \<turnstile>f (ϑ1, ϑ2) Φ 0 (Δ1, μ1, σ1);
               e2, Σb \<turnstile>f (ϑ1, ϑ2) Φ (td+1) (Δ2, μ2, σ2);
               Δ = Δ1  +Δ  Δ2; 
               μ = \<Squnion>c {μ1,|Δ1|+c  μ2}; 
               σ = \<Squnion>c 
                     {[]2 +c  σ1, 
                      []1 +c  σ2} |] 
             ==> Let x1 = e1 In e2 a, Σb \<turnstile>f (ϑ1, ϑ2) Φ td 
                                          ( Δ, μ , σ )"

|  let1c  : "[| (typesRegsAPP Σϑ f) r = Some ρ; ρ ∉ dom Δ;
              e2, Σb \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td 
             (Δ, μ, σ) |] 
             ==> Let x1 = ConstrE C as r a' In e2 a, Σb
             \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td 
                (Δ ++ [ρ \<mapsto> []1], 
                 μ +c  []1, 
                 σ2 +c []1)"

|  case1  : "[| length alts = length assert; 
               length alts > 0;
              (∀ i < length assert. 
                     defined_AbstractDelta (AbstractDeltaSpaceCost (assert ! i)) f);
              (∀ i < length assert. 
                     monotonic_AbstractDelta (AbstractDeltaSpaceCost (assert ! i)));
              (∀ i < length assert. 
                     defined_bound (AbstractMuSpaceCost (assert ! i)) f);
              (∀ i < length assert. 
                     monotonic_bound (AbstractMuSpaceCost (assert ! i)));
              (∀ i < length assert. 
                     defined_bound (AbstractSigmaSpaceCost (assert ! i)) f);
              (∀ i < length assert. 
                     monotonic_bound (AbstractSigmaSpaceCost (assert ! i)));
              ∀ i < length alts. 
              snd (alts ! i), Σb 
                   \<turnstile>f (ϑ1, ϑ2) Φ (td+ real (length (snd (extractP (fst (alts ! i)))))) 
                     (AbstractDeltaSpaceCost (assert!i), 
                      AbstractMuSpaceCost (assert!i), 
                      AbstractSigmaSpaceCost (assert!i));
               Δ = \<Squnion>Δ f (map AbstractDeltaSpaceCost assert);
               μ = \<Squnion>c (map AbstractMuSpaceCost assert);
               σ = \<Squnion>c (map (λ (Δ,n). addCostReal Δ n) 
                   (zip (map AbstractSigmaSpaceCost assert) 
                         (map num_r alts))) |] 
            ==> Case (VarE x a) Of alts a', Σb 
            \<turnstile>f (ϑ1, ϑ2) Φ td (Δ,μ,σ)"

|  app_primop :  "[| primops g = Some oper |] 
                   ==> AppE g [a1,a2] [] a, Σb 
                      \<turnstile>f (ϑ1, ϑ2) Φ td  
                      ([]g, 
                       []0, []2)"

|  app    :  "[| Σd g = Some (xs,rs,eg); Σb g = Some (projection g Δg,μg,σg);  
                primops g = None;
                l = real (length as); q = real (length rs');
                argP ψ (R_Args Σt g) (typesRegsAPP Σϑ f) rs';
                ∀i<length as. atom (as ! i);
                monotonic_bound μg; defined_bound μg g; 
                monotonic_bound σg; defined_bound σg g;
                monotonic_AbstractDelta Δg; defined_AbstractDelta Δg g;
                f ∈ dom Σd;
                Σt g = Some(ti,ρs,t);
                fv eg ⊆ set xs; fvReg eg ⊆ set rs; 
                fv eg ⊆ dom (sizesAPP ΣΦ f);
                length xs = length ti; 
                Δ = instance_f f g Δg ψ (sizesAPP ΣΦ f) as;
                μ = mu_app μg as (sizesAPP ΣΦ f);
                σ = \<Squnion>c  {[]l + q, 
                (substCostReal (addCostReal (addCostReal 
                   (sigma_app σg as (sizesAPP ΣΦ f))  l)  q) td)}|] 
               ==> AppE g as rs' a, Σb \<turnstile>f (typesAPP Σϑ f) 
                   (sizesAPP ΣΦ f) td  (Δ, μ, σ)"

|  rec    : "[| Σd f = Some (xs,rs,ef);  
               f ∉ dom Σb;
               (ρself_f f) ∉ dom Δ;
               finite (dom Δ);
               ef, Σb(f\<mapsto>(Δ,μ,σ)) 
               \<turnstile>f (typesAPP Σϑ f) (sizesAPP ΣΦ f) real(length 
               (varsAPP Σd f) + length (regionsAPP Σd f))  
               (Δ', μ', σ');
               (projection f Δ', μ', σ')  \<sqsubseteq>R  (Δ, μ, σ)|] 
             ==>  ef, Σb \<turnstile>f (typesAPP Σϑ f) (sizesAPP ΣΦ f) 
                  real(length (varsAPP Σd f)+length(regionsAPP Σd f)) 
                  (Δ', μ', σ')"


(* ∀n.  e :f typesAPP Σϑ f sizesAPP ΣΦ f td , n    \<lbrace> Δ , μ , σ \<rbrace> ≡ 
    e :f typesAPP Σϑ f sizesAPP ΣΦ f td  \<lbrace> Δ , μ , σ \<rbrace> *)

lemma equiv_all_n_SafeResourcesDAssDepth_SafeResourcesDAss:
  "∀n. SafeResourcesDAssDepth e f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td n Δ μ σ 
  ==> e :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td \<lbrace>Δ, μ, σ\<rbrace>"
apply (simp only: typesAPP_def)
apply (simp only: SafeResourcesDAss.simps)
apply (simp only: SafeResourcesDAssDepth.simps)
apply (rule impI)
apply (rule conjI,simp)+
apply (intro allI, rule impI)
apply (elim conjE)
apply (frule_tac f=f in eqSemRADepth)
apply (simp only: SafeBoundSem_def)
apply (elim exE)
apply (rename_tac n)
apply (erule_tac x=n in allE)
apply (drule mp,simp)
apply (elim conjE)
apply (erule_tac x=E1 in allE)
apply (erule_tac x=E2 in allE)
apply (erule_tac x=h in allE)
apply (erule_tac x=k in allE)
apply (erule_tac x=hh in allE)
apply (erule_tac x=v in allE)
apply (erule_tac x=δ in allE)
apply (erule_tac x=m in allE)
apply (erule_tac x=s in allE)
apply (erule_tac x=η in allE)
apply (erule_tac x=si in allE)
apply (drule mp)
 apply (rule conjI, simp add: Let_def, force)
 apply (rule conjI, simp)
 apply (rule conjI, simp)
 apply (rule conjI, simp)
 apply (rule conjI, simp)
 apply simp
by simp


lemma equiv_SafeResourcesDAss_all_n_SafeResourcesDAssDepth:
  "e :f (typesAPP Σϑ g) (sizesAPP ΣΦ g) td \<lbrace>Δ, μ, σ\<rbrace>
   ==> ∀n. SafeResourcesDAssDepth e f (typesAPP Σϑ g) (sizesAPP ΣΦ g) td n Δ μ σ"
apply (simp only: typesAPP_def)
apply (simp only: SafeResourcesDAss.simps)
apply (simp only: SafeResourcesDAssDepth.simps)
apply clarsimp
apply (simp only: SafeBoundSem_def)
apply (simp add: Let_def)
apply (elim exE)
apply (elim conjE)
apply (rotate_tac 7)
apply (erule_tac x=E1 in allE)
apply (erule_tac x=E2 in allE)
apply (erule_tac x=h in allE)
apply (rotate_tac 9)
apply (erule_tac x=k in allE)
apply (erule_tac x=hh in allE)
apply (erule_tac x=v in allE)
apply (erule_tac x=δ in allE)
apply (erule_tac x=m in allE)
apply (erule_tac x=s in allE)
apply (erule_tac x=η in allE)
apply (frule_tac td=td in eqSemDepthRA)
apply (drule mp,force)
by simp


lemma lemma_5:
  "∀ n. SafeResourcesDAssDepth e f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td n Δ μ σ ≡  
   e :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td \<lbrace>Δ, μ, σ\<rbrace>"
apply (rule eq_reflection)
apply (rule iffI)
(* forward implication *)
 apply (rule equiv_all_n_SafeResourcesDAssDepth_SafeResourcesDAss,force)
(* backwards implication *)
by (rule equiv_SafeResourcesDAss_all_n_SafeResourcesDAssDepth,force)




(* ∀ n. \<Turnstile>\<Turnstile>f,n Σb ≡ ValidGlobalResourcesEnv Σb*)

declare fun_upd_apply [simp del]
declare SafeResourcesDAss.simps [simp del]
declare SafeResourcesDAssDepth.simps [simp del]

lemma imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth:
  "ValidGlobalResourcesEnv Σb
   ==> ∀ n. \<Turnstile>\<Turnstile>f,n Σb"
apply (erule ValidGlobalResourcesEnv.induct) 
 apply (rule allI)
 apply (rule ValidGlobalResourcesEnvDepth.base) 
  apply (rule ValidGlobalResourcesEnv.base)
 apply simp
apply (rule allI)
apply (case_tac "fa=f",simp)
 apply (induct_tac n)
  apply (rule ValidGlobalResourcesEnvDepth.depth0,simp,simp)
 apply (rule_tac ValidGlobalResourcesEnvDepth.step)
 apply (simp,simp,simp)
 apply (frule_tac f=f in equiv_SafeResourcesDAss_all_n_SafeResourcesDAssDepth,force)
apply (rule ValidGlobalResourcesEnvDepth.g)
by (simp,simp,simp,simp)



lemma imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth:
  "ValidGlobalResourcesEnv Σb
   ==> ∀ n. \<Turnstile>\<Turnstile>f,n Σb"
apply (erule ValidGlobalResourcesEnv.induct) 
 apply (rule allI)
 apply (rule ValidGlobalResourcesEnvDepth.base) 
  apply (rule ValidGlobalResourcesEnv.base)
 apply simp
apply (rule allI)
apply (case_tac "fa=f",simp)
 apply (induct_tac n)
  apply (rule ValidGlobalResourcesEnvDepth.depth0,simp,simp)
 apply (rule_tac ValidGlobalResourcesEnvDepth.step)
 apply (simp,simp,simp)
 apply (frule_tac f=f in equiv_SafeResourcesDAss_all_n_SafeResourcesDAssDepth,force)
apply (rule ValidGlobalResourcesEnvDepth.g)
by (simp,simp,simp,simp) 



lemma imp_ValidResourcesDepth_n_SigmaResources_Valid_Sigma [rule_format]:
  "\<Turnstile>\<Turnstile>f,n Σb
  --> f ∉ dom Σb
  --> ValidGlobalResourcesEnv Σb"
apply (rule impI)
apply (erule ValidGlobalResourcesEnvDepth.induct,simp_all)
apply (rule impI)
by (rule ValidGlobalResourcesEnv.step,simp_all) 



lemma imp_f_notin_SigmaResources_ValiddDepth_n_SigmaResources_Valid_Sigma:
  "[| f ∉ dom Σb; ∀ n. \<Turnstile>\<Turnstile>f,n Σb|]   
  ==> ValidGlobalResourcesEnv Σb"
apply (erule_tac x=n in allE)
by (rule imp_ValidResourcesDepth_n_SigmaResources_Valid_Sigma,assumption+)

lemma the_AbstractDeltaSpaceCost_upd:
  "AbstractDeltaSpaceCost (the ((Σ(f \<mapsto> (Δ,μ,σ))) f))= Δ"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractMuSpaceCost_upd:
  "AbstractMuSpaceCost (the ((Σ(f \<mapsto> (Δ,μ,σ))) f))= μ"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractSigmaSpaceCost_upd:
  "AbstractSigmaSpaceCost (the ((Σ(f \<mapsto> (Δ,μ,σ))) f))= σ"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractDeltaSpaceCost_other_upd:
  "g ≠ f
   ==> AbstractDeltaSpaceCost (the ((Σ(g \<mapsto> (Δ,μ,σ))) f)) = AbstractDeltaSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractMuSpaceCost_other_upd:
  "g ≠ f
   ==> AbstractMuSpaceCost (the ((Σ(g \<mapsto> (Δ,μ,σ))) f)) = AbstractMuSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractSigmaSpaceCost_other_upd:
  "g ≠ f 
   ==> AbstractSigmaSpaceCost (the ((Σ(g \<mapsto> (Δ,μ,σ))) f)) = AbstractSigmaSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractDeltaSpaceCost_other_projection_upd:
  "g ≠ f
   ==> AbstractDeltaSpaceCost (the ((Σ(g \<mapsto> (projection g Δ,μ,σ))) f)) = AbstractDeltaSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)


lemma the_AbstractMuSpaceCost_other_projection_upd:
  "g ≠ f
   ==> AbstractMuSpaceCost (the ((Σ(g \<mapsto> (projection g Δ,μ,σ))) f)) = AbstractMuSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)

lemma the_AbstractSigmaSpaceCost_other_projection_upd:
  "g ≠ f 
   ==> AbstractSigmaSpaceCost (the ((Σ(g \<mapsto> (projection g Δ,μ,σ))) f)) = AbstractSigmaSpaceCost (the (Σ f))"
by (simp add: fun_upd_apply add: dom_def)


axioms equals_projection:
  "projection f Δ' = projection f Δ
   ==> Δ' = Δ"


lemma Theorem_4_aux [rule_format]:
  " \<Turnstile>\<Turnstile>f,n Σb
   --> n = Suc n' 
   --> f ∈ dom Σb
   --> Σb f = Some (projection f Δ, μ ,σ)
   -->  (bodyAPP Σd f)  :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) real(length (varsAPP Σd f) + length (regionsAPP Σd f)), n' 
            \<lbrace> Δ, μ, σ \<rbrace>"
apply (rule impI)
apply (erule ValidGlobalResourcesEnvDepth.induct) 
 apply simp apply simp
 apply (rule impI)+
 apply (subst (asm) map_upd_Some_unfold,simp)
 apply (elim conjE, frule equals_projection,simp)
apply clarsimp
by  (simp add: fun_upd_apply add: dom_def)


lemma Theorem_4:
  "[| ∀ n > 0. \<Turnstile>\<Turnstile>f,n Σb; f ∈ dom Σb; Σb f = Some (projection f Δ, μ ,σ) |] 
   ==> ∀ n. (bodyAPP Σd f) :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) real(length (varsAPP Σd f) + length (regionsAPP Σd f)), n 
            \<lbrace> Δ , μ, σ \<rbrace>"
apply (rule allI)
apply (rule_tac n="Suc n" in Theorem_4_aux)
by (force,simp,simp,simp)



lemma Theorem_5_aux [rule_format]:
  "\<Turnstile>\<Turnstile>f,n Σb
   --> n = Suc n' 
   --> f ∈ dom Σb
   --> Σb f = Some (projection f Δ, μ ,σ)
   -->  (bodyAPP Σd f) :f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) real(length (varsAPP Σd f) + length (regionsAPP Σd f))    
            \<lbrace> Δ, μ, σ \<rbrace>
   --> \<Turnstile>\<Turnstile> Σb"
apply (rule impI)
apply (erule ValidGlobalResourcesEnvDepth.induct,simp_all)
 apply (rule impI)+
 apply (rule ValidGlobalResourcesEnv.step) 
 apply (simp,simp)
 apply (subst (asm) map_upd_Some_unfold,simp)
 apply (elim conjE, frule equals_projection,simp)
apply (rule impI)+
apply (case_tac "g=f",simp_all)
apply (rule ValidGlobalResourcesEnv.step,simp_all) 
apply (subgoal_tac "f ∈ dom Σb",simp)
 prefer 2 apply (simp add: fun_upd_apply add: dom_def)
by (simp add: fun_upd_apply add: dom_def)+


lemma Theorem_5:
  "[| ∀ n > 0. \<Turnstile>\<Turnstile>f,n Σb; f ∈ dom Σb; Σb f = Some (projection f Δ, μ ,σ);
     (bodyAPP Σd f) :f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) real(length (varsAPP Σd f) + length (regionsAPP Σd f))    
             \<lbrace> Δ, μ ,σ \<rbrace>|] 
   ==> \<Turnstile>\<Turnstile> Σb"
apply (rule_tac n="Suc n" in Theorem_5_aux)
by simp_all



lemma signature_correct [rule_format]:
  "\<Turnstile>\<Turnstile>f,n Σb 
  --> f ∈ dom Σb
  --> (∃ Δ. (AbstractDeltaSpaceCost (the (Σb f))) = projection f Δ)"
apply (rule impI)
apply (erule ValidGlobalResourcesEnvDepth.induct,simp_all)
  apply (simp add: fun_upd_apply add: dom_def,force)
 apply (rule_tac x="Δ" in exI)
 apply (simp add: fun_upd_apply add: dom_def)
apply (rule impI)
apply (drule mp,simp)
apply (elim exE)
apply (rule_tac x="Δ'" in exI)
by (simp add: fun_upd_apply add: dom_def)



lemma imp_f_in_SigmaResources_ValidDepth_n_SigmaResources_Valid_Sigma:
  "[| ∀ n. \<Turnstile>\<Turnstile>f,n Σb; f ∈ dom Σb |] 
   ==> ValidGlobalResourcesEnv Σb"
apply (subgoal_tac "\<Turnstile>\<Turnstile>f,n Σb")
 prefer 2 apply simp
apply (frule signature_correct,assumption)
apply (elim exE)
apply (frule domD) 
apply (elim exE, case_tac b, case_tac ba,simp,clarsimp)
apply (subgoal_tac "f ∈ dom Σb")
 apply (subgoal_tac "\<Turnstile>\<Turnstile>f,0 Σb ∧ (∀n > 0. \<Turnstile>\<Turnstile>f,n Σb)",elim conjE)
  prefer 2 apply simp
 apply (frule Theorem_4,simp_all,force) 
 apply (subgoal_tac "\<Turnstile>\<Turnstile>f,0 Σb ∧ (∀n > 0. \<Turnstile>\<Turnstile>f,n Σb)",elim conjE)
  prefer 2 apply simp
 apply (frule Theorem_5,simp_all,force) 
 apply (rule equiv_all_n_SafeResourcesDAssDepth_SafeResourcesDAss,simp) 
by (simp add: dom_def)



lemma imp_all_n_ValidGlobalResourcesEnvDepth_ValidGlobalResourcesEnv:
  "[| ∀ n. \<Turnstile>\<Turnstile>f,n Σb |] 
   ==> ValidGlobalResourcesEnv Σb"
apply (case_tac "f ∉ dom Σb",simp_all)
 apply (rule imp_f_notin_SigmaResources_ValiddDepth_n_SigmaResources_Valid_Sigma,assumption+)
by (rule imp_f_in_SigmaResources_ValidDepth_n_SigmaResources_Valid_Sigma,assumption+)


lemma lemma_6:
  "∀ n. \<Turnstile>\<Turnstile>f,n Σb ≡ 
   ValidGlobalResourcesEnv Σb"
apply (rule eq_reflection)
apply (rule iffI)
(* forward implication *)
 apply (rule_tac f=f in imp_all_n_ValidGlobalResourcesEnvDepth_ValidGlobalResourcesEnv,force)
(* backwards implication *)
by (rule imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth,force)



(* ∀n.  e , Σb :f typesAPP Σϑ f sizesAPP ΣΦ f td , n  \<lbrace> Δ , μ , σ \<rbrace> 
   ==> e , Σb : f typesAPP Σϑ f sizesAPP ΣΦ f  \<lbrace> td , Δ , μ \<rbrace> σ *)


lemma lemma_7:
  "[| ∀ n. e, Σb :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td, n \<lbrace> Δ , μ , σ \<rbrace> |] 
   ==> SafeResourcesDAssCntxt e Σb f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td Δ μ σ"
apply (simp only: typesAPP_def)
apply (simp only: SafeResourcesDAssDepthCntxt.simps)
apply (subgoal_tac 
  "(∀n. \<Turnstile>\<Turnstile>f,n Σb) --> 
   (∀n.  e :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td, n \<lbrace> Δ , μ , σ \<rbrace>)")
 apply (erule thin_rl)
 apply (subst (asm) lemma_5)
 apply (subst (asm) lemma_6)
 apply (simp add: SafeResourcesDAssCntxt.simps)
apply (simp only: typesAPP_def)
apply (rule impI)
apply (simp only: typesAPP_def)
by force



(*  e, Σb \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td  (Δ,μ,σ)
   ==> ∀ n. e , Σb :f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td,n \<lbrace> Δ , μ , σ \<rbrace> *)

lemma fold_op_plus_le [rule_format]:
  "finite ({ρ. η ρ = Some j})
   --> Δ' \<sqsubseteq>Δ Δ
   --> fold op + (λρ. the (the (Δ' ρ) si)) (0::real) ({ρ. η ρ = Some j}) ≤ 
       fold op + (λρ. the (the (Δ ρ) si)) (0::real) ({ρ. η ρ = Some j})"
apply (rule impI)
apply (induct rule: finite_induct)
 apply (rule impI)
 apply simp 
apply (rule impI)+
apply (simp add: ran_def)
apply (simp add: abstractDelta_le_def)
apply (subgoal_tac "the (the (Δ' x) si) ≤ the (the (Δ x) si)")
 apply clarsimp
apply (elim conjE)
apply (case_tac "x ∈ dom Δ")
 apply (simp add: costs_le_def)
 apply (case_tac "si ∈dom (the (Δ' x))",force,force)
apply (subgoal_tac "Δ x = None",simp) 
 apply (subgoal_tac "Δ' x = None",simp,force) 
by force



lemma sizeAbstractDelta_si_le:
  "[| finite ({ρ. η ρ = Some j ∧ ρ ∈ dom Δ});
     Δ' \<sqsubseteq>Δ  Δ |] 
   ==> sizeAbstractDelta_si Δ' si j η ≤ 
       sizeAbstractDelta_si Δ si j η"
apply (simp add: sizeAbstractDelta_si_def)
apply (simp add: setsum_def)
apply (rule impI)
by (rule fold_op_plus_le,assumption+)


lemma resources_le_Delta_ge:
 "[| ∀j∈{0..k}. finite ({ρ. η ρ = Some j ∧ ρ ∈ dom Δ});
    Delta_ge Δ' si k η δ;  Δ' \<sqsubseteq>Δ  Δ|] 
  ==> Delta_ge Δ si k η δ"
apply (simp add: Delta_ge_def)
apply (rule ballI)
apply (subgoal_tac "dom Δ' = dom Δ")
 prefer 2 apply (simp add: abstractDelta_le_def)
apply (erule_tac x=j in ballE,simp)
 apply (frule_tac η=η and j=j and si=si in sizeAbstractDelta_si_le,assumption+) 
 apply force
by simp


lemma resources_le_Mu_ge:
 "[| mu_ge μ' si s; μ' \<sqsubseteq>c μ |] 
  ==> mu_ge μ si s"
apply (simp add: mu_ge_def)
apply (simp add: costs_le_def)
apply (erule real_le_trans) 
apply (elim conjE)
by (erule_tac x=si in ballE,simp,force)


lemma resources_le_Sigma_ge:
 "[| sigma_ge σ' si s;  σ' \<sqsubseteq>c σ |] 
  ==> sigma_ge σ si s"
apply (simp add: sigma_ge_def)
apply (simp add: costs_le_def)
apply (erule real_le_trans) 
apply (elim conjE)
by (erule_tac x=si in ballE,simp,force)




lemma dom_projection_Delta:
  "dom (projection f Δ) = dom Δ - {(ρself_f f)}"
apply (rule equalityI)
 apply (rule subsetI)
 apply (simp add: projection_def,clarsimp)
 apply (split split_if_asm,simp,force)
apply (rule subsetI)
apply (simp add: projection_def)
by clarsimp


lemma dom_delta'_equals_dom_delta_ρself:
  "[| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     projection f Δ' \<sqsubseteq>Δ Δ |] 
   ==> dom Δ' = insert (ρself_f f) (dom Δ)"
apply (rule equalityI)
 apply (rule subsetI)
 apply (simp add: abstractDelta_le_def)
 apply (subst (asm) dom_projection_Delta)
 apply blast
apply (rule subsetI)
apply (simp add: abstractDelta_le_def)
apply (subst (asm) dom_projection_Delta)
by blast


lemma projection_prop:
  "[| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
      projection f Δ' \<sqsubseteq>Δ Δ |] 
   ==> Δ' \<sqsubseteq>Δ Δ(ρself_f f \<mapsto> the (Δ' (ρself_f f)))"
apply (simp (no_asm) add: abstractDelta_le_def)
apply (rule conjI)
 apply (rule dom_delta'_equals_dom_delta_ρself,simp,simp) 
apply (subst dom_delta'_equals_dom_delta_ρself,simp,simp)
apply (rule ballI)
apply (simp only: abstractDelta_le_def)
apply (elim conjE,clarsimp,erule disjE)
 apply (simp add: fun_upd_apply add: dom_def) 
 apply (simp add: costs_le_def)
apply (erule_tac x=ρ in ballE)
 prefer 2 apply simp
apply (subst (asm) dom_projection_Delta)
apply (subgoal_tac "ρ ≠ (ρself_f f)")
 apply (simp add: projection_def)
 apply (simp add: fun_upd_apply add: dom_def)
by blast



lemma sizeAbstractDelta_si_le:
  "[| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     finite ({ρ. η ρ = Some j ∧ ρ ∈ dom Δ});
     projection f Δ' \<sqsubseteq>Δ  Δ |] 
   ==> sizeAbstractDelta_si Δ' si j η ≤ 
       sizeAbstractDelta_si (Δ(ρself_f f \<mapsto> the (Δ' (ρself_f f)))) si j η"
apply (simp add: sizeAbstractDelta_si_def)
apply (simp add: setsum_def)
apply (rule impI)
apply (rule fold_op_plus_le,assumption+)
by (rule projection_prop,assumption+)


lemma resources_le_Delta_ge:
 "[| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
    ∀j∈{0..k}. finite ({ρ. η ρ = Some j ∧ ρ ∈ dom Δ});
    Delta_ge Δ' si k η δ;  projection f Δ' \<sqsubseteq>Δ  Δ|] 
  ==> Delta_ge (Δ(ρself_f f \<mapsto> the (Δ' (ρself_f f)))) si k η δ"
apply (simp add: Delta_ge_def)
apply (rule ballI)
apply (erule_tac x=j in ballE,simp)
 apply (frule_tac η=η and j=j and si=si in sizeAbstractDelta_si_le,assumption+) 
 apply force
by simp

lemma finite_dom_Δ_finite_η:
  "finite (dom Δ)
   ==> (∀j∈{0..k}. finite ({ρ. η ρ = Some j ∧ ρ ∈ dom Δ}))"
apply (rule ballI)
apply (rule_tac B="{ρ. ρ ∈ dom Δ}" in finite_subset)
by (blast,simp)


lemma resources_le_SafeResourcesDAssDepth:
  "[| ( projection f Δ' , μ' , σ' )  \<sqsubseteq>R ( Δ , μ , σ );
      finite (dom Δ);
       bodyAPP Σd f :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td, n  \<lbrace> Δ' , μ' , σ' \<rbrace> |] 
   ==> bodyAPP Σd f :f (typesAPP Σϑ f) (sizesAPP ΣΦ f) td, n  \<lbrace> Δ((ρself_f f) \<mapsto> the (Δ' (ρself_f f))), μ , σ \<rbrace>"
apply (simp only: resources_le_def)
apply (simp only: typesAPP_def)
apply (simp only: SafeResourcesDAssDepth.simps)
apply (elim conjE)
apply (rule impI)
apply (rule conjI,simp)+
 apply (rule dom_delta'_equals_dom_delta_ρself,simp,simp) 
apply (drule mp,simp)
apply (elim conjE)
apply (rule allI)+
apply (erule_tac x=E1 in allE)
apply (erule_tac x=E2 in allE)
apply (erule_tac x=h in allE)
apply (erule_tac x=k in allE)
apply (erule_tac x=hh in allE)
apply (erule_tac x=v in allE)
apply (erule_tac x=δ in allE)
apply (erule_tac x=m in allE)
apply (erule_tac x=s in allE)
apply (erule_tac x=η in allE)
apply (erule_tac x=si in allE)
apply (rule impI)
apply (elim conjE)
apply (drule mp)
 apply (rule conjI,simp)+
 apply (subst dom_delta'_equals_dom_delta_ρself,simp,simp,simp)
 apply (rule conjI,simp)
 apply simp
apply (elim conjE)
apply (frule_tac η=η and k=k in finite_dom_Δ_finite_η)
apply (rule conjI, rule resources_le_Delta_ge,simp,simp,simp,simp)
apply (rule conjI, rule resources_le_Mu_ge,simp,simp)
by (rule resources_le_Sigma_ge,simp,simp)



lemma projection_prop2:
  "(ρself_f f) ∉ dom Δ
   ==> Δ = projection f (Δ(ρself_f f \<mapsto> the (Δ' (ρself_f f))))"
apply (rule map_le_antisym)
 apply (simp add: projection_def)
 apply (simp add: map_le_def,clarsimp)
 apply (rule sym)
 apply (subst map_upd_Some_unfold,simp)
apply (simp add: projection_def)
apply (simp add: map_le_def,clarsimp)
by (subst (asm) map_upd_Some_unfold,simp)


lemma lemma_8_REC [rule_format]:
  "(∀n. (ValidGlobalResourcesEnvDepth f n (Σb(f \<mapsto> (Δ, μ, σ))))  
         -->  SafeResourcesDAssDepth (bodyAPP Σd f) f (typesAPP Σϑ f) (sizesAPP ΣΦ f) 
                                     (real (length (varsAPP Σd f)) + real (length (regionsAPP Σd f)))  n Δ' μ' σ')
   --> f ∉ dom Σb
   --> (ρself_f f) ∉ dom Δ
   --> finite (dom Δ)
   --> ( projection f Δ' , μ' , σ' ) \<sqsubseteq>R ( Δ , μ , σ )
   --> ValidGlobalResourcesEnvDepth f n Σb
   --> SafeResourcesDAssDepth (bodyAPP Σd f) f (typesAPP Σϑ f) (sizesAPP ΣΦ f) 
                              (real (length (varsAPP Σd f)) + real (length (regionsAPP Σd f)))  n Δ' μ' σ' "
apply (rule impI)
apply (induct_tac n)
 (* n = 0 *)
 apply (rule impI)+
 apply (erule_tac x=0 in allE)
 apply (frule imp_ValidResourcesDepth_n_SigmaResources_Valid_Sigma,assumption+)
 apply (subgoal_tac "\<Turnstile>\<Turnstile>f,0 Σb(f \<mapsto> (Δ, μ, σ))",simp)
 apply (subst projection_prop2,assumption)
 apply (rule ValidGlobalResourcesEnvDepth.depth0,assumption+)
(* n > 0 *)
apply (erule_tac x="Suc n" in allE)
apply (rule impI)+
apply (drule mp,simp)
apply (frule imp_ValidResourcesDepth_n_SigmaResources_Valid_Sigma,assumption+)
apply (frule_tac f=f in imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth)
apply (erule_tac x=n in allE,simp)
apply (frule resources_le_SafeResourcesDAssDepth,assumption+)
apply (subgoal_tac "\<Turnstile>\<Turnstile>f,Suc n Σb(f \<mapsto> (Δ, μ, σ))",simp) 
apply (subst projection_prop2,assumption)
by (rule ValidGlobalResourcesEnvDepth.step,simp_all)



lemma lemma_8:
  " e, Σb \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td  (Δ,μ,σ)
   ==> ∀ n. e , Σb :f  (typesAPP Σϑ f) (sizesAPP ΣΦ f) td,n \<lbrace> Δ , μ , σ \<rbrace>"
apply (simp only: typesAPP_def)
apply (erule ProofRulesCostes.induct)
 (* ConstE (LitN i) *)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI, rule impI) 
 apply (rule SafeResourcesDADepth_LitInt)
 
 (* ConstE (LitB b) *)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI, rule impI) 
 apply (rule SafeResourcesDADepth_LitBool)

 (* VarE x *)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI, rule impI)
 apply (rule SafeResourcesDADepth_Var1)

 (* x @ r *)
 apply (simp only: typesAPP_def)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI, rule impI) 
 apply (rule SafeResourcesDADepth_Var2,force,force)

 (* ReuseE x *)
 apply (simp only: typesAPP_def)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI, rule impI) 
 apply (rule SafeResourcesDADepth_Var3,force,force)

 (* Let x1 = e1 In e2. LET1 *)
 apply (rule allI)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule impI)
 apply (erule_tac x=n in allE)+
 apply (drule mp, simp)+
 apply (rule SafeResourcesDADepth_Let1)
 apply (simp,assumption+,simp,simp,simp)

 (* Let x1 = e1 In e2. LET2 *)
 apply (rule allI)
 apply (simp only: typesAPP_def)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule impI)
 apply (erule_tac x=n in allE)+
 apply (drule mp, simp)+
 apply (rule SafeResourcesDADepth_Let2)
 apply assumption+

 (* Case VarE x a Of alts *)
 apply (rule allI)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule impI)
 apply (rule SafeResourcesDADepth_CASE) 
 apply (assumption+,simp,assumption+,simp,simp,simp,simp)

 (* AppE fa [a1, a2] [] a *)
 apply (rule allI)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule impI)
 apply (rule SafeResourcesDADepth_APP_PRIMOP)
 apply (assumption+)

 (* AppE fa as rs' a. APP *)
 apply (rule allI)
 apply (simp only: typesAPP_def)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule impI)
 apply (fold typesAPP_def)
 apply (frule_tac  σg=σg  in SafeResourcesDADepth_APP) 
 apply (assumption+,simp,assumption+,simp)

 (* Rec *)
 apply (simp only: typesAPP_def)
 apply (simp only: SafeResourcesDAssDepthCntxt.simps)
 apply (rule allI)
 apply (rule impI)
 apply (subgoal_tac 
   "ef = (bodyAPP Σd f) ∧
    xs = (varsAPP Σd f) ∧
    rs = (regionsAPP Σd f)",simp)
 apply (fold typesAPP_def)
 apply (rule_tac f=f and Σb=Σb in lemma_8_REC)
 apply (simp only: typesAPP_def)
 apply (force,simp,simp,simp,simp,simp)
 apply (simp add: bodyAPP_def)
 apply (simp add: varsAPP_def)
 apply (simp add: regionsAPP_def)
done





(* Soundness theorem *)


lemma lemma_2:
  "e, Σb \<turnstile>f  (typesAPP Σϑ f) (sizesAPP ΣΦ f)  td (Δ,μ,σ) 
  ==> SafeResourcesDAssCntxt e Σb f  (typesAPP Σϑ f) (sizesAPP ΣΦ f)  td Δ μ σ"
apply (rule lemma_7)
by (rule lemma_8,assumption)


end

lemma equiv_all_n_SafeResourcesDAssDepth_SafeResourcesDAss:

  n.  e :f typesAPP Σϑ f sizesAPP ΣΦ f td , n    \<lbrace> Δ , μ , σ \<rbrace>
  ==> e :f typesAPP Σϑ f sizesAPP ΣΦ f td  \<lbrace> Δ , μ , σ \<rbrace>

lemma equiv_SafeResourcesDAss_all_n_SafeResourcesDAssDepth:

  e :f typesAPP Σϑ g sizesAPP ΣΦ g td  \<lbrace> Δ , μ , σ \<rbrace>
  ==> ∀n.  e :f typesAPP Σϑ
                 g sizesAPP ΣΦ g td , n    \<lbrace> Δ , μ , σ \<rbrace>

lemma lemma_5:

  n.  e :f typesAPP Σϑ f sizesAPP ΣΦ f td , n    \<lbrace> Δ , μ , σ \<rbrace> ==
  e :f typesAPP Σϑ f sizesAPP ΣΦ f td  \<lbrace> Δ , μ , σ \<rbrace>

lemma imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth:

  \<Turnstile>\<Turnstile> Σb  ==> ∀n. \<Turnstile>\<Turnstile>f , n  Σb 

lemma imp_ValidGlobalResourcesEnv_all_n_ValidGlobalResourcesEnvDepth:

  \<Turnstile>\<Turnstile> Σb  ==> ∀n. \<Turnstile>\<Turnstile>f , n  Σb 

lemma imp_ValidResourcesDepth_n_SigmaResources_Valid_Sigma:

  [| \<Turnstile>\<Turnstile>f , n  Σb ; f  dom Σb |]
  ==> \<Turnstile>\<Turnstile> Σb 

lemma imp_f_notin_SigmaResources_ValiddDepth_n_SigmaResources_Valid_Sigma:

  [| f  dom Σb; ∀n. \<Turnstile>\<Turnstile>f , n  Σb  |]
  ==> \<Turnstile>\<Turnstile> Σb 

lemma the_AbstractDeltaSpaceCost_upd:

  AbstractDeltaSpaceCost (the ((Σ(f |-> (Δ, μ, σ))) f)) = Δ

lemma the_AbstractMuSpaceCost_upd:

  AbstractMuSpaceCost (the ((Σ(f |-> (Δ, μ, σ))) f)) = μ

lemma the_AbstractSigmaSpaceCost_upd:

  AbstractSigmaSpaceCost (the ((Σ(f |-> (Δ, μ, σ))) f)) = σ

lemma the_AbstractDeltaSpaceCost_other_upd:

  g  f
  ==> AbstractDeltaSpaceCost (the ((Σ(g |-> (Δ, μ, σ))) f)) =
      AbstractDeltaSpaceCost (the (Σ f))

lemma the_AbstractMuSpaceCost_other_upd:

  g  f
  ==> AbstractMuSpaceCost (the ((Σ(g |-> (Δ, μ, σ))) f)) =
      AbstractMuSpaceCost (the (Σ f))

lemma the_AbstractSigmaSpaceCost_other_upd:

  g  f
  ==> AbstractSigmaSpaceCost (the ((Σ(g |-> (Δ, μ, σ))) f)) =
      AbstractSigmaSpaceCost (the (Σ f))

lemma the_AbstractDeltaSpaceCost_other_projection_upd:

  g  f
  ==> AbstractDeltaSpaceCost (the ((Σ(g |-> (projection g Δ, μ, σ))) f)) =
      AbstractDeltaSpaceCost (the (Σ f))

lemma the_AbstractMuSpaceCost_other_projection_upd:

  g  f
  ==> AbstractMuSpaceCost (the ((Σ(g |-> (projection g Δ, μ, σ))) f)) =
      AbstractMuSpaceCost (the (Σ f))

lemma the_AbstractSigmaSpaceCost_other_projection_upd:

  g  f
  ==> AbstractSigmaSpaceCost (the ((Σ(g |-> (projection g Δ, μ, σ))) f)) =
      AbstractSigmaSpaceCost (the (Σ f))

lemma Theorem_4_aux:

  [| \<Turnstile>\<Turnstile>f , n  Σb ; n = Suc n'; fdom Σb;
     Σb f = Some (projection f Δ, μ, σ) |]
  ==>  bodyAPP Σd
        f :f typesAPP Σϑ
              f sizesAPP ΣΦ
                 f real (length (varsAPP Σd f) +
                         length
                          (regionsAPP Σd f)) , n'    \<lbrace> Δ , μ , σ \<rbrace>

lemma Theorem_4:

  [| ∀n>0. \<Turnstile>\<Turnstile>f , n  Σb ; fdom Σb;
     Σb f = Some (projection f Δ, μ, σ) |]
  ==> ∀n.  bodyAPP Σd
            f :f typesAPP Σϑ
                  f sizesAPP ΣΦ
                     f real (length (varsAPP Σd f) +
                             length
                              (regionsAPP Σd
                                f)) , n    \<lbrace> Δ , μ , σ \<rbrace>

lemma Theorem_5_aux:

  [| \<Turnstile>\<Turnstile>f , n  Σb ; n = Suc n'; fdom Σb;
     Σb f = Some (projection f Δ, μ, σ);
     bodyAPP Σd
      f :f typesAPP Σϑ
            f sizesAPP ΣΦ
               f real (length (varsAPP Σd f) +
                       length (regionsAPP Σd f))  \<lbrace> Δ , μ , σ \<rbrace> |]
  ==> \<Turnstile>\<Turnstile> Σb 

lemma Theorem_5:

  [| ∀n>0. \<Turnstile>\<Turnstile>f , n  Σb ; fdom Σb;
     Σb f = Some (projection f Δ, μ, σ);
     bodyAPP Σd
      f :f typesAPP Σϑ
            f sizesAPP ΣΦ
               f real (length (varsAPP Σd f) +
                       length (regionsAPP Σd f))  \<lbrace> Δ , μ , σ \<rbrace> |]
  ==> \<Turnstile>\<Turnstile> Σb 

lemma signature_correct:

  [| \<Turnstile>\<Turnstile>f , n  Σb ; fdom Σb |]
  ==> ∃Δ. AbstractDeltaSpaceCost (the (Σb f)) = projection f Δ

lemma imp_f_in_SigmaResources_ValidDepth_n_SigmaResources_Valid_Sigma:

  [| ∀n. \<Turnstile>\<Turnstile>f , n  Σb ; fdom Σb |]
  ==> \<Turnstile>\<Turnstile> Σb 

lemma imp_all_n_ValidGlobalResourcesEnvDepth_ValidGlobalResourcesEnv:

  n. \<Turnstile>\<Turnstile>f , n  Σb  ==> \<Turnstile>\<Turnstile> Σb 

lemma lemma_6:

  n. \<Turnstile>\<Turnstile>f , n  Σb  == \<Turnstile>\<Turnstile> Σb 

lemma lemma_7:

  n.  e , Σb :f typesAPP Σϑ f sizesAPP ΣΦ f td , n  \<lbrace> Δ , μ , σ \<rbrace>
  ==> e , Σb : f typesAPP Σϑ f sizesAPP ΣΦ f  \<lbrace> td , Δ , μ \<rbrace> σ

lemma fold_op_plus_le:

  [| finite {ρ. η ρ = Some j}; Δ' \<sqsubseteq>Δ Δ |]
  ==> fold op +ρ. the (the (Δ' ρ) si)) 0 {ρ. η ρ = Some j}
       fold op +ρ. the (the (Δ ρ) si)) 0 {ρ. η ρ = Some j}

lemma sizeAbstractDelta_si_le:

  [| finite {ρ. η ρ = Some jρdom Δ}; Δ' \<sqsubseteq>Δ Δ |]
  ==> sizeAbstractDelta_si Δ' si j η  sizeAbstractDelta_si Δ si j η

lemma resources_le_Delta_ge:

  [| ∀j{0..k}. finite {ρ. η ρ = Some jρdom Δ}; Delta_ge Δ' si k η δ;
     Δ' \<sqsubseteq>Δ Δ |]
  ==> Delta_ge Δ si k η δ

lemma resources_le_Mu_ge:

  [| mu_ge μ' si s; μ' \<sqsubseteq>c μ |] ==> mu_ge μ si s

lemma resources_le_Sigma_ge:

  [| sigma_ge σ' si s; σ' \<sqsubseteq>c σ |] ==> sigma_ge σ si s

lemma dom_projection_Delta:

  dom (projection f Δ) = dom Δ - {ρself_f f}

lemma dom_delta'_equals_dom_delta_ρself:

  [| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     projection f Δ' \<sqsubseteq>Δ Δ |]
  ==> dom Δ' = insert (ρself_f f) (dom Δ)

lemma projection_prop:

  [| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     projection f Δ' \<sqsubseteq>Δ Δ |]
  ==> Δ' \<sqsubseteq>Δ Δ(ρself_f f |-> the (Δ' (ρself_f f)))

lemma sizeAbstractDelta_si_le:

  [| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     finite {ρ. η ρ = Some jρdom Δ}; projection f Δ' \<sqsubseteq>Δ Δ |]
  ==> sizeAbstractDelta_si Δ' si j η
       sizeAbstractDelta_si (Δ(ρself_f f |-> the (Δ' (ρself_f f)))) si j η

lemma resources_le_Delta_ge:

  [| insert (ρself_f f) (set (R_Args Σt f)) = dom Δ';
     ∀j{0..k}. finite {ρ. η ρ = Some jρdom Δ}; Delta_ge Δ' si k η δ;
     projection f Δ' \<sqsubseteq>Δ Δ |]
  ==> Delta_ge (Δ(ρself_f f |-> the (Δ' (ρself_f f)))) si k η δ

lemma finite_dom_Δ_finite_η:

  finite (dom Δ) ==> ∀j{0::'c..k}. finite {ρ. η ρ = Some jρdom Δ}

lemma resources_le_SafeResourcesDAssDepth:

  [| ( projection f Δ' , μ' , σ' ) \<sqsubseteq>R ( Δ , μ , σ ); finite (dom Δ);
      bodyAPP Σd
       f :f typesAPP Σϑ
             f sizesAPP ΣΦ f td , n    \<lbrace> Δ' , μ' , σ' \<rbrace> |]
  ==>  bodyAPP Σd f :f typesAPP Σϑ f sizesAPP ΣΦ f td , n    \<lbrace> Δ
      (ρself_f f |-> the (Δ' (ρself_f f))) , μ , σ \<rbrace>

lemma projection_prop2:

  ρself_f f  dom Δ ==> Δ = projection f (Δ(ρself_f f |-> the (Δ' (ρself_f f))))

lemma lemma_8_REC:

  [| !!n. \<Turnstile>\<Turnstile>f , n  Σb(f |-> (Δ, μ, σ)) 
          ==>  bodyAPP Σd
                f :f typesAPP Σϑ
                      f sizesAPP ΣΦ
                         f real (length (varsAPP Σd f)) +
                           real (length
                                  (regionsAPP Σd
                                    f)) , n    \<lbrace> Δ' , μ' , σ' \<rbrace>;
     f  dom Σb; ρself_f f  dom Δ; finite (dom Δ);
     ( projection f Δ' , μ' , σ' ) \<sqsubseteq>R ( Δ , μ , σ );
     \<Turnstile>\<Turnstile>f , n  Σb  |]
  ==>  bodyAPP Σd
        f :f typesAPP Σϑ
              f sizesAPP ΣΦ
                 f real (length (varsAPP Σd f)) +
                   real (length
                          (regionsAPP Σd
                            f)) , n    \<lbrace> Δ' , μ' , σ' \<rbrace>

lemma lemma_8:

  e , Σb  \<turnstile>f typesAPP Σϑ f sizesAPP ΣΦ f td ( Δ , μ , σ )
  ==> ∀n.  e , Σb :f typesAPP Σϑ
                      f sizesAPP ΣΦ f td , n  \<lbrace> Δ , μ , σ \<rbrace>

lemma lemma_2:

  e , Σb  \<turnstile>f typesAPP Σϑ f sizesAPP ΣΦ f td ( Δ , μ , σ )
  ==> e , Σb : f typesAPP Σϑ f sizesAPP ΣΦ f  \<lbrace> td , Δ , μ \<rbrace> σ