Theory dem_POPCONT

Up to index of Isabelle/HOL/SafeImp

theory dem_POPCONT
imports CertifSVM2JVM
begin

(* 
   Title: Lemmas for the translation SVM to JVM. POPCONT
   Author: Javier de Dios and Ricardo Pe~na
   Copyright: January 2009, Universidad Complutense de Madrid
*)


theory dem_POPCONT
imports "../JVMSAFE/JVMExec" SVM2JVM SVMSemantics CertifSVM2JVM 
begin

no_translations "Norm s" == "(None,s)"


no_translations "ex_table_of m" == "snd (snd (snd m))"

declare trInstr.simps [simp del]
declare equivS.simps [simp del]


(* Axioms *)
axioms maxPush_POPCONT:
  "2 + n < int m"


(* Lemmas for equivS *)

lemma equivS_POPCONT:
  "equivS (v1 # Cont (k1, l1) # S ) S' n ctm d g ==> n >= 2"
apply (induct S)
 apply (case_tac v1,simp_all)
 apply (unfold equivS.simps)
   apply (case_tac "(nat n)", simp, simp)
  apply (case_tac "nata", simp, simp)
 apply (case_tac x,simp)
 apply (simp add: equivS.simps)
apply (case_tac v1,simp_all)
apply (simp add: equivS.simps)
 apply (simp add: equivS.simps)
apply (case_tac x)
by (simp add: equivS.simps)

