induct: fixes x1 :: "s"   and x2 :: "v list"   and x3 :: "e list"   and x4 :: "nat"   and x5 :: "s"   and x6 :: "v list"   and x7 :: "e list"   and P :: "s \<Rightarrow> v list \<Rightarrow> e list \<Rightarrow> nat \<Rightarrow> s \<Rightarrow> v list \<Rightarrow> e list \<Rightarrow> bool" assumes "\<lparr>x1;x2;x3\<rparr> \<leadsto>_ x4 \<lparr>x5;x6;x7\<rparr>"   and "\<And>e e' s vs i. \<lparr>e\<rparr> \<leadsto> \<lparr>e'\<rparr> \<Longrightarrow> P s vs e i s vs e'"   and "\<And>s vs j i. P s vs [$Call j] i s vs [Callcl (sfunc s i j)]"   and "\<And>s i c cl j tf vs. \<lbrakk>stab s i (nat_of_int c) = Some cl; stypes s i j = tf; cl_type cl = tf\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 c, $Call_indirect j] i s vs [Callcl cl]"   and "\<And>s i c cl j vs. stab s i (nat_of_int c) = Some cl \<and> stypes s i j \<noteq> cl_type cl \<or> stab s i (nat_of_int c) = None \<Longrightarrow> P s vs [$C ConstInt32 c, $Call_indirect j] i s vs [Trap]"   and "\<And>cl j t1s t2s ts es ves vcs n k m zs s vs i. \<lbrakk>cl = Func_native j (t1s _> t2s) ts es; ves = $$* vcs; length vcs = n; length ts = k; length t1s = n; length t2s = m; n_zeros ts = zs\<rbrakk> \<Longrightarrow> P s vs (ves @ [Callcl cl]) i s vs [Local m j (vcs @ zs) [$Block ([] _> t2s) es]]"   and "\<And>cl t1s t2s f ves vcs n m s hs s' vcs' vs i. \<lbrakk>cl = Func_host (t1s _> t2s) f; ves = $$* vcs; length vcs = n; length t1s = n; length t2s = m; host_apply s (t1s _> t2s) f vcs hs = Some (s', vcs')\<rbrakk> \<Longrightarrow> P s vs (ves @ [Callcl cl]) i s' vs ($$* vcs')"   and "\<And>cl t1s t2s f ves vcs n m s vs i. \<lbrakk>cl = Func_host (t1s _> t2s) f; ves = $$* vcs; length vcs = n; length t1s = n; length t2s = m\<rbrakk> \<Longrightarrow> P s vs (ves @ [Callcl cl]) i s vs [Trap]"   and "\<And>vi j s v vs i. length vi = j \<Longrightarrow> P s (vi @ [v] @ vs) [$Get_local j] i s (vi @ [v] @ vs) [$C v]"   and "\<And>vi j s v vs v' i. length vi = j \<Longrightarrow> P s (vi @ [v] @ vs) [$C v', $Set_local j] i s (vi @ [v'] @ vs) []"   and "\<And>s vs j i. P s vs [$Get_global j] i s vs [$C sglob_val s i j]"   and "\<And>s i j v s' vs. supdate_glob s i j v = s' \<Longrightarrow> P s vs [$C v, $Set_global j] i s' vs []"   and "\<And>s i j m k off t bs vs a. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; load m (nat_of_int k) off (t_length t) = Some bs\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $Load t None a off] i s vs [$C wasm_deserialise bs t]"   and "\<And>s i j m k off t vs a. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; load m (nat_of_int k) off (t_length t) = None\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $Load t None a off] i s vs [Trap]"   and "\<And>s i j m sx k off tp t bs vs a. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; load_packed sx m (nat_of_int k) off (tp_length tp) (t_length t) = Some bs\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $Load t (Some (tp, sx)) a off] i s vs [$C wasm_deserialise bs t]"   and "\<And>s i j m sx k off tp t vs a. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; load_packed sx m (nat_of_int k) off (tp_length tp) (t_length t) = None\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $Load t (Some (tp, sx)) a off] i s vs [Trap]"   and "\<And>t v s i j m k off mem' vs a. \<lbrakk>types_agree t v; smem_ind s i = Some j; s.mem s ! j = m; store m (nat_of_int k) off (bits v) (t_length t) = Some mem'\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $C v, $Store t None a off] i (s\<lparr>s.mem := (s.mem s)[j := mem']\<rparr>) vs []"   and "\<And>t v s i j m k off vs a. \<lbrakk>types_agree t v; smem_ind s i = Some j; s.mem s ! j = m; store m (nat_of_int k) off (bits v) (t_length t) = None\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $C v, $Store t None a off] i s vs [Trap]"   and "\<And>t v s i j m k off tp mem' vs a. \<lbrakk>types_agree t v; smem_ind s i = Some j; s.mem s ! j = m; store_packed m (nat_of_int k) off (bits v) (tp_length tp) = Some mem'\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $C v, $Store t (Some tp) a off] i (s\<lparr>s.mem := (s.mem s)[j := mem']\<rparr>) vs []"   and "\<And>t v s i j m k off tp vs a. \<lbrakk>types_agree t v; smem_ind s i = Some j; s.mem s ! j = m; store_packed m (nat_of_int k) off (bits v) (tp_length tp) = None\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 k, $C v, $Store t (Some tp) a off] i s vs [Trap]"   and "\<And>s i j m n vs. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; mem_size m = n\<rbrakk> \<Longrightarrow> P s vs [$Current_memory] i s vs [$C ConstInt32 (int_of_nat n)]"   and "\<And>s i j m n c mem' vs. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; mem_size m = n; mem_grow m (nat_of_int c) = mem'\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 c, $Grow_memory] i (s\<lparr>s.mem := (s.mem s)[j := mem']\<rparr>) vs [$C ConstInt32 (int_of_nat n)]"   and "\<And>s i j m n vs c. \<lbrakk>smem_ind s i = Some j; s.mem s ! j = m; mem_size m = n\<rbrakk> \<Longrightarrow> P s vs [$C ConstInt32 c, $Grow_memory] i s vs [$C ConstInt32 int32_minus_one]"   and "\<And>s vs es i s' vs' es' k lholed les les'. \<lbrakk>\<lparr>s;vs;es\<rparr> \<leadsto>_ i \<lparr>s';vs';es'\<rparr>; P s vs es i s' vs' es'; Lfilled k lholed es les; Lfilled k lholed es' les'\<rbrakk> \<Longrightarrow> P s vs les i s' vs' les'"   and "\<And>s vs es i s' vs' es' v0s n j. \<lbrakk>\<lparr>s;vs;es\<rparr> \<leadsto>_ i \<lparr>s';vs';es'\<rparr>; P s vs es i s' vs' es'\<rbrakk> \<Longrightarrow> P s v0s [Local n i vs es] j s' v0s [Local n i vs' es']" shows "P x1 x2 x3 x4 x5 x6 x7"