src/HOL/Analysis/Euclidean_Space.thy
changeset 64267 b9a1486e79be
parent 63971 da89140186e2
child 64773 223b2ebdda79
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
    51   by clarsimp
    51   by clarsimp
    52 
    52 
    53 lemma (in euclidean_space) SOME_Basis: "(SOME i. i \<in> Basis) \<in> Basis"
    53 lemma (in euclidean_space) SOME_Basis: "(SOME i. i \<in> Basis) \<in> Basis"
    54   by (metis ex_in_conv nonempty_Basis someI_ex)
    54   by (metis ex_in_conv nonempty_Basis someI_ex)
    55 
    55 
    56 lemma (in euclidean_space) inner_setsum_left_Basis[simp]:
    56 lemma (in euclidean_space) inner_sum_left_Basis[simp]:
    57     "b \<in> Basis \<Longrightarrow> inner (\<Sum>i\<in>Basis. f i *\<^sub>R i) b = f b"
    57     "b \<in> Basis \<Longrightarrow> inner (\<Sum>i\<in>Basis. f i *\<^sub>R i) b = f b"
    58   by (simp add: inner_setsum_left inner_Basis if_distrib comm_monoid_add_class.setsum.If_cases)
    58   by (simp add: inner_sum_left inner_Basis if_distrib comm_monoid_add_class.sum.If_cases)
    59 
    59 
    60 lemma (in euclidean_space) euclidean_eqI:
    60 lemma (in euclidean_space) euclidean_eqI:
    61   assumes b: "\<And>b. b \<in> Basis \<Longrightarrow> inner x b = inner y b" shows "x = y"
    61   assumes b: "\<And>b. b \<in> Basis \<Longrightarrow> inner x b = inner y b" shows "x = y"
    62 proof -
    62 proof -
    63   from b have "\<forall>b\<in>Basis. inner (x - y) b = 0"
    63   from b have "\<forall>b\<in>Basis. inner (x - y) b = 0"
    68 
    68 
    69 lemma (in euclidean_space) euclidean_eq_iff:
    69 lemma (in euclidean_space) euclidean_eq_iff:
    70   "x = y \<longleftrightarrow> (\<forall>b\<in>Basis. inner x b = inner y b)"
    70   "x = y \<longleftrightarrow> (\<forall>b\<in>Basis. inner x b = inner y b)"
    71   by (auto intro: euclidean_eqI)
    71   by (auto intro: euclidean_eqI)
    72 
    72 
    73 lemma (in euclidean_space) euclidean_representation_setsum:
    73 lemma (in euclidean_space) euclidean_representation_sum:
    74   "(\<Sum>i\<in>Basis. f i *\<^sub>R i) = b \<longleftrightarrow> (\<forall>i\<in>Basis. f i = inner b i)"
    74   "(\<Sum>i\<in>Basis. f i *\<^sub>R i) = b \<longleftrightarrow> (\<forall>i\<in>Basis. f i = inner b i)"
    75   by (subst euclidean_eq_iff) simp
    75   by (subst euclidean_eq_iff) simp
    76 
    76 
    77 lemma (in euclidean_space) euclidean_representation_setsum':
    77 lemma (in euclidean_space) euclidean_representation_sum':
    78   "b = (\<Sum>i\<in>Basis. f i *\<^sub>R i) \<longleftrightarrow> (\<forall>i\<in>Basis. f i = inner b i)"
    78   "b = (\<Sum>i\<in>Basis. f i *\<^sub>R i) \<longleftrightarrow> (\<forall>i\<in>Basis. f i = inner b i)"
    79   by (auto simp add: euclidean_representation_setsum[symmetric])
    79   by (auto simp add: euclidean_representation_sum[symmetric])
    80 
    80 
    81 lemma (in euclidean_space) euclidean_representation: "(\<Sum>b\<in>Basis. inner x b *\<^sub>R b) = x"
    81 lemma (in euclidean_space) euclidean_representation: "(\<Sum>b\<in>Basis. inner x b *\<^sub>R b) = x"
    82   unfolding euclidean_representation_setsum by simp
    82   unfolding euclidean_representation_sum by simp
    83 
    83 
    84 lemma (in euclidean_space) choice_Basis_iff:
    84 lemma (in euclidean_space) choice_Basis_iff:
    85   fixes P :: "'a \<Rightarrow> real \<Rightarrow> bool"
    85   fixes P :: "'a \<Rightarrow> real \<Rightarrow> bool"
    86   shows "(\<forall>i\<in>Basis. \<exists>x. P i x) \<longleftrightarrow> (\<exists>x. \<forall>i\<in>Basis. P i (inner x i))"
    86   shows "(\<forall>i\<in>Basis. \<exists>x. P i x) \<longleftrightarrow> (\<exists>x. \<forall>i\<in>Basis. P i (inner x i))"
    87   unfolding bchoice_iff
    87   unfolding bchoice_iff
    94 lemma (in euclidean_space) bchoice_Basis_iff:
    94 lemma (in euclidean_space) bchoice_Basis_iff:
    95   fixes P :: "'a \<Rightarrow> real \<Rightarrow> bool"
    95   fixes P :: "'a \<Rightarrow> real \<Rightarrow> bool"
    96   shows "(\<forall>i\<in>Basis. \<exists>x\<in>A. P i x) \<longleftrightarrow> (\<exists>x. \<forall>i\<in>Basis. inner x i \<in> A \<and> P i (inner x i))"
    96   shows "(\<forall>i\<in>Basis. \<exists>x\<in>A. P i x) \<longleftrightarrow> (\<exists>x. \<forall>i\<in>Basis. inner x i \<in> A \<and> P i (inner x i))"
    97 by (simp add: choice_Basis_iff Bex_def)
    97 by (simp add: choice_Basis_iff Bex_def)
    98 
    98 
    99 lemma (in euclidean_space) euclidean_representation_setsum_fun:
    99 lemma (in euclidean_space) euclidean_representation_sum_fun:
   100     "(\<lambda>x. \<Sum>b\<in>Basis. inner (f x) b *\<^sub>R b) = f"
   100     "(\<lambda>x. \<Sum>b\<in>Basis. inner (f x) b *\<^sub>R b) = f"
   101   by (rule ext) (simp add: euclidean_representation_setsum)
   101   by (rule ext) (simp add: euclidean_representation_sum)
   102 
   102 
   103 lemma euclidean_isCont:
   103 lemma euclidean_isCont:
   104   assumes "\<And>b. b \<in> Basis \<Longrightarrow> isCont (\<lambda>x. (inner (f x) b) *\<^sub>R b) x"
   104   assumes "\<And>b. b \<in> Basis \<Longrightarrow> isCont (\<lambda>x. (inner (f x) b) *\<^sub>R b) x"
   105     shows "isCont f x"
   105     shows "isCont f x"
   106   apply (subst euclidean_representation_setsum_fun [symmetric])
   106   apply (subst euclidean_representation_sum_fun [symmetric])
   107   apply (rule isCont_setsum)
   107   apply (rule isCont_sum)
   108   apply (blast intro: assms)
   108   apply (blast intro: assms)
   109   done
   109   done
   110 
   110 
   111 lemma DIM_positive [simp]: "0 < DIM('a::euclidean_space)"
   111 lemma DIM_positive [simp]: "0 < DIM('a::euclidean_space)"
   112   by (simp add: card_gt_0_iff)
   112   by (simp add: card_gt_0_iff)
   113 
   113 
   114 lemma DIM_ge_Suc0 [simp]: "Suc 0 \<le> card Basis"
   114 lemma DIM_ge_Suc0 [simp]: "Suc 0 \<le> card Basis"
   115   by (meson DIM_positive Suc_leI)
   115   by (meson DIM_positive Suc_leI)
   116 
   116 
   117 
   117 
   118 lemma setsum_inner_Basis_scaleR [simp]:
   118 lemma sum_inner_Basis_scaleR [simp]:
   119   fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_vector"
   119   fixes f :: "'a::euclidean_space \<Rightarrow> 'b::real_vector"
   120   assumes "b \<in> Basis" shows "(\<Sum>i\<in>Basis. (inner i b) *\<^sub>R f i) = f b"
   120   assumes "b \<in> Basis" shows "(\<Sum>i\<in>Basis. (inner i b) *\<^sub>R f i) = f b"
   121   by (simp add: comm_monoid_add_class.setsum.remove [OF finite_Basis assms]
   121   by (simp add: comm_monoid_add_class.sum.remove [OF finite_Basis assms]
   122          assms inner_not_same_Basis comm_monoid_add_class.setsum.neutral)
   122          assms inner_not_same_Basis comm_monoid_add_class.sum.neutral)
   123 
   123 
   124 lemma setsum_inner_Basis_eq [simp]:
   124 lemma sum_inner_Basis_eq [simp]:
   125   assumes "b \<in> Basis" shows "(\<Sum>i\<in>Basis. (inner i b) * f i) = f b"
   125   assumes "b \<in> Basis" shows "(\<Sum>i\<in>Basis. (inner i b) * f i) = f b"
   126   by (simp add: comm_monoid_add_class.setsum.remove [OF finite_Basis assms]
   126   by (simp add: comm_monoid_add_class.sum.remove [OF finite_Basis assms]
   127          assms inner_not_same_Basis comm_monoid_add_class.setsum.neutral)
   127          assms inner_not_same_Basis comm_monoid_add_class.sum.neutral)
   128 
   128 
   129 subsection \<open>Subclass relationships\<close>
   129 subsection \<open>Subclass relationships\<close>
   130 
   130 
   131 instance euclidean_space \<subseteq> perfect_space
   131 instance euclidean_space \<subseteq> perfect_space
   132 proof
   132 proof
   186 begin
   186 begin
   187 
   187 
   188 definition
   188 definition
   189   "Basis = (\<lambda>u. (u, 0)) ` Basis \<union> (\<lambda>v. (0, v)) ` Basis"
   189   "Basis = (\<lambda>u. (u, 0)) ` Basis \<union> (\<lambda>v. (0, v)) ` Basis"
   190 
   190 
   191 lemma setsum_Basis_prod_eq:
   191 lemma sum_Basis_prod_eq:
   192   fixes f::"('a*'b)\<Rightarrow>('a*'b)"
   192   fixes f::"('a*'b)\<Rightarrow>('a*'b)"
   193   shows "setsum f Basis = setsum (\<lambda>i. f (i, 0)) Basis + setsum (\<lambda>i. f (0, i)) Basis"
   193   shows "sum f Basis = sum (\<lambda>i. f (i, 0)) Basis + sum (\<lambda>i. f (0, i)) Basis"
   194 proof -
   194 proof -
   195   have "inj_on (\<lambda>u. (u::'a, 0::'b)) Basis" "inj_on (\<lambda>u. (0::'a, u::'b)) Basis"
   195   have "inj_on (\<lambda>u. (u::'a, 0::'b)) Basis" "inj_on (\<lambda>u. (0::'a, u::'b)) Basis"
   196     by (auto intro!: inj_onI Pair_inject)
   196     by (auto intro!: inj_onI Pair_inject)
   197   thus ?thesis
   197   thus ?thesis
   198     unfolding Basis_prod_def
   198     unfolding Basis_prod_def
   199     by (subst setsum.union_disjoint) (auto simp: Basis_prod_def setsum.reindex)
   199     by (subst sum.union_disjoint) (auto simp: Basis_prod_def sum.reindex)
   200 qed
   200 qed
   201 
   201 
   202 instance proof
   202 instance proof
   203   show "(Basis :: ('a \<times> 'b) set) \<noteq> {}"
   203   show "(Basis :: ('a \<times> 'b) set) \<noteq> {}"
   204     unfolding Basis_prod_def by simp
   204     unfolding Basis_prod_def by simp