induct: fixes x1 :: "e list"   and x2 :: "e list"   and P :: "e list \<Rightarrow> e list \<Rightarrow> bool" assumes "\<lparr>x1\<rparr> \<leadsto> \<lparr>x2\<rparr>"   and "\<And>c iop. P [$C ConstInt32 c, $Unop_i T_i32 iop] [$C ConstInt32 (app_unop_i iop c)]"   and "\<And>c iop. P [$C ConstInt64 c, $Unop_i T_i64 iop] [$C ConstInt64 (app_unop_i iop c)]"   and "\<And>c fop. P [$C ConstFloat32 c, $Unop_f T_f32 fop] [$C ConstFloat32 (app_unop_f fop c)]"   and "\<And>c fop. P [$C ConstFloat64 c, $Unop_f T_f64 fop] [$C ConstFloat64 (app_unop_f fop c)]"   and "\<And>iop c1 c2 c. app_binop_i iop c1 c2 = Some c \<Longrightarrow> P [$C ConstInt32 c1, $C ConstInt32 c2, $Binop_i T_i32 iop] [$C ConstInt32 c]"   and "\<And>iop c1 c2. app_binop_i iop c1 c2 = None \<Longrightarrow> P [$C ConstInt32 c1, $C ConstInt32 c2, $Binop_i T_i32 iop] [Trap]"   and "\<And>iop c1 c2 c. app_binop_i iop c1 c2 = Some c \<Longrightarrow> P [$C ConstInt64 c1, $C ConstInt64 c2, $Binop_i T_i64 iop] [$C ConstInt64 c]"   and "\<And>iop c1 c2. app_binop_i iop c1 c2 = None \<Longrightarrow> P [$C ConstInt64 c1, $C ConstInt64 c2, $Binop_i T_i64 iop] [Trap]"   and "\<And>fop c1 c2 c. app_binop_f fop c1 c2 = Some c \<Longrightarrow> P [$C ConstFloat32 c1, $C ConstFloat32 c2, $Binop_f T_f32 fop] [$C ConstFloat32 c]"   and "\<And>fop c1 c2. app_binop_f fop c1 c2 = None \<Longrightarrow> P [$C ConstFloat32 c1, $C ConstFloat32 c2, $Binop_f T_f32 fop] [Trap]"   and "\<And>fop c1 c2 c. app_binop_f fop c1 c2 = Some c \<Longrightarrow> P [$C ConstFloat64 c1, $C ConstFloat64 c2, $Binop_f T_f64 fop] [$C ConstFloat64 c]"   and "\<And>fop c1 c2. app_binop_f fop c1 c2 = None \<Longrightarrow> P [$C ConstFloat64 c1, $C ConstFloat64 c2, $Binop_f T_f64 fop] [Trap]"   and "\<And>c testop. P [$C ConstInt32 c, $Testop T_i32 testop] [$C ConstInt32 (wasm_bool (app_testop_i testop c))]"   and "\<And>c testop. P [$C ConstInt64 c, $Testop T_i64 testop] [$C ConstInt32 (wasm_bool (app_testop_i testop c))]"   and "\<And>c1 c2 iop. P [$C ConstInt32 c1, $C ConstInt32 c2, $Relop_i T_i32 iop] [$C ConstInt32 (wasm_bool (app_relop_i iop c1 c2))]"   and "\<And>c1 c2 iop. P [$C ConstInt64 c1, $C ConstInt64 c2, $Relop_i T_i64 iop] [$C ConstInt32 (wasm_bool (app_relop_i iop c1 c2))]"   and "\<And>c1 c2 fop. P [$C ConstFloat32 c1, $C ConstFloat32 c2, $Relop_f T_f32 fop] [$C ConstInt32 (wasm_bool (app_relop_f fop c1 c2))]"   and "\<And>c1 c2 fop. P [$C ConstFloat64 c1, $C ConstFloat64 c2, $Relop_f T_f64 fop] [$C ConstInt32 (wasm_bool (app_relop_f fop c1 c2))]"   and "\<And>t1 v t2 sx v'. \<lbrakk>types_agree t1 v; cvt t2 sx v = Some v'\<rbrakk> \<Longrightarrow> P [$C v, $Cvtop t2 Convert t1 sx] [$C v']"   and "\<And>t1 v t2 sx. \<lbrakk>types_agree t1 v; cvt t2 sx v = None\<rbrakk> \<Longrightarrow> P [$C v, $Cvtop t2 Convert t1 sx] [Trap]"   and "\<And>t1 v t2. types_agree t1 v \<Longrightarrow> P [$C v, $Cvtop t2 Reinterpret t1 None] [$C wasm_deserialise (bits v) t2]"   and "P [$Unreachable] [Trap]"   and "P [$Nop] []"   and "\<And>v. P [$C v, $Drop] []"   and "\<And>n v1 v2. int_eq n 0 \<Longrightarrow> P [$C v1, $C v2, $C ConstInt32 n, $Select] [$C v2]"   and "\<And>n v1 v2. \<not> int_eq n 0 \<Longrightarrow> P [$C v1, $C v2, $C ConstInt32 n, $Select] [$C v1]"   and "\<And>vs n t1s t2s m es. \<lbrakk>const_list vs; length vs = n; length t1s = n; length t2s = m\<rbrakk> \<Longrightarrow> P (vs @ [$Block (t1s _> t2s) es]) [Label m [] (vs @ ($* es))]"   and "\<And>vs n t1s t2s m es. \<lbrakk>const_list vs; length vs = n; length t1s = n; length t2s = m\<rbrakk> \<Longrightarrow> P (vs @ [$Loop (t1s _> t2s) es]) [Label n [$Loop (t1s _> t2s) es] (vs @ ($* es))]"   and "\<And>n tf e1s e2s. int_eq n 0 \<Longrightarrow> P [$C ConstInt32 n, $b_e.If tf e1s e2s] [$Block tf e2s]"   and "\<And>n tf e1s e2s. \<not> int_eq n 0 \<Longrightarrow> P [$C ConstInt32 n, $b_e.If tf e1s e2s] [$Block tf e1s]"   and "\<And>vs n es. const_list vs \<Longrightarrow> P [Label n es vs] vs"   and "\<And>n es. P [Label n es [Trap]] [Trap]"   and "\<And>vs n i lholed LI es. \<lbrakk>const_list vs; length vs = n; Lfilled i lholed (vs @ [$Br i]) LI\<rbrakk> \<Longrightarrow> P [Label n es LI] (vs @ es)"   and "\<And>n i. int_eq n 0 \<Longrightarrow> P [$C ConstInt32 n, $Br_if i] []"   and "\<And>n i. \<not> int_eq n 0 \<Longrightarrow> P [$C ConstInt32 n, $Br_if i] [$Br i]"   and "\<And>is c i. nat_of_int c < length is \<Longrightarrow> P [$C ConstInt32 c, $Br_table is i] [$Br (is ! nat_of_int c)]"   and "\<And>is c i. length is \<le> nat_of_int c \<Longrightarrow> P [$C ConstInt32 c, $Br_table is i] [$Br i]"   and "\<And>es n i vs. \<lbrakk>const_list es; length es = n\<rbrakk> \<Longrightarrow> P [Local n i vs es] es"   and "\<And>n i vs. P [Local n i vs [Trap]] [Trap]"   and "\<And>vs n j lholed es i vls. \<lbrakk>const_list vs; length vs = n; Lfilled j lholed (vs @ [$Return]) es\<rbrakk> \<Longrightarrow> P [Local n i vls es] vs"   and "\<And>v i. is_const v \<Longrightarrow> P [v, $Tee_local i] [v, v, $Set_local i]"   and "\<And>es lholed. \<lbrakk>es \<noteq> [Trap]; Lfilled 0 lholed [Trap] es\<rbrakk> \<Longrightarrow> P es [Trap]" shows "P x1 x2"