src/HOL/Analysis/Finite_Cartesian_Product.thy
changeset 68073 fad29d2a17a5
parent 68072 493b818e8e10
child 68074 8d50467f7555
equal deleted inserted replaced
68072:493b818e8e10 68073:fad29d2a17a5
   621   assumes "\<And>i. norm(x$i) \<le> norm(y$i)"
   621   assumes "\<And>i. norm(x$i) \<le> norm(y$i)"
   622   shows "norm x \<le> norm y"
   622   shows "norm x \<le> norm y"
   623   unfolding norm_vec_def
   623   unfolding norm_vec_def
   624   by (rule L2_set_mono) (auto simp: assms)
   624   by (rule L2_set_mono) (auto simp: assms)
   625 
   625 
   626 lemma norm_eq_0_imp: "norm x = 0 ==> x = (0::real ^'n)" by (metis norm_eq_zero)
       
   627 
       
   628 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x"
   626 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x"
   629   apply (simp add: norm_vec_def)
   627   apply (simp add: norm_vec_def)
   630   apply (rule member_le_L2_set, simp_all)
   628   apply (rule member_le_L2_set, simp_all)
   631   done
   629   done
   632 
   630 
   972   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib)
   970   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib)
   973 
   971 
   974 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::'a::field) = b \<or> x = 0"
   972 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::'a::field) = b \<or> x = 0"
   975   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib)
   973   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib)
   976 
   974 
   977 lemma vector_mul_lcancel_imp: "a \<noteq> (0::'a::field) ==>  a *s x = a *s y ==> (x = y)"
       
   978   by (metis vector_mul_lcancel)
       
   979 
       
   980 lemma vector_mul_rcancel_imp: "x \<noteq> 0 \<Longrightarrow> (a::'a::field) *s x = b *s x ==> a = b"
       
   981   by (metis vector_mul_rcancel)
       
   982 
       
   983 lemma scalar_mult_eq_scaleR [abs_def]: "c *s x = c *\<^sub>R x"
   975 lemma scalar_mult_eq_scaleR [abs_def]: "c *s x = c *\<^sub>R x"
   984   unfolding scaleR_vec_def vector_scalar_mult_def by simp
   976   unfolding scaleR_vec_def vector_scalar_mult_def by simp
   985 
   977 
   986 lemma dist_mul[simp]: "dist (c *s x) (c *s y) = \<bar>c\<bar> * dist x y"
   978 lemma dist_mul[simp]: "dist (c *s x) (c *s y) = \<bar>c\<bar> * dist x y"
   987   unfolding dist_norm scalar_mult_eq_scaleR
   979   unfolding dist_norm scalar_mult_eq_scaleR
  1039 definition "(row::'m => 'a ^'n^'m \<Rightarrow> 'a ^'n) i A = (\<chi> j. ((A$i)$j))"
  1031 definition "(row::'m => 'a ^'n^'m \<Rightarrow> 'a ^'n) i A = (\<chi> j. ((A$i)$j))"
  1040 definition "(column::'n =>'a^'n^'m =>'a^'m) j A = (\<chi> i. ((A$i)$j))"
  1032 definition "(column::'n =>'a^'n^'m =>'a^'m) j A = (\<chi> i. ((A$i)$j))"
  1041 definition "rows(A::'a^'n^'m) = { row i A | i. i \<in> (UNIV :: 'm set)}"
  1033 definition "rows(A::'a^'n^'m) = { row i A | i. i \<in> (UNIV :: 'm set)}"
  1042 definition "columns(A::'a^'n^'m) = { column i A | i. i \<in> (UNIV :: 'n set)}"
  1034 definition "columns(A::'a^'n^'m) = { column i A | i. i \<in> (UNIV :: 'n set)}"
  1043 
  1035 
       
  1036 lemma times0_left [simp]: "(0::'a::semiring_1^'n^'m) ** (A::'a ^'p^'n) = 0" 
       
  1037   by (simp add: matrix_matrix_mult_def zero_vec_def)
       
  1038 
       
  1039 lemma times0_right [simp]: "(A::'a::semiring_1^'n^'m) ** (0::'a ^'p^'n) = 0" 
       
  1040   by (simp add: matrix_matrix_mult_def zero_vec_def)
       
  1041 
  1044 lemma mat_0[simp]: "mat 0 = 0" by (vector mat_def)
  1042 lemma mat_0[simp]: "mat 0 = 0" by (vector mat_def)
  1045 lemma matrix_add_ldistrib: "(A ** (B + C)) = (A ** B) + (A ** C)"
  1043 lemma matrix_add_ldistrib: "(A ** (B + C)) = (A ** B) + (A ** C)"
  1046   by (vector matrix_matrix_mult_def sum.distrib[symmetric] field_simps)
  1044   by (vector matrix_matrix_mult_def sum.distrib[symmetric] field_simps)
  1047 
  1045 
  1048 lemma matrix_mul_lid [simp]:
  1046 lemma matrix_mul_lid [simp]:
  1073   apply (vector matrix_matrix_mult_def matrix_vector_mult_def
  1071   apply (vector matrix_matrix_mult_def matrix_vector_mult_def
  1074     sum_distrib_left sum_distrib_right mult.assoc)
  1072     sum_distrib_left sum_distrib_right mult.assoc)
  1075   apply (subst sum.swap)
  1073   apply (subst sum.swap)
  1076   apply simp
  1074   apply simp
  1077   done
  1075   done
       
  1076 
       
  1077 lemma scalar_matrix_assoc:
       
  1078   fixes A :: "('a::real_algebra_1)^'m^'n"
       
  1079   shows "k *\<^sub>R (A ** B) = (k *\<^sub>R A) ** B"
       
  1080   by (simp add: matrix_matrix_mult_def sum_distrib_left mult_ac vec_eq_iff scaleR_sum_right)
       
  1081 
       
  1082 lemma matrix_scalar_ac:
       
  1083   fixes A :: "('a::real_algebra_1)^'m^'n"
       
  1084   shows "A ** (k *\<^sub>R B) = k *\<^sub>R A ** B"
       
  1085   by (simp add: matrix_matrix_mult_def sum_distrib_left mult_ac vec_eq_iff)
  1078 
  1086 
  1079 lemma matrix_vector_mul_lid [simp]: "mat 1 *v x = (x::'a::semiring_1 ^ 'n)"
  1087 lemma matrix_vector_mul_lid [simp]: "mat 1 *v x = (x::'a::semiring_1 ^ 'n)"
  1080   apply (vector matrix_vector_mult_def mat_def)
  1088   apply (vector matrix_vector_mult_def mat_def)
  1081   apply (simp add: if_distrib if_distribR sum.delta' cong del: if_weak_cong)
  1089   apply (simp add: if_distrib if_distribR sum.delta' cong del: if_weak_cong)
  1082   done
  1090   done
  1096   apply (erule_tac x="i" in allE)
  1104   apply (erule_tac x="i" in allE)
  1097   apply (auto simp add: if_distrib if_distribR axis_def
  1105   apply (auto simp add: if_distrib if_distribR axis_def
  1098     sum.delta[OF finite] cong del: if_weak_cong)
  1106     sum.delta[OF finite] cong del: if_weak_cong)
  1099   done
  1107   done
  1100 
  1108 
  1101 lemma matrix_vector_mul_component: "((A::real^_^_) *v x)$k = inner (A$k) x"
  1109 lemma matrix_vector_mul_component: "(A *v x)$k = inner (A$k) x"
  1102   by (simp add: matrix_vector_mult_def inner_vec_def)
  1110   by (simp add: matrix_vector_mult_def inner_vec_def)
  1103 
  1111 
  1104 lemma dot_lmul_matrix: "inner ((x::real ^_) v* A) y = inner x (A *v y)"
  1112 lemma dot_lmul_matrix: "inner ((x::real ^_) v* A) y = inner x (A *v y)"
  1105   apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps)
  1113   apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps)
  1106   apply (subst sum.swap)
  1114   apply (subst sum.swap)
  1123   by (auto simp add: rows_def columns_def intro: set_eqI)
  1131   by (auto simp add: rows_def columns_def intro: set_eqI)
  1124 
  1132 
  1125 lemma columns_transpose [simp]: "columns(transpose A) = rows A"
  1133 lemma columns_transpose [simp]: "columns(transpose A) = rows A"
  1126   by (metis transpose_transpose rows_transpose)
  1134   by (metis transpose_transpose rows_transpose)
  1127 
  1135 
       
  1136 lemma transpose_scalar: "transpose (k *\<^sub>R A) = k *\<^sub>R transpose A"
       
  1137   unfolding transpose_def
       
  1138   by (simp add: vec_eq_iff)
       
  1139 
       
  1140 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B"
       
  1141   by (metis transpose_transpose)
       
  1142 
  1128 lemma matrix_mult_sum:
  1143 lemma matrix_mult_sum:
  1129   "(A::'a::comm_semiring_1^'n^'m) *v x = sum (\<lambda>i. (x$i) *s column i A) (UNIV:: 'n set)"
  1144   "(A::'a::comm_semiring_1^'n^'m) *v x = sum (\<lambda>i. (x$i) *s column i A) (UNIV:: 'n set)"
  1130   by (simp add: matrix_vector_mult_def vec_eq_iff column_def mult.commute)
  1145   by (simp add: matrix_vector_mult_def vec_eq_iff column_def mult.commute)
  1131 
  1146 
  1132 lemma vector_componentwise:
  1147 lemma vector_componentwise:
  1146   by (simp add: mat_def matrix_def axis_def)
  1161   by (simp add: mat_def matrix_def axis_def)
  1147 
  1162 
  1148 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r"
  1163 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r"
  1149   by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong)
  1164   by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong)
  1150 
  1165 
  1151 lemma matrix_vector_mul_linear[intro, simp]: "linear (\<lambda>x. A *v (x::real ^ _))"
  1166 lemma matrix_vector_mul_linear[intro, simp]: "linear (\<lambda>x. A *v (x::'a::real_algebra_1 ^ _))"
  1152   by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff
  1167   by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff field_simps sum_distrib_left sum.distrib)
  1153       field_simps sum_distrib_left sum.distrib)
  1168 
  1154 
  1169 lemma vector_matrix_left_distrib [algebra_simps]:
  1155 lemma matrix_vector_mult_add_distrib [algebra_simps]:
  1170   shows "(x + y) v* A = x v* A + y v* A"
       
  1171   unfolding vector_matrix_mult_def
       
  1172   by (simp add: algebra_simps sum.distrib vec_eq_iff)
       
  1173 
       
  1174 lemma matrix_vector_right_distrib [algebra_simps]:
  1156   "A *v (x + y) = A *v x + A *v y"
  1175   "A *v (x + y) = A *v x + A *v y"
  1157   by (vector matrix_vector_mult_def sum.distrib distrib_left)
  1176   by (vector matrix_vector_mult_def sum.distrib distrib_left)
  1158 
  1177 
  1159 lemma matrix_vector_mult_diff_distrib [algebra_simps]:
  1178 lemma matrix_vector_mult_diff_distrib [algebra_simps]:
  1160   fixes A :: "'a::ring_1^'n^'m"
  1179   fixes A :: "'a::ring_1^'n^'m"
  1198   fixes A::"'a::field^'n^'m"
  1217   fixes A::"'a::field^'n^'m"
  1199   assumes "invertible A"
  1218   assumes "invertible A"
  1200   shows "inj (( *v) A)"
  1219   shows "inj (( *v) A)"
  1201   by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid)
  1220   by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid)
  1202 
  1221 
  1203 end
  1222 lemma scalar_invertible:
       
  1223   fixes A :: "('a::real_algebra_1)^'m^'n"
       
  1224   assumes "k \<noteq> 0" and "invertible A"
       
  1225   shows "invertible (k *\<^sub>R A)"
       
  1226 proof -
       
  1227   obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1"
       
  1228     using assms unfolding invertible_def by auto
       
  1229   with `k \<noteq> 0`
       
  1230   have "(k *\<^sub>R A) ** ((1/k) *\<^sub>R A') = mat 1" "((1/k) *\<^sub>R A') ** (k *\<^sub>R A) = mat 1"
       
  1231     by (simp_all add: assms matrix_scalar_ac)
       
  1232   thus "invertible (k *\<^sub>R A)"
       
  1233     unfolding invertible_def by auto
       
  1234 qed
       
  1235 
       
  1236 lemma scalar_invertible_iff:
       
  1237   fixes A :: "('a::real_algebra_1)^'m^'n"
       
  1238   assumes "k \<noteq> 0" and "invertible A"
       
  1239   shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A"
       
  1240   by (simp add: assms scalar_invertible)
       
  1241 
       
  1242 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x"
       
  1243   unfolding transpose_def vector_matrix_mult_def matrix_vector_mult_def
       
  1244   by simp
       
  1245 
       
  1246 lemma transpose_matrix_vector [simp]: "transpose A *v x = x v* A"
       
  1247   unfolding transpose_def vector_matrix_mult_def matrix_vector_mult_def
       
  1248   by simp
       
  1249 
       
  1250 lemma vector_scalar_commute:
       
  1251   fixes A :: "'a::{field}^'m^'n"
       
  1252   shows "A *v (c *s x) = c *s (A *v x)"
       
  1253   by (simp add: vector_scalar_mult_def matrix_vector_mult_def mult_ac sum_distrib_left)
       
  1254 
       
  1255 lemma scalar_vector_matrix_assoc:
       
  1256   fixes k :: "'a::{field}" and x :: "'a::{field}^'n" and A :: "'a^'m^'n"
       
  1257   shows "(k *s x) v* A = k *s (x v* A)"
       
  1258   by (metis transpose_matrix_vector vector_scalar_commute)
       
  1259  
       
  1260 lemma vector_matrix_mult_0 [simp]: "0 v* A = 0"
       
  1261   unfolding vector_matrix_mult_def by (simp add: zero_vec_def)
       
  1262 
       
  1263 lemma vector_matrix_mult_0_right [simp]: "x v* 0 = 0"
       
  1264   unfolding vector_matrix_mult_def by (simp add: zero_vec_def)
       
  1265 
       
  1266 lemma vector_matrix_mul_rid [simp]:
       
  1267   fixes v :: "('a::semiring_1)^'n"
       
  1268   shows "v v* mat 1 = v"
       
  1269   by (metis matrix_vector_mul_lid transpose_mat vector_transpose_matrix)
       
  1270 
       
  1271 lemma scaleR_vector_matrix_assoc:
       
  1272   fixes k :: real and x :: "real^'n" and A :: "real^'m^'n"
       
  1273   shows "(k *\<^sub>R x) v* A = k *\<^sub>R (x v* A)"
       
  1274   by (metis matrix_vector_mult_scaleR transpose_matrix_vector)
       
  1275 
       
  1276 lemma vector_scaleR_matrix_ac:
       
  1277   fixes k :: real and x :: "real^'n" and A :: "real^'m^'n"
       
  1278   shows "x v* (k *\<^sub>R A) = k *\<^sub>R (x v* A)"
       
  1279 proof -
       
  1280   have "x v* (k *\<^sub>R A) = (k *\<^sub>R x) v* A"
       
  1281     unfolding vector_matrix_mult_def
       
  1282     by (simp add: algebra_simps)
       
  1283   with scaleR_vector_matrix_assoc
       
  1284   show "x v* (k *\<^sub>R A) = k *\<^sub>R (x v* A)"
       
  1285     by auto
       
  1286 qed
       
  1287 
       
  1288 end