induct: fixes P1 :: "Var list \<times> (int \<times> Instr) list \<times> int \<Rightarrow> int \<Rightarrow> Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list \<Rightarrow> nat \<Rightarrow> int \<Rightarrow> Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list \<Rightarrow> bool"   and P2 :: "Var list \<times> (int \<times> Instr) list \<times> int \<Rightarrow> int \<Rightarrow> Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list \<Rightarrow> nat \<Rightarrow> (Addr \<times> Class \<times> (Field \<times> Val) list) list \<Rightarrow> Val \<Rightarrow> bool"   and x1 :: "Var list \<times> (int \<times> Instr) list \<times> int"   and x2 :: "int"   and x3 :: "Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list"   and x4 :: "nat"   and x5 :: "int"   and x6 :: "Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list"   and x7 :: "Var list \<times> (int \<times> Instr) list \<times> int"   and x8 :: "int"   and x9 :: "Val list \<times> (Var \<times> Val) list \<times> (Addr \<times> Class \<times> (Field \<times> Val) list) list"   and x10 :: "nat"   and x11 :: "(Addr \<times> Class \<times> (Field \<times> Val) list) list"   and x12 :: "Val" assumes "\<And>M l v NEXT os s h ll. \<lbrakk>get_ins M l = Some (const v); NEXT = (v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (os, s, h) 1 ll NEXT"   and "\<And>M l NEXT v os s h ll. \<lbrakk>get_ins M l = Some dup; NEXT = (v # v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # os, s, h) 1 ll NEXT"   and "\<And>M l NEXT os s h ll v. \<lbrakk>get_ins M l = Some pop; NEXT = (os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # os, s, h) 1 ll NEXT"   and "\<And>M l NEXT w v os s h ll. \<lbrakk>get_ins M l = Some swap; NEXT = (w # v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # w # os, s, h) 1 ll NEXT"   and "\<And>M l x s v NEXT os h ll. \<lbrakk>get_ins M l = Some (load x); s\<down>x = Some v; NEXT = (v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (os, s, h) 1 ll NEXT"   and "\<And>M l x NEXT os s v h ll. \<lbrakk>get_ins M l = Some (store x); NEXT = (os, s[x\<mapsto>v], h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # os, s, h) 1 ll NEXT"   and "\<And>M l f NEXT v w os s h ll. \<lbrakk>get_ins M l = Some (binop f); NEXT = (f v w # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # w # os, s, h) 1 ll NEXT"   and "\<And>M l f NEXT v os s h ll. \<lbrakk>get_ins M l = Some (unop f); NEXT = (f v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # os, s, h) 1 ll NEXT"   and "\<And>M l d newobj a h NEXT os s ll. \<lbrakk>get_ins M l = Some (new d); newobj = (d, emp); a = nextLoc h; NEXT = (RVal (Loc a) # os, s, h[a\<mapsto>newobj]); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (os, s, h) 1 ll NEXT"   and "\<And>M l d F h a Flds v NEXT os s ll. \<lbrakk>get_ins M l = Some (getfield d F); h\<down>a = Some (d, Flds); Flds\<down>F = Some v; NEXT = (v # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (RVal (Loc a) # os, s, h) 1 ll NEXT"   and "\<And>M l d F h a Flds newobj v NEXT os s ll. \<lbrakk>get_ins M l = Some (putfield d F); h\<down>a = Some (d, Flds); newobj = (d, Flds[F\<mapsto>v]); NEXT = (os, s, h[a\<mapsto>newobj]); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # RVal (Loc a) # os, s, h) 1 ll NEXT"   and "\<And>M l d h a Flds NEXT os s ll. \<lbrakk>get_ins M l = Some (checkcast d); h\<down>a = Some (d, Flds); NEXT = (RVal (Loc a) # os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (RVal (Loc a) # os, s, h) 1 ll NEXT"   and "\<And>M l pc S. get_ins M l = Some (goto pc) \<Longrightarrow> P1 M l S 1 pc S"   and "\<And>M l pc NEXT os s h. \<lbrakk>get_ins M l = Some (iftrue pc); NEXT = (os, s, h)\<rbrakk> \<Longrightarrow> P1 M l (TRUE # os, s, h) 1 pc NEXT"   and "\<And>M l pc v NEXT os s h ll. \<lbrakk>get_ins M l = Some (iftrue pc); v \<noteq> TRUE; NEXT = (os, s, h); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (v # os, s, h) 1 ll NEXT"   and "\<And>M l C m par code l0 S h n hh v ops os NEXT s ll. \<lbrakk>get_ins M l = Some (invokeS C m); mbody_is C m (par, code, l0); ((par, code, l0), l0, ([], S, h), n, hh, v) \<in> Exec; P2 (par, code, l0) l0 ([], S, h) n hh v; (ops, par, S, os) \<in> Frame; NEXT = (v # os, s, hh); ll = l + 1\<rbrakk> \<Longrightarrow> P1 M l (ops, s, h) (Suc n) ll NEXT"   and "\<And>M l v os s h. get_ins M l = Some vreturn \<Longrightarrow> P2 M l (v # os, s, h) 1 h v"   and "\<And>M l s n ll t m h v k. \<lbrakk>(M, l, s, n, ll, t) \<in> Step; P1 M l s n ll t; (M, ll, t, m, h, v) \<in> Exec; P2 M ll t m h v; k = max n m + 1\<rbrakk> \<Longrightarrow> P2 M l s k h v" shows "((x1, x2, x3, x4, x5, x6) \<in> Step \<longrightarrow> P1 x1 x2 x3 x4 x5 x6) \<and> ((x7, x8, x9, x10, x11, x12) \<in> Exec \<longrightarrow> P2 x7 x8 x9 x10 x11 x12)"