induct: fixes x1 :: "t_context"   and x2 :: "b_e list"   and x3 :: "tf"   and P :: "t_context \<Rightarrow> b_e list \<Rightarrow> tf \<Rightarrow> bool" assumes "x1 \<turnstile> x2 : x3"   and "\<And>\<C> v. P \<C> [C v] ([] _> [typeof v])"   and "\<And>t \<C> uu_. is_int_t t \<Longrightarrow> P \<C> [Unop_i t uu_] ([t] _> [t])"   and "\<And>t \<C> uv_. is_float_t t \<Longrightarrow> P \<C> [Unop_f t uv_] ([t] _> [t])"   and "\<And>t \<C> iop. is_int_t t \<Longrightarrow> P \<C> [Binop_i t iop] ([t, t] _> [t])"   and "\<And>t \<C> uw_. is_float_t t \<Longrightarrow> P \<C> [Binop_f t uw_] ([t, t] _> [t])"   and "\<And>t \<C> ux_. is_int_t t \<Longrightarrow> P \<C> [Testop t ux_] ([t] _> [T_i32])"   and "\<And>t \<C> uy_. is_int_t t \<Longrightarrow> P \<C> [Relop_i t uy_] ([t, t] _> [T_i32])"   and "\<And>t \<C> uz_. is_float_t t \<Longrightarrow> P \<C> [Relop_f t uz_] ([t, t] _> [T_i32])"   and "\<And>t1 t2 sx \<C>. \<lbrakk>t1 \<noteq> t2; (sx = None) = (is_float_t t1 \<and> is_float_t t2 \<or> is_int_t t1 \<and> is_int_t t2 \<and> t_length t1 < t_length t2)\<rbrakk> \<Longrightarrow> P \<C> [Cvtop t1 Convert t2 sx] ([t2] _> [t1])"   and "\<And>t1 t2 \<C>. \<lbrakk>t1 \<noteq> t2; t_length t1 = t_length t2\<rbrakk> \<Longrightarrow> P \<C> [Cvtop t1 Reinterpret t2 None] ([t2] _> [t1])"   and "\<And>\<C> ts ts'. P \<C> [Unreachable] (ts _> ts')"   and "\<And>\<C>. P \<C> [Nop] ([] _> [])"   and "\<And>\<C> t. P \<C> [Drop] ([t] _> [])"   and "\<And>\<C> t. P \<C> [Select] ([t, t, T_i32] _> [t])"   and "\<And>tf tn tm \<C> es. \<lbrakk>tf = tn _> tm; \<C>\<lparr>label := [tm] @ label \<C>\<rparr> \<turnstile> es : tn _> tm; P (\<C>\<lparr>label := [tm] @ label \<C>\<rparr>) es (tn _> tm)\<rbrakk> \<Longrightarrow> P \<C> [Block tf es] (tn _> tm)"   and "\<And>tf tn tm \<C> es. \<lbrakk>tf = tn _> tm; \<C>\<lparr>label := [tn] @ label \<C>\<rparr> \<turnstile> es : tn _> tm; P (\<C>\<lparr>label := [tn] @ label \<C>\<rparr>) es (tn _> tm)\<rbrakk> \<Longrightarrow> P \<C> [Loop tf es] (tn _> tm)"   and "\<And>tf tn tm \<C> es1 es2. \<lbrakk>tf = tn _> tm; \<C>\<lparr>label := [tm] @ label \<C>\<rparr> \<turnstile> es1 : tn _> tm; P (\<C>\<lparr>label := [tm] @ label \<C>\<rparr>) es1 (tn _> tm); \<C>\<lparr>label := [tm] @ label \<C>\<rparr> \<turnstile> es2 : tn _> tm; P (\<C>\<lparr>label := [tm] @ label \<C>\<rparr>) es2 (tn _> tm)\<rbrakk> \<Longrightarrow> P \<C> [b_e.If tf es1 es2] (tn @ [T_i32] _> tm)"   and "\<And>i \<C> ts t1s t2s. \<lbrakk>i < length (label \<C>); label \<C> ! i = ts\<rbrakk> \<Longrightarrow> P \<C> [Br i] (t1s @ ts _> t2s)"   and "\<And>i \<C> ts. \<lbrakk>i < length (label \<C>); label \<C> ! i = ts\<rbrakk> \<Longrightarrow> P \<C> [Br_if i] (ts @ [T_i32] _> ts)"   and "\<And>\<C> ts is i t1s t2s. list_all (\<lambda>i. i < length (label \<C>) \<and> label \<C> ! i = ts) (is @ [i]) \<Longrightarrow> P \<C> [Br_table is i] (t1s @ ts @ [T_i32] _> t2s)"   and "\<And>\<C> ts t1s t2s. return \<C> = Some ts \<Longrightarrow> P \<C> [Return] (t1s @ ts _> t2s)"   and "\<And>i \<C> tf. \<lbrakk>i < length (func_t \<C>); func_t \<C> ! i = tf\<rbrakk> \<Longrightarrow> P \<C> [Call i] tf"   and "\<And>i \<C> t1s t2s. \<lbrakk>i < length (types_t \<C>); types_t \<C> ! i = t1s _> t2s; table \<C> \<noteq> None\<rbrakk> \<Longrightarrow> P \<C> [Call_indirect i] (t1s @ [T_i32] _> t2s)"   and "\<And>i \<C> t. \<lbrakk>i < length (local \<C>); local \<C> ! i = t\<rbrakk> \<Longrightarrow> P \<C> [Get_local i] ([] _> [t])"   and "\<And>i \<C> t. \<lbrakk>i < length (local \<C>); local \<C> ! i = t\<rbrakk> \<Longrightarrow> P \<C> [Set_local i] ([t] _> [])"   and "\<And>i \<C> t. \<lbrakk>i < length (local \<C>); local \<C> ! i = t\<rbrakk> \<Longrightarrow> P \<C> [Tee_local i] ([t] _> [t])"   and "\<And>i \<C> t. \<lbrakk>i < length (global \<C>); tg_t (global \<C> ! i) = t\<rbrakk> \<Longrightarrow> P \<C> [Get_global i] ([] _> [t])"   and "\<And>i \<C> t. \<lbrakk>i < length (global \<C>); tg_t (global \<C> ! i) = t; is_mut (global \<C> ! i)\<rbrakk> \<Longrightarrow> P \<C> [Set_global i] ([t] _> [])"   and "\<And>\<C> n a tp_sx t off. \<lbrakk>memory \<C> = Some n; load_store_t_bounds a (option_projl tp_sx) t\<rbrakk> \<Longrightarrow> P \<C> [Load t tp_sx a off] ([T_i32] _> [t])"   and "\<And>\<C> n a tp t off. \<lbrakk>memory \<C> = Some n; load_store_t_bounds a tp t\<rbrakk> \<Longrightarrow> P \<C> [Store t tp a off] ([T_i32, t] _> [])"   and "\<And>\<C> n. memory \<C> = Some n \<Longrightarrow> P \<C> [Current_memory] ([] _> [T_i32])"   and "\<And>\<C> n. memory \<C> = Some n \<Longrightarrow> P \<C> [Grow_memory] ([T_i32] _> [T_i32])"   and "\<And>\<C>. P \<C> [] ([] _> [])"   and "\<And>\<C> es t1s t2s e t3s. \<lbrakk>\<C> \<turnstile> es : t1s _> t2s; P \<C> es (t1s _> t2s); \<C> \<turnstile> [e] : t2s _> t3s; P \<C> [e] (t2s _> t3s)\<rbrakk> \<Longrightarrow> P \<C> (es @ [e]) (t1s _> t3s)"   and "\<And>\<C> es t1s t2s ts. \<lbrakk>\<C> \<turnstile> es : t1s _> t2s; P \<C> es (t1s _> t2s)\<rbrakk> \<Longrightarrow> P \<C> es (ts @ t1s _> ts @ t2s)" shows "P x1 x2 x3"