induct: fixes P :: "'b mat \<Rightarrow> 'b mat \<Rightarrow> bool"   and a0 :: "'b mat"   and a1 :: "'b mat" assumes "\<And>A B. \<lbrakk>\<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd\<rbrakk> \<Longrightarrow> P (xg + yb) (xk + ye); \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye)\<rbrakk> \<Longrightarrow> P (xi + yb) xk; \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn xo. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye); xo = strassen_mat_mult (xi + yb) xk\<rbrakk> \<Longrightarrow> P xg (xl - ye); \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn xo xp. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye); xo = strassen_mat_mult (xi + yb) xk; xp = strassen_mat_mult xg (xl - ye)\<rbrakk> \<Longrightarrow> P yb (xm - xk); \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn xo xp xq. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye); xo = strassen_mat_mult (xi + yb) xk; xp = strassen_mat_mult xg (xl - ye); xq = strassen_mat_mult yb (xm - xk)\<rbrakk> \<Longrightarrow> P (xg + xh) ye; \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn xo xp xq xr. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye); xo = strassen_mat_mult (xi + yb) xk; xp = strassen_mat_mult xg (xl - ye); xq = strassen_mat_mult yb (xm - xk); xr = strassen_mat_mult (xg + xh) ye\<rbrakk> \<Longrightarrow> P (xi - xg) (xk + xl); \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye xn xo xp xq xr xs. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; strassen_even A B; xc = x div 2; xd = xa div 2; xe = xb div 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd; xn = strassen_mat_mult (xg + yb) (xk + ye); xo = strassen_mat_mult (xi + yb) xk; xp = strassen_mat_mult xg (xl - ye); xq = strassen_mat_mult yb (xm - xk); xr = strassen_mat_mult (xg + xh) ye; xs = strassen_mat_mult (xi - xg) (xk + xl)\<rbrakk> \<Longrightarrow> P (xh - yb) (xm + ye); \<And>x xa xb xc xd xe xf xg y xh ya xi yb xj xk yc xl yd xm ye. \<lbrakk>x = dim_row A; xa = dim_col A; xb = dim_col B; \<not> strassen_too_small A B; \<not> strassen_even A B; xc = x div 2 * 2; xd = xa div 2 * 2; xe = xb div 2 * 2; xf = split_block A xc xd; (xg, y) = xf; (xh, ya) = y; (xi, yb) = ya; xj = split_block B xd xe; (xk, yc) = xj; (xl, yd) = yc; (xm, ye) = yd\<rbrakk> \<Longrightarrow> P xg xk\<rbrakk> \<Longrightarrow> P A B" shows "P a0 a1"