eval_induct: fixes G :: "prog"   and x1 :: "state"   and x2 :: "Term.term"   and x3 :: "vals"   and x4 :: "state"   and P :: "state \<Rightarrow> Term.term \<Rightarrow> vals \<Rightarrow> state \<Rightarrow> bool" assumes "G\<turnstile>x1 \<midarrow>x2\<succ>\<rightarrow> (x3, x4)"   and "\<And>xc s t. P (Some xc, s) t (undefined3 t) (Some xc, s)"   and "\<And>s. P (Norm s) (In1r Skip) \<diamondsuit> (Norm s)"   and "\<And>s j. P (Norm s) (In1r (Jmp j)) \<diamondsuit> (Some (Jump j), s)"   and "\<And>s0 c s1 l. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>c\<rightarrow> s1; P (Norm s0) (In1r c) \<diamondsuit> s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (l\<bullet> c)) \<diamondsuit> (abupd (absorb l) s1)"   and "\<And>s0. P (Norm s0) (In3 []) (In3 []) (Norm s0)"   and "\<And>s0 e v s1 es vs s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l e) (In1 v) s1; G\<turnstile>s1 \<midarrow>es\<doteq>\<succ>vs\<rightarrow> s2; P s1 (In3 es) (In3 vs) s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In3 (e # es)) (In3 (v # vs)) s2"   and "\<And>s vn. P (Norm s) (In2 (LVar vn)) (In2 (lvar vn s)) (Norm s)"   and "\<And>s0 e v s1 s2 T. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l e) (In1 v) s1; s2 = abupd (raise_if (\<not> G,snd s1\<turnstile>v fits T) ClassCast) s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (Cast T e)) (In1 v) s2"   and "\<And>s0 e v s1 b T. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l e) (In1 v) s1; b = (v \<noteq> Null \<and> G,snd s1\<turnstile>v fits RefT T)\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (e InstOf T)) (In1 (Bool b)) s1"   and "\<And>s v. P (Norm s) (In1l (Lit v)) (In1 v) (Norm s)"   and "\<And>s0 e v s1 unop. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l e) (In1 v) s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (UnOp unop e)) (In1 (eval_unop unop v)) s1"   and "\<And>s0 e1 v1 s1 binop e2 v2 s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e1-\<succ>v1\<rightarrow> s1; P (Norm s0) (In1l e1) (In1 v1) s1; G\<turnstile>s1 \<midarrow>(if need_second_arg binop v1 then In1l e2 else In1r Skip)\<succ>\<rightarrow> (In1 v2, s2); P s1 (if need_second_arg binop v1 then In1l e2 else In1r Skip) (In1 v2) s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (BinOp binop e1 e2)) (In1 (eval_binop binop v1 v2)) s2"   and "\<And>s. P (Norm s) (In1l Super) (In1 (val_this s)) (Norm s)"   and "\<And>s0 va v f s1. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>va=\<succ>(v, f)\<rightarrow> s1; P (Norm s0) (In2 va) (In2 (v, f)) s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (Acc va)) (In1 v) s1"   and "\<And>s0 e v s1. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l e) (In1 v) s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (Expr e)) \<diamondsuit> s1"   and "\<And>s0 c1 s1 c2 s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>c1\<rightarrow> s1; P (Norm s0) (In1r c1) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>c2\<rightarrow> s2; P s1 (In1r c2) \<diamondsuit> s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (c1;; c2)) \<diamondsuit> s2"   and "\<And>s0 D sig v s1. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>body G D sig-\<succ>v\<rightarrow> s1; P (Norm s0) (In1l (body G D sig)) (In1 v) s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (Methd D sig)) (In1 v) s1"   and "\<And>s0 D s1 c s2 s3. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>Init D\<rightarrow> s1; P (Norm s0) (In1r (Init D)) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>c\<rightarrow> s2; P s1 (In1r c) \<diamondsuit> s2; s3 = (if \<exists>l. fst s2 = Some (Jump (Break l)) \<or> fst s2 = Some (Jump (Cont l)) then abupd (\<lambda>x. Some (Error CrossMethodJump)) s2 else s2)\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (Body D c)) (In1 (the (locals (snd s2) Result))) (abupd (absorb Ret) s3)"   and "\<And>s0 e0 b s1 e1 e2 v s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e0-\<succ>b\<rightarrow> s1; P (Norm s0) (In1l e0) (In1 b) s1; G\<turnstile>s1 \<midarrow>(if the_Bool b then e1 else e2)-\<succ>v\<rightarrow> s2; P s1 (In1l (if the_Bool b then e1 else e2)) (In1 v) s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (e0 ? e1 : e2)) (In1 v) s2"   and "\<And>s0 e b s1 c1 c2 s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>b\<rightarrow> s1; P (Norm s0) (In1l e) (In1 b) s1; G\<turnstile>s1 \<midarrow>(if the_Bool b then c1 else c2)\<rightarrow> s2; P s1 (In1r (if the_Bool b then c1 else c2)) \<diamondsuit> s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (If(e) c1 Else c2)) \<diamondsuit> s2"   and "\<And>s0 e b s1 c s2 l s3. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>b\<rightarrow> s1; P (Norm s0) (In1l e) (In1 b) s1; if the_Bool b then (G\<turnstile>s1 \<midarrow>c\<rightarrow> s2 \<and> P s1 (In1r c) \<diamondsuit> s2) \<and> G\<turnstile>abupd (absorb (Cont l)) s2 \<midarrow>l\<bullet> While(e) c\<rightarrow> s3 \<and> P (abupd (absorb (Cont l)) s2) (In1r (l\<bullet> While(e) c)) \<diamondsuit> s3 else s3 = s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (l\<bullet> While(e) c)) \<diamondsuit> s3"   and "\<And>s0 c1 x1 s1 c2 s2 s3. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>c1\<rightarrow> (x1, s1); P (Norm s0) (In1r c1) \<diamondsuit> (x1, s1); G\<turnstile>Norm s1 \<midarrow>c2\<rightarrow> s2; P (Norm s1) (In1r c2) \<diamondsuit> s2; s3 = (if \<exists>err. x1 = Some (Error err) then (x1, s1) else abupd (abrupt_if (x1 \<noteq> None) x1) s2)\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (c1 Finally c2)) \<diamondsuit> s3"   and "\<And>s0 e a' s1. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>a'\<rightarrow> s1; P (Norm s0) (In1l e) (In1 a') s1\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (Throw e)) \<diamondsuit> (abupd (throw a') s1)"   and "\<And>s0 C s1 a s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>Init C\<rightarrow> s1; P (Norm s0) (In1r (Init C)) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>halloc CInst C\<succ>a\<rightarrow> s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (NewC C)) (In1 (Addr a)) s2"   and "\<And>s0 T s1 e i' s2 a s3. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>init_comp_ty T\<rightarrow> s1; P (Norm s0) (In1r (init_comp_ty T)) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>e-\<succ>i'\<rightarrow> s2; P s1 (In1l e) (In1 i') s2; G\<turnstile>abupd (check_neg i') s2 \<midarrow>halloc Arr T (the_Intg i')\<succ>a\<rightarrow> s3\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (New T[e])) (In1 (Addr a)) s3"   and "\<And>C c s0 s3 s1 s2. \<lbrakk>the (class G C) = c; if inited C (globs s0) then s3 = Norm s0 else (G\<turnstile>Norm (init_class_obj G C s0) \<midarrow>(if C = Object then Skip else Init (super c))\<rightarrow> s1 \<and> P (Norm (init_class_obj G C s0)) (In1r (if C = Object then Skip else Init (super c))) \<diamondsuit> s1) \<and> (G\<turnstile>set_lvars Map.empty s1 \<midarrow>init c\<rightarrow> s2 \<and> P (set_lvars Map.empty s1) (In1r (init c)) \<diamondsuit> s2) \<and> s3 = set_lvars (locals (snd s1)) s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (Init C)) \<diamondsuit> s3"   and "\<And>s0 va w f s1 e v s2. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>va=\<succ>(w, f)\<rightarrow> s1; P (Norm s0) (In2 va) (In2 (w, f)) s1; G\<turnstile>s1 \<midarrow>e-\<succ>v\<rightarrow> s2; P s1 (In1l e) (In1 v) s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l (va:=e)) (In1 v) (assign f v s2)"   and "\<And>s0 c1 s1 s2 C vn c2 s3. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>c1\<rightarrow> s1; P (Norm s0) (In1r c1) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>sxalloc\<rightarrow> s2; if G,s2\<turnstile>catch C then G\<turnstile>new_xcpt_var vn s2 \<midarrow>c2\<rightarrow> s3 \<and> P (new_xcpt_var vn s2) (In1r c2) \<diamondsuit> s3 else s3 = s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In1r (Try c1 Catch(C vn) c2)) \<diamondsuit> s3"   and "\<And>s0 statDeclC s1 e a s2 v s2' stat fn s3 accC. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>Init statDeclC\<rightarrow> s1; P (Norm s0) (In1r (Init statDeclC)) \<diamondsuit> s1; G\<turnstile>s1 \<midarrow>e-\<succ>a\<rightarrow> s2; P s1 (In1l e) (In1 a) s2; (v, s2') = fvar statDeclC stat fn a s2; s3 = check_field_access G accC statDeclC fn stat a s2'\<rbrakk> \<Longrightarrow> P (Norm s0) (In2 ({accC,statDeclC,stat}e..fn)) (In2 v) s3"   and "\<And>s0 e1 a s1 e2 i s2 v s2'. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e1-\<succ>a\<rightarrow> s1; P (Norm s0) (In1l e1) (In1 a) s1; G\<turnstile>s1 \<midarrow>e2-\<succ>i\<rightarrow> s2; P s1 (In1l e2) (In1 i) s2; (v, s2') = avar G i a s2\<rbrakk> \<Longrightarrow> P (Norm s0) (In2 (e1.[e2])) (In2 v) s2'"   and "\<And>s0 e a' s1 args vs s2 D mode statT mn pTs s3 s3' accC v s4. \<lbrakk>G\<turnstile>Norm s0 \<midarrow>e-\<succ>a'\<rightarrow> s1; P (Norm s0) (In1l e) (In1 a') s1; G\<turnstile>s1 \<midarrow>args\<doteq>\<succ>vs\<rightarrow> s2; P s1 (In3 args) (In3 vs) s2; D = invocation_declclass G mode (snd s2) a' statT \<lparr>name = mn, parTs = pTs\<rparr>; s3 = init_lvars G D \<lparr>name = mn, parTs = pTs\<rparr> mode a' vs s2; s3' = check_method_access G accC statT mode \<lparr>name = mn, parTs = pTs\<rparr> a' s3; G\<turnstile>s3' \<midarrow>Methd D \<lparr>name = mn, parTs = pTs\<rparr>-\<succ>v\<rightarrow> s4; P s3' (In1l (Methd D \<lparr>name = mn, parTs = pTs\<rparr>)) (In1 v) s4\<rbrakk> \<Longrightarrow> P (Norm s0) (In1l ({accC,statT,mode}e\<cdot>mn( {pTs}args))) (In1 v) (set_lvars (locals (snd s2)) s4)" shows "P x1 x2 x3 x4"