lemma equivS2_POPCONT:
  "[| 2 < length vs; equivS (Val v1 # Cont (k1, l1) # S') S'a n ctm d g|] 
   ==> equivS (Val v1 # S') (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0)) (n - 2) ctm d g"
apply (simp add: equivS.simps, clarsimp) 
apply (drule equivS_ge_n) 
apply (erule_tac x="1" in allE,simp)
by (subgoal_tac "-2 + n= n - 2",simp,simp) 

lemma equivS_k1:
  "[| equivS (Val v1 # Cont (k1, l1) # S') S'a n ctm d g|] 
  ==>  k1 = nat (the_Intg (the (S'a (nat (n - 1)))))"
by (simp add: equivS.simps) 


(* Lemmas for activeCells *)

declare equivH.simps [simp del]

lemma activeCells_POPCONT:
  "[| la ∉ activeCells regS h (nat (the_Intg (the (sha (heapC, kf)))))|] 
   ==> activeCells regS h (nat (the_Intg (the (sha (heapC, kf))))) =
       activeCells regS (h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> the (S'a (nat n)))))) (nat (the_Intg (the (sha (heapC, kf)))))"
apply (frule l_not_in_cellReg)
apply (unfold activeCells_def,auto)
 apply (unfold region_def, simp add: Let_def, elim conjE)
 apply (rule_tac x="j" in exI,simp) 
 apply (rule cellReg_step) 
  apply (rule cellReg_basic) 
 apply (erule_tac x="j" in allE)
 apply (rule cellsReg_monotone_1,assumption+) 
 apply (erule l_not_in_regs)
apply (simp add: Let_def, elim conjE)
apply (rule_tac x="j" in exI, simp)
apply (rule cellReg_step) 
 apply (rule cellReg_basic)
 apply (erule_tac x="j" in allE) 
apply (erule cellsReg_monotone_2,assumption+)
by (erule l_not_in_regs)

(* Lemmas for domH *)


lemma domH_POPCONT:
  "[| la ∉ activeCells regS h (nat (the_Intg (the (sha (heapC, kf)))));
     ∀l∈dom H. ∃l'. l' = the (g l) ∧ equivC (the (H l)) h l' (the (h l')) (nat (the_Intg (the (sha (heapC, kf))))) com regS d g |] 
   ==> ∀l∈dom H.
          ∃l'. l' = the (g l) ∧
               equivC (the (H l)) (h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> the (S'a (nat n)))))) l'
                (the ((h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> the (S'a (nat n)))))) l')) 
                (nat (the_Intg (the (sha (heapC, kf))))) 
                com regS d g"
apply (frule l_not_in_cellReg)
apply (rule ballI)
apply (erule_tac x="l" in ballE) 
 prefer 2 apply simp
apply (erule exE)
apply (rule_tac x="l'" in exI) apply (elim conjE)
 apply (rule conjI, assumption)
apply clarsimp
apply (rule conjI, rule impI)
apply (simp add: region_def)
apply (rule impI)
apply (rule_tac x="Obj" in exI)
apply (rule_tac x="flds" in exI) apply simp
apply (simp add: region_def)
apply clarsimp
apply (rule cellReg_step) 
 apply (rule cellReg_basic)
 apply (erule_tac x="j" in allE)
 apply (rule cellsReg_monotone_1,assumption+)
by (erule l_not_in_regs)



lemma equivH_POPCONT:
  "[|((hm, k), k0, (l, i), v1 # Cont (k1, l1) # S') = ((H, ka), k0a, PC, S);
     k' = nat (the_Intg (the (sha (heapC, kf)))); k0' = nat (the_Intg (the (sha (heapC, k0f)))); sha (stackC, Sf) = Some (Addr la);
    distinct [la,l',l''];  h la = Some (Arr ty m S'a); sha (stackC, topf) = Some (Intg n);
    sha (heapC, regionsf) = Some (Addr l'); h l' = Some (Arr ty m' regS); sha (dirCellC, safeDirf) = Some (Addr l'');
    h l'' = Some (Arr ty m'' d); inj_on g (dom H); equivH (H, ka) h k' com regS d g;  k0a = k0';
    activeCells regS h k' ∩ {la, l', l''} = {}; 2 < length vs|]
       ==> equivH (hm, k) (h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))))
           (nat (the_Intg
                  (the ((sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto>
                         vs[Suc 0 := the (S'a (nat n)), 2 := the (S'a (nat (n - 1)))] ! 2))
                         (heapC, kf)))))
           com regS d g"
apply (simp add: heapC_def add: stackC_def)
apply (simp add: kf_def add: k0f_def)
apply (fold heapC_def, fold kf_def)
apply (unfold equivH.simps, elim conjE)
apply (rule conjI, assumption)
apply (rule conjI, frule activeCells_POPCONT,simp)
apply (rule conjI, assumption)
by (rule domH_POPCONT,assumption+)


declare extractBytecode_def [simp del]
declare initConsTable_def   [simp del]
declare equivS.simps        [simp del]


axioms Tableswitch_POPCONT:
  "drop pcc (extractBytecode P') = 
   [Tableswitch 1 (int (length ps)) ps] @ bytecode' ∧ ctm (nat (ps!i)) = Some i"


axioms equivpc_POPCONT:
  "if' (the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                           2 := the (S'a (nat (n - 1))), 
                           3 := the (S'a (nat (n - 2)))] ! 3) < 1 ∨
        int (length ps) < the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                           2 := the (S'a (nat (n - 1))), 
                                           3 := the (S'a (nat (n - 2)))] ! 3))
  (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) + nat (ps ! nat (int (length ps))))
  (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) +
   nat (ps ! nat (the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                   2 := the (S'a (nat (n - 1))), 
                                   3 := the (S'a (nat (n - 2)))] ! 3) - 1))) =
  the (cdm (l1, 0))"

constdefs if' :: "[bool, 'a, 'a] => 'a"
  "if' c a b ≡  if c then a else b"

declare if'_def [simp del]

lemma execSVMInstr_POPCONT :
    "[| (P', cdm, ctm, com) = trSVM2JVM ((svms, ctmap), ini, ct, ah, ai, bc);
        cdm , ctm, com \<turnstile> ((hm, k), k0, (l, i), S) \<triangleq> S1'; 
        (fst (the (map_of svms l)) ! i) = POPCONT;
        execSVMInst POPCONT (map_of ct) (hm, k) k0 (l, i) S = Either.Right S2;
        drop (the (cdm (l, i))) (extractBytecode P') =
        trInstr (the (cdm (l, i))) cdm' ctm' com pcc POPCONT @ bytecode'
      |] ==>   ∃ v' sh' dh' ih' fms' . 
      P' \<turnstile>  S1' -jvm-> (v',sh',dh',ih', fms') ∧
       cdm , ctm, com  \<turnstile>  S2  \<triangleq> (v',sh',dh',ih', fms')"
(* First, we make the tuples explicit *)
apply (case_tac S1')
apply (rename_tac v tup)
apply (case_tac tup)
apply (rename_tac sh tup)
apply (case_tac tup)
apply (rename_tac dh tup)
apply (case_tac tup)
apply (rename_tac ih fms)
apply (simp)
apply (subgoal_tac "∃ v1 k1 l1 S'. S=Val v1#Cont (k1,l1)#S'",clarsimp)


(* We now prove the subgoal *)
prefer 2
 apply (case_tac S)
  apply simp
  apply (insert RightNotUndefined)
  apply (erule_tac x= "S2" in allE, force)
 apply simp
 apply (case_tac a) 
   apply simp
   apply (case_tac list) 
    apply simp
   apply simp
   apply (case_tac aa) 
     apply simp
     apply (erule_tac x= "S2" in allE,force)
    apply simp
   apply simp
  apply simp
 apply simp

apply (unfold equivState_def) 
apply (elim exE,elim conjE)

(* we go on with the main goal. We instantiate the arrival JVM state*)

apply (rule_tac x="None" in exI)
apply (rule_tac x="sha((stackC, topf) \<mapsto> Intg (n - 2), 
                       (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 2 := the (S'a (nat (n - 1)))] ! 2)" in exI)
apply (rule_tac x="h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0)))" in exI)
apply (rule_tac x=inih in exI)
apply (rule_tac x="[([], 
                      vs[Suc 0 := the (S'a (nat n)), 2 := the (S'a (nat (n - 1))), 3 := the (S'a (nat (n - 2)))], 
                      safeP, sigSafeMain,
                      if' (((the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                           2 := the (S'a (nat (n - 1))), 
                                           3 := the (S'a (nat (n - 2)))] ! 3) < 1) ∨ 
                         (int (length ps) < the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                             2 := the (S'a (nat (n - 1))), 
                                                             3 := the (S'a (nat (n - 2)))] ! 3))))
                      (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) + 
                               nat (ps ! nat (int (length ps))))
                      (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) +
                               nat (ps ! nat (the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                               2 := the (S'a (nat (n - 1))), 
                                                               3 := the (S'a (nat (n - 2)))] ! 3) - 1))),
                      ref)]" in exI)

(* Now, we prove that the JVM sequence leads to the arrival state *)
apply (subgoal_tac "∃ vs pc . fms=([],vs,safeP,sigSafeMain,pc,ref)#[]")
 prefer 2 apply simp
apply (erule exE)+
apply (unfold exec_all_def)
apply (rule conjI)


apply (subgoal_tac "PC = (l,i)") prefer 2 apply simp 
apply simp apply (elim conjE) apply clarsimp
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,[([], vs, safeP, sigSafeMain, the (cdm (l,i)), aa,ba)]) -jvm-> 
                    (None,sha,h,inih,[([the (sha (stackC,Sf))], vs, safeP, sigSafeMain, the (cdm (l,i)) + 1, aa,ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)

(* We prove the first step of the SVM *)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (unfold extractBytecode_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      the (cdm (l, i))) = Getstatic Sf stackC",simp)
 apply (unfold trInstr.simps, erule nth_via_drop_append) 

(*  Getstatic topf stackC *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None, sha, h, inih, 
                        [([the (sha (stackC, Sf))], 
                        vs, safeP, sigSafeMain, the (cdm (l, i)) + 1, aa, ba)]) 
                    -jvm->
                        (None,sha,h,inih,
                        [([the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                        vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! Suc (the (cdm (l, i)))) = 
                      Getstatic topf stackC",simp)
 apply (erule nth_via_drop_append) 

(*  Dup2 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                        [([the (sha (stackC,topf)),the (sha (stackC, Sf))], 
                        vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1, aa, ba)])
                    -jvm->
                        (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! (Suc (Suc (the (cdm (l, i)))))) = 
                      Dup2",simp)
apply (erule nth_via_drop_append)



(*  Dup2 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! (Suc (Suc (Suc (the (cdm (l, i)))))))  = 
                      Dup2",simp)
apply (erule nth_via_drop_append)


(*  Dup2 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))) = 
                      Dup2",simp)
apply (erule nth_via_drop_append)

(* ArrLoad *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (S'a (nat n)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))) = 
                      ArrLoad",simp) 
  (* Equivalencia de entornos *)
  apply (frule equivS_POPCONT, simp)
  apply (simp add: raise_system_xcpt_def) 
apply (erule nth_via_drop_append)

(* Store (Suc 0) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (S'a (nat n)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs, safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))) = 
                      Store 1",simp)
apply (erule nth_via_drop_append)


(* LitPush (Intg 1) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg 1,
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 :=  the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))) = 
                      LitPush (Intg 1)",simp)
apply (erule nth_via_drop_append)


(* BinOp Substract *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg 1,
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg (the_Intg (the (sha (stackC, topf)))- 1),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))) = 
                      BinOp Substract",simp)
apply (erule nth_via_drop_append) 


(* ArrLoad *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg (the_Intg (the (sha (stackC, topf))) - 1),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC,Sf))], 
                         vs[Suc 0 :=  the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (S'a (nat (n - 1))),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 :=  the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))) = 
                      ArrLoad",simp)
  (* Equivalencia de entornos *)
  apply (frule equivS_POPCONT, simp)
  apply (simp add: raise_system_xcpt_def) 
apply (erule nth_via_drop_append)

(* Store 2 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (S'a (nat (n - 1))),
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))) = 
                      Store 2",simp) 
apply (erule nth_via_drop_append)


(* LitPush (Intg 2) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg 2,
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))) =
                      LitPush (Intg 2)",simp) 
apply (erule nth_via_drop_append)


(* BinOp Substract *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg 2,
                            the (sha (stackC,topf)),the (sha (stackC, Sf)),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg (the_Intg (the (sha (stackC, topf))) - 2),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))) =
                      BinOp Substract",simp)  
apply (erule nth_via_drop_append)

(* ArrLoad *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg (the_Intg (the (sha (stackC, topf))) - 2),
                            the (sha (stackC, Sf)),the (sha (stackC,topf)),
                            the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (S'a (nat (n - 2))),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                      (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))) =
                      ArrLoad",simp)
  (* Equivalencia de entornos *)
  apply (frule equivS_POPCONT, simp)
  apply (simp add: raise_system_xcpt_def) 
apply (erule nth_via_drop_append)

(* Store 3 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (S'a (nat (n - 2))),
                            the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))) =
                      Store 3",simp)  
apply (erule nth_via_drop_append)


(* LitPush (Intg 2) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg 2,
                           the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))))) =
                      LitPush (Intg 2)",simp)  
apply (erule nth_via_drop_append)


(* BinOp Substract *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg 2,
                           the (sha (stackC,topf)),the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                         safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                       safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))))) =
                      BinOp Substract",simp)  
apply (erule nth_via_drop_append)

(* Dup *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                       safeP, sigSafeMain, the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None,sha,h,inih,
                         [([Intg (n - 2),
                            Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))))))) =
                      Dup",simp)
apply (erule nth_via_drop_append)


(* Putstatic topf stackC *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None,sha,h,inih,
                         [([Intg (n - 2),
                            Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),h,inih,
                         [([Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))))))) =
                      Putstatic topf stackC",simp) 
apply (erule nth_via_drop_append)

(* Load (Suc 0) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile>  (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),h,inih,
                         [([Intg (n - 2),
                           the (sha (stackC,Sf))], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),h,inih,
                         [([vs[Suc 0 := the (S'a (nat n))]! Suc 0,
                           Intg (n - 2),
                           the (sha (stackC,Sf))], 
                          vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) !
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))))))))) =
                      Load 1",simp) 
apply (erule nth_via_drop_append)

(* ArrStore *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile>  (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),h,inih,
                         [([vs[Suc 0 := the (S'a (nat n))]! Suc 0,
                           Intg (n - 2),
                           the (sha (stackC,Sf))], 
                          vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([], 
                        vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))))))))) =
                      ArrStore",simp) 
  (* Equivalencia de entornos *)
  apply (frule equivS_POPCONT, simp)
  apply (simp add: raise_system_xcpt_def)
apply (erule nth_via_drop_append)

(* Load 2 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([], 
                        vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                   2 := the (S'a (nat (n - 1)))]!2], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1+1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))))))))))) = 
                      Load 2",simp)
apply (erule nth_via_drop_append)


(* Putstatic kOf heapC *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None, sha((stackC, topf) \<mapsto> Intg (n - 2)),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                   2 := the (S'a (nat (n - 1)))]!2], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                     the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1+1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                  the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))))))))))) = 
                      Putstatic k0f heapC",simp) 
apply (erule nth_via_drop_append)


(* Load 3 *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile> (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                  the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))]!3], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
            the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1 + 1 + 1 + 1, aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i))))))))))))))))))))))))))) = 
                     Load 3",simp) 
apply (erule nth_via_drop_append)

(* Goto (trAddr pcc (pc + incPop)) *)
apply (drule drop_Suc_append)
apply (subgoal_tac "P'\<turnstile>  (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))]!3], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
            the (cdm (l, i)) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +1 + 1 + 1 + 1, aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))]!3], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
           nat (24 + int (the (cdm (l, i))) + 
           trAddr pcc (the (cdm (l, i)) + incPop)), aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify) 
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain)))))) ! 
                     (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc 
                     (Suc (Suc (Suc (Suc (the (cdm (l, i)))))))))))))))))))))))))))) = 
                     Goto (trAddr pcc (the (cdm (l, i)) + incPop))",simp)
apply (erule nth_via_drop_append)

(* Tableswitch nts mts ps *)
apply (subgoal_tac "drop pcc (extractBytecode P') = 
                    [Tableswitch 1 (int (length ps)) ps] @ bytecode' ∧ ctm (nat (ps!i)) = Some i")
apply (elim conjE)
prefer 2 apply (rule Tableswitch_POPCONT)
apply (subgoal_tac "P'\<turnstile>  (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))]!3], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
           nat (24 + int (the (cdm (l, i))) + 
           trAddr pcc (the (cdm (l, i)) + incPop)), aa, ba)])
                    -jvm->
                         (None, sha((stackC, topf) \<mapsto> Intg (n - 2), (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                                           2 := the (S'a (nat (n - 1)))] ! 2),
                                h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))),inih,
                         [([], 
                         vs[Suc 0 := the (S'a (nat n)),
                                2 := the (S'a (nat (n - 1))),
                                3 := the (S'a (nat (n - 2)))],
                     safeP, sigSafeMain, 
                    if' (((the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                          2 := the (S'a (nat (n - 1))), 
                                          3 := the (S'a (nat (n - 2)))] ! 3) < 1) ∨ 
                        (int (length ps) < the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                            2 := the (S'a (nat (n - 1))), 
                                                            3 := the (S'a (nat (n - 2)))] ! 3))))
                    (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) + 
                             nat (ps ! nat (int (length ps))))
                    (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) +
                             nat (ps ! nat (the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                             2 := the (S'a (nat (n - 1))), 
                                                             3 := the (S'a (nat (n - 2)))] ! 3) - 1))),
                    aa, ba)])")
apply (unfold exec_all_def)
apply (erule rtrancl_trans)
prefer 2 
 apply (rule r_into_rtrancl)
 apply (clarify)
 apply (unfold extractBytecode_def)
 apply (unfold JVMExec.exec.simps) 
 apply (unfold Let_def)
 apply (subgoal_tac "(fst (snd (snd (snd (snd (the (method' (P', safeP) sigSafeMain))))))) ! 
                     (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop))) = 
                     Tableswitch 1 (int (length ps)) ps",simp)
apply (simp add: if'_def)
apply (subgoal_tac 
 "pcc = nat (24 + int (the (cdm (l, i))) + (int pcc - int (the (cdm (l, i)) + incPop)))")
 prefer 2 apply (simp add: incPop_def)
apply (simp add: trAddr_def)
apply (erule nth_via_drop)
apply simp



apply (rule_tac x="hm" in exI)
apply (rule_tac x="k" in exI)
apply (rule_tac x="k1" in exI)
apply (rule_tac x="(l1,0)" in exI)
apply (rule_tac x="Val v1 # S'" in exI)


apply (rule_tac x="sha((stackC, topf) \<mapsto> Intg (n - 2), 
                       (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 2 := the (S'a (nat (n - 1)))] ! 2)" in exI)
apply (rule_tac x="h(la \<mapsto> Arr ty m (S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0)))" in exI)
apply (rule_tac x=inih in exI)
apply (rule_tac x="vs[Suc 0 := the (S'a (nat n)), 
                          2 := the (S'a (nat (n - 1))), 
                          3 := the (S'a (nat (n - 2)))]" in exI)
apply (rule_tac x="if' (((the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                          2 := the (S'a (nat (n - 1))), 
                                          3 := the (S'a (nat (n - 2)))] ! 3) < 1) ∨ 
                        (int (length ps) < the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                            2 := the (S'a (nat (n - 1))), 
                                                            3 := the (S'a (nat (n - 2)))] ! 3))))
                    (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) + 
                             nat (ps ! nat (int (length ps))))
                    (nat (24 + int (the (cdm (l, i))) + trAddr pcc (the (cdm (l, i)) + incPop)) +
                             nat (ps ! nat (the_Intg (vs[Suc 0 := the (S'a (nat n)), 
                                                             2 := the (S'a (nat (n - 1))), 
                                                             3 := the (S'a (nat (n - 2)))] ! 3) - 1)))" in exI)
apply (rule_tac x="ref" in exI)

apply (rule_tac x="nat (the_Intg (the ((sha((stackC, topf) \<mapsto> Intg (n - 2), 
                                            (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                   2 := the (S'a (nat (n - 1)))] ! 2)) (heapC, kf))))" in exI)

apply (rule_tac x="nat (the_Intg (the ((sha((stackC, topf) \<mapsto> Intg (n - 2), 
                                            (heapC, k0f) \<mapsto> vs[Suc 0 := the (S'a (nat n)), 
                                                                   2 := the (S'a (nat (n - 1)))] ! 2)) (heapC, k0f))))" in exI)

apply (rule_tac x="la" in exI)
apply (rule_tac x="ty" in exI)
apply (rule_tac x="m" in exI)
apply (rule_tac x="S'a(nat (n - 2) \<mapsto> vs[Suc 0 := the (S'a (nat n))] ! Suc 0)" in exI)

apply (rule_tac x=" n - 2" in exI)
apply (rule_tac x="l'" in exI) 
apply (rule_tac x="regS" in exI)
apply (rule_tac x="l''" in exI) 
apply (rule_tac x="m'" in exI) 
apply (rule_tac x="m''" in exI)  
apply (rule_tac x="d" in exI) 
apply (rule_tac x="g" in exI)


apply (rule conjI, rule refl)
apply (rule conjI) apply (unfold trAddr_def)
                   apply (rule refl)
apply (rule conjI, rule refl)
apply (rule conjI, rule refl)
apply (rule conjI) apply clarsimp
                   apply (simp add: Sf_def add: topf_def) 
                   apply (simp add: stackC_def add: heapC_def)
apply (rule conjI, assumption)
apply (rule conjI) apply clarsimp
                   apply (simp add: stackC_def add: heapC_def)
                   apply (simp add: kf_def add: k0f_def) 
apply (rule conjI) apply (erule activeCells)
apply (rule conjI) apply (erule activeCells_2,assumption)
                   apply (erule activeCells_2,assumption)
apply (rule conjI, simp)
apply (rule conjI) apply (subgoal_tac "length vs = 10") 
                   apply (simp add: stackC_def add: heapC_def) 
                   apply (rule length_vs) 
apply (rule conjI) apply clarsimp
                   apply (simp add: stackC_def add: heapC_def)  
                   apply (simp add: regionsf_def add: k0f_def)
apply (rule conjI) apply clarsimp 
apply (rule conjI) apply clarsimp 
                   apply (simp add: dirCellC_def add: stackC_def) 
                   apply (simp add: heapC_def add: safeDirf_def)
apply (rule conjI) apply clarsimp
apply (rule conjI) apply clarsimp
apply (rule conjI) apply clarsimp
apply (rule conjI) apply (subgoal_tac "length vs = 10")
                   apply (rule equivH_POPCONT,assumption+)
                   apply simp
                   apply (rule length_vs)
apply (rule conjI) apply clarsimp 
apply (rule conjI) apply clarsimp 
                   apply (subgoal_tac "length vs = 10")
                   apply (rule equivS2_POPCONT,simp,assumption+)
                   apply (rule length_vs)
apply (rule conjI) apply (subgoal_tac "length vs = 10")
                   apply clarsimp
                   apply (rule equivS_k1,assumption+)
                   apply (rule length_vs)
by (rule equivpc_POPCONT)

end 

lemma equivS_POPCONT:

  equivS (v1.0 # Cont (k1.0, l1.0) # S) S' n ctm d g ==> 2  n

lemma equivS2_POPCONT:

  [| 2 < length vs; equivS (Val v1.0 # Cont (k1.0, l1.0) # S') S'a n ctm d g |]
  ==> equivS (Val v1.0 # S')
       (S'a(nat (n - 2) |-> vs[Suc 0 := the (S'a (nat n))] ! Suc 0)) (n - 2) ctm d
       g

lemma equivS_k1:

  equivS (Val v1.0 # Cont (k1.0, l1.0) # S') S'a n ctm d g
  ==> k1.0 = nat (the_Intg (the (S'a (nat (n - 1)))))

lemma activeCells_POPCONT:

  la  activeCells regS h (nat (the_Intg (the (sha (heapC, kf)))))
  ==> activeCells regS h (nat (the_Intg (the (sha (heapC, kf))))) =
      activeCells regS
       (h(la |-> Arr ty m (S'a(nat (n - 2) |-> the (S'a (nat n))))))
       (nat (the_Intg (the (sha (heapC, kf)))))

lemma domH_POPCONT:

  [| la  activeCells regS h (nat (the_Intg (the (sha (heapC, kf)))));
     ∀ldom H.
        ∃l'. l' = the (g l) ∧
             equivC (the (H l)) h l' (the (h l'))
              (nat (the_Intg (the (sha (heapC, kf))))) com regS d g |]
  ==> ∀ldom H.
         ∃l'. l' = the (g l) ∧
              equivC (the (H l))
               (h(la |-> Arr ty m (S'a(nat (n - 2) |-> the (S'a (nat n)))))) l'
               (the ((h(la |-> Arr ty m (S'a(nat (n - 2) |-> the (S'a (nat n))))))
                      l'))
               (nat (the_Intg (the (sha (heapC, kf))))) com regS d g

lemma equivH_POPCONT:

  [| ((hm, k), k0.0, (l, i), v1.0 # Cont (k1.0, l1.0) # S') =
     ((H, ka), k0a, PC, S);
     k' = nat (the_Intg (the (sha (heapC, kf))));
     k0' = nat (the_Intg (the (sha (heapC, k0f))));
     sha (stackC, Sf) = Some (Addr la); distinct [la, l', l''];
     h la = Some (Arr ty m S'a); sha (stackC, topf) = Some (Intg n);
     sha (heapC, regionsf) = Some (Addr l'); h l' = Some (Arr ty m' regS);
     sha (dirCellC, safeDirf) = Some (Addr l''); h l'' = Some (Arr ty m'' d);
     inj_on g (dom H); equivH (H, ka) h k' com regS d g; k0a = k0';
     activeCells regS h k' ∩ {la, l', l''} = {}; 2 < length vs |]
  ==> equivH (hm, k)
       (h(la |->
        Arr ty m (S'a(nat (n - 2) |-> vs[Suc 0 := the (S'a (nat n))] ! Suc 0))))
       (nat (the_Intg
              (the ((sha((stackC, topf) |-> Intg (n - 2), (heapC, k0f) |->
                     vs[Suc 0 := the (S'a (nat n)),
                        2 := the (S'a (nat (n - 1)))] !
                     2))
                     (heapC, kf)))))
       com regS d g

lemma execSVMInstr_POPCONT:

  [| (P', cdm, ctm, com) = trSVM2JVM ((svms, ctmap), ini, ct, ah, ai, bc);
     cdm , ctm, com \<turnstile> ((hm, k), k0.0, (l, i), S) \<triangleq> S1';
     fst (the (map_of svms l)) ! i = POPCONT;
     execSVMInst POPCONT (map_of ct) (hm, k) k0.0 (l, i) S = Either.Right S2.0;
     drop (the (cdm (l, i))) (extractBytecode P') =
     trInstr (the (cdm (l, i))) cdm' ctm' com pcc POPCONT @ bytecode' |]
  ==> ∃v' sh' dh' ih' fms'.
         P' |- S1' -jvm-> (v', sh', dh', ih', fms') ∧
         cdm , ctm, com \<turnstile> S2.0 \<triangleq> (v', sh', dh', ih', fms')