diff -r d26a45f3c835 -r d12d89a66742 src/HOL/Multivariate_Analysis/Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Euclidean_Space.thy Thu Aug 11 09:11:15 2011 -0700 +++ b/src/HOL/Multivariate_Analysis/Euclidean_Space.thy Thu Aug 11 13:05:56 2011 -0700 @@ -15,22 +15,75 @@ subsection {* Type class of Euclidean spaces *} class euclidean_space = real_inner + + fixes Basis :: "'a set" + assumes nonempty_Basis [simp]: "Basis \ {}" + assumes finite_Basis [simp]: "finite Basis" + assumes inner_Basis: + "\u \ Basis; v \ Basis\ \ inner u v = (if u = v then 1 else 0)" + assumes euclidean_all_zero_iff: + "(\u\Basis. inner x u = 0) \ (x = 0)" + + -- "FIXME: make this a separate definition" fixes dimension :: "'a itself \ nat" + assumes dimension_def: "dimension TYPE('a) = card Basis" + + -- "FIXME: eventually basis function can be removed" fixes basis :: "nat \ 'a" - assumes DIM_positive [intro]: - "0 < dimension TYPE('a)" - assumes basis_zero [simp]: - "dimension TYPE('a) \ i \ basis i = 0" - assumes basis_orthonormal: - "\iji (x = 0)" + assumes image_basis: "basis ` {.. nat" ("(1DIM/(1'(_')))") translations "DIM('t)" == "CONST dimension (TYPE('t))" +lemma (in euclidean_space) norm_Basis: "u \ Basis \ norm u = 1" + unfolding norm_eq_sqrt_inner by (simp add: inner_Basis) + +lemma (in euclidean_space) sgn_Basis: "u \ Basis \ sgn u = u" + unfolding sgn_div_norm by (simp add: norm_Basis scaleR_one) + +lemma (in euclidean_space) Basis_zero [simp]: "0 \ Basis" +proof + assume "0 \ Basis" thus "False" + using inner_Basis [of 0 0] by simp +qed + +lemma (in euclidean_space) nonzero_Basis: "u \ Basis \ u \ 0" + by clarsimp + +text {* Lemmas related to @{text basis} function. *} + +lemma (in euclidean_space) euclidean_all_zero: + "(\i (x = 0)" + using euclidean_all_zero_iff [of x, folded image_basis] + unfolding ball_simps by (simp add: Ball_def inner_commute) + +lemma (in euclidean_space) basis_zero [simp]: + "DIM('a) \ i \ basis i = 0" + using basis_finite by auto + +lemma (in euclidean_space) DIM_positive [intro]: "0 < DIM('a)" + unfolding dimension_def by (simp add: card_gt_0_iff) + +lemma (in euclidean_space) basis_inj [simp, intro]: "inj_on basis {.. Basis \ i < DIM('a)" + by (cases "i < DIM('a)", simp add: image_basis [symmetric], simp) + +lemma (in euclidean_space) Basis_elim: + assumes "u \ Basis" obtains i where "i < DIM('a)" and "u = basis i" + using assms unfolding image_basis [symmetric] by fast + +lemma (in euclidean_space) basis_orthonormal: + "\ij i < DIM('a) then 1 else 0)" proof (cases "(i < DIM('a) \ j < DIM('a))") @@ -161,6 +214,9 @@ begin definition + "Basis = {1::real}" + +definition "dimension (t::real itself) = 1" definition [simp]: @@ -170,42 +226,44 @@ by (rule dimension_real_def) instance - by default simp+ + by default (auto simp add: Basis_real_def) end subsubsection {* Type @{typ complex} *} + (* TODO: move these to Complex.thy/Inner_Product.thy *) + +lemma norm_ii [simp]: "norm ii = 1" + unfolding i_def by simp + +lemma complex_inner_1 [simp]: "inner 1 x = Re x" + unfolding inner_complex_def by simp + +lemma complex_inner_1_right [simp]: "inner x 1 = Re x" + unfolding inner_complex_def by simp + +lemma complex_inner_ii_left [simp]: "inner ii x = Im x" + unfolding inner_complex_def by simp + +lemma complex_inner_ii_right [simp]: "inner x ii = Im x" + unfolding inner_complex_def by simp + instantiation complex :: euclidean_space begin +definition Basis_complex_def: + "Basis = {1, ii}" + definition "dimension (t::complex itself) = 2" definition "basis i = (if i = 0 then 1 else if i = 1 then ii else 0)" -lemma all_less_Suc: "(\i (\i P n" - by (auto simp add: less_Suc_eq) - -instance proof - show "0 < DIM(complex)" - unfolding dimension_complex_def by simp -next - fix i :: nat - assume "DIM(complex) \ i" thus "basis i = (0::complex)" - unfolding dimension_complex_def basis_complex_def by simp -next - show "\iji x = 0" - unfolding dimension_complex_def basis_complex_def inner_complex_def - by (simp add: numeral_2_eq_2 all_less_Suc complex_eq_iff) -qed +instance + by default (auto simp add: Basis_complex_def dimension_complex_def + basis_complex_def intro: complex_eqI split: split_if_asm) end @@ -214,40 +272,50 @@ subsubsection {* Type @{typ "'a \ 'b"} *} +lemma disjoint_iff: "A \ B = {} \ (\x\A. \y\B. x \ y)" + by auto (* TODO: move elsewhere *) + instantiation prod :: (euclidean_space, euclidean_space) euclidean_space begin definition + "Basis = (\u. (u, 0)) ` Basis \ (\v. (0, v)) ` Basis" + +definition "dimension (t::('a \ 'b) itself) = DIM('a) + DIM('b)" definition "basis i = (if i < DIM('a) then (basis i, 0) else (0, basis (i - DIM('a))))" -lemma all_less_sum: - fixes m n :: nat - shows "(\i<(m + n). P i) \ (\i (\i 'b)" - unfolding dimension_prod_def by (intro add_pos_pos DIM_positive) + show "(Basis :: ('a \ 'b) set) \ {}" + unfolding Basis_prod_def by simp next - fix i :: nat - assume "DIM('a \ 'b) \ i" thus "basis i = (0::'a \ 'b)" - unfolding dimension_prod_def basis_prod_def zero_prod_def - by simp + show "finite (Basis :: ('a \ 'b) set)" + unfolding Basis_prod_def by simp next - show "\i 'b). \j 'b). - inner (basis i::'a \ 'b) (basis j) = (if i = j then 1 else 0)" - unfolding dimension_prod_def basis_prod_def inner_prod_def - unfolding all_less_sum prod_eq_iff - by (simp add: basis_orthonormal) + fix u v :: "'a \ 'b" + assume "u \ Basis" and "v \ Basis" + thus "inner u v = (if u = v then 1 else 0)" + unfolding Basis_prod_def inner_prod_def + by (auto simp add: inner_Basis split: split_if_asm) next fix x :: "'a \ 'b" - show "(\i 'b). inner (basis i) x = 0) \ x = 0" - unfolding dimension_prod_def basis_prod_def inner_prod_def - unfolding all_less_sum prod_eq_iff - by (simp add: euclidean_all_zero) + show "(\u\Basis. inner x u = 0) \ x = 0" + unfolding Basis_prod_def ball_Un ball_simps + by (simp add: inner_prod_def prod_eq_iff euclidean_all_zero_iff) +next + show "DIM('a \ 'b) = card (Basis :: ('a \ 'b) set)" + unfolding dimension_prod_def Basis_prod_def + by (simp add: card_Un_disjoint disjoint_iff + card_image inj_on_def dimension_def) +next + show "basis ` {.. 'b)} = (Basis :: ('a \ 'b) set)" + by (auto simp add: Basis_prod_def dimension_prod_def basis_prod_def + image_def elim!: Basis_elim) +next + show "basis ` {DIM('a \ 'b)..} = {0::('a \ 'b)}" + by (auto simp add: dimension_prod_def basis_prod_def prod_eq_iff image_def) qed end