# HG changeset patch # User huffman # Date 1272132669 25200 # Node ID 82356c9e218abb7f271cd9b5b8c880bbed78eb70 # Parent 3ddb2bc07784c8b6021babc87c8cc880e6f9dcee move l2-norm stuff into separate theory file diff -r 3ddb2bc07784 -r 82356c9e218a src/HOL/IsaMakefile --- a/src/HOL/IsaMakefile Sat Apr 24 09:37:24 2010 -0700 +++ b/src/HOL/IsaMakefile Sat Apr 24 11:11:09 2010 -0700 @@ -1079,6 +1079,7 @@ $(OUT)/HOL-Multivariate_Analysis: $(OUT)/HOL-SMT \ Multivariate_Analysis/ROOT.ML \ + Multivariate_Analysis/L2_Norm.thy \ Multivariate_Analysis/Multivariate_Analysis.thy \ Multivariate_Analysis/Determinants.thy \ Multivariate_Analysis/Finite_Cartesian_Product.thy \ diff -r 3ddb2bc07784 -r 82356c9e218a src/HOL/Multivariate_Analysis/Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Euclidean_Space.thy Sat Apr 24 09:37:24 2010 -0700 +++ b/src/HOL/Multivariate_Analysis/Euclidean_Space.thy Sat Apr 24 11:11:09 2010 -0700 @@ -8,7 +8,7 @@ imports Complex_Main "~~/src/HOL/Decision_Procs/Dense_Linear_Order" Finite_Cartesian_Product Glbs Infinite_Set Numeral_Type - Inner_Product + Inner_Product L2_Norm uses "positivstellensatz.ML" ("normarith.ML") begin @@ -406,184 +406,6 @@ by simp qed -subsection {* Square root of sum of squares *} - -definition - "setL2 f A = sqrt (\i\A. (f i)\)" - -lemma setL2_cong: - "\A = B; \x. x \ B \ f x = g x\ \ setL2 f A = setL2 g B" - unfolding setL2_def by simp - -lemma strong_setL2_cong: - "\A = B; \x. x \ B =simp=> f x = g x\ \ setL2 f A = setL2 g B" - unfolding setL2_def simp_implies_def by simp - -lemma setL2_infinite [simp]: "\ finite A \ setL2 f A = 0" - unfolding setL2_def by simp - -lemma setL2_empty [simp]: "setL2 f {} = 0" - unfolding setL2_def by simp - -lemma setL2_insert [simp]: - "\finite F; a \ F\ \ - setL2 f (insert a F) = sqrt ((f a)\ + (setL2 f F)\)" - unfolding setL2_def by (simp add: setsum_nonneg) - -lemma setL2_nonneg [simp]: "0 \ setL2 f A" - unfolding setL2_def by (simp add: setsum_nonneg) - -lemma setL2_0': "\a\A. f a = 0 \ setL2 f A = 0" - unfolding setL2_def by simp - -lemma setL2_constant: "setL2 (\x. y) A = sqrt (of_nat (card A)) * \y\" - unfolding setL2_def by (simp add: real_sqrt_mult) - -lemma setL2_mono: - assumes "\i. i \ K \ f i \ g i" - assumes "\i. i \ K \ 0 \ f i" - shows "setL2 f K \ setL2 g K" - unfolding setL2_def - by (simp add: setsum_nonneg setsum_mono power_mono prems) - -lemma setL2_strict_mono: - assumes "finite K" and "K \ {}" - assumes "\i. i \ K \ f i < g i" - assumes "\i. i \ K \ 0 \ f i" - shows "setL2 f K < setL2 g K" - unfolding setL2_def - by (simp add: setsum_strict_mono power_strict_mono assms) - -lemma setL2_right_distrib: - "0 \ r \ r * setL2 f A = setL2 (\x. r * f x) A" - unfolding setL2_def - apply (simp add: power_mult_distrib) - apply (simp add: setsum_right_distrib [symmetric]) - apply (simp add: real_sqrt_mult setsum_nonneg) - done - -lemma setL2_left_distrib: - "0 \ r \ setL2 f A * r = setL2 (\x. f x * r) A" - unfolding setL2_def - apply (simp add: power_mult_distrib) - apply (simp add: setsum_left_distrib [symmetric]) - apply (simp add: real_sqrt_mult setsum_nonneg) - done - -lemma setsum_nonneg_eq_0_iff: - fixes f :: "'a \ 'b::ordered_ab_group_add" - shows "\finite A; \x\A. 0 \ f x\ \ setsum f A = 0 \ (\x\A. f x = 0)" - apply (induct set: finite, simp) - apply (simp add: add_nonneg_eq_0_iff setsum_nonneg) - done - -lemma setL2_eq_0_iff: "finite A \ setL2 f A = 0 \ (\x\A. f x = 0)" - unfolding setL2_def - by (simp add: setsum_nonneg setsum_nonneg_eq_0_iff) - -lemma setL2_triangle_ineq: - shows "setL2 (\i. f i + g i) A \ setL2 f A + setL2 g A" -proof (cases "finite A") - case False - thus ?thesis by simp -next - case True - thus ?thesis - proof (induct set: finite) - case empty - show ?case by simp - next - case (insert x F) - hence "sqrt ((f x + g x)\ + (setL2 (\i. f i + g i) F)\) \ - sqrt ((f x + g x)\ + (setL2 f F + setL2 g F)\)" - by (intro real_sqrt_le_mono add_left_mono power_mono insert - setL2_nonneg add_increasing zero_le_power2) - also have - "\ \ sqrt ((f x)\ + (setL2 f F)\) + sqrt ((g x)\ + (setL2 g F)\)" - by (rule real_sqrt_sum_squares_triangle_ineq) - finally show ?case - using insert by simp - qed -qed - -lemma sqrt_sum_squares_le_sum: - "\0 \ x; 0 \ y\ \ sqrt (x\ + y\) \ x + y" - apply (rule power2_le_imp_le) - apply (simp add: power2_sum) - apply (simp add: mult_nonneg_nonneg) - apply (simp add: add_nonneg_nonneg) - done - -lemma setL2_le_setsum [rule_format]: - "(\i\A. 0 \ f i) \ setL2 f A \ setsum f A" - apply (cases "finite A") - apply (induct set: finite) - apply simp - apply clarsimp - apply (erule order_trans [OF sqrt_sum_squares_le_sum]) - apply simp - apply simp - apply simp - done - -lemma sqrt_sum_squares_le_sum_abs: "sqrt (x\ + y\) \ \x\ + \y\" - apply (rule power2_le_imp_le) - apply (simp add: power2_sum) - apply (simp add: mult_nonneg_nonneg) - apply (simp add: add_nonneg_nonneg) - done - -lemma setL2_le_setsum_abs: "setL2 f A \ (\i\A. \f i\)" - apply (cases "finite A") - apply (induct set: finite) - apply simp - apply simp - apply (rule order_trans [OF sqrt_sum_squares_le_sum_abs]) - apply simp - apply simp - done - -lemma setL2_mult_ineq_lemma: - fixes a b c d :: real - shows "2 * (a * c) * (b * d) \ a\ * d\ + b\ * c\" -proof - - have "0 \ (a * d - b * c)\" by simp - also have "\ = a\ * d\ + b\ * c\ - 2 * (a * d) * (b * c)" - by (simp only: power2_diff power_mult_distrib) - also have "\ = a\ * d\ + b\ * c\ - 2 * (a * c) * (b * d)" - by simp - finally show "2 * (a * c) * (b * d) \ a\ * d\ + b\ * c\" - by simp -qed - -lemma setL2_mult_ineq: "(\i\A. \f i\ * \g i\) \ setL2 f A * setL2 g A" - apply (cases "finite A") - apply (induct set: finite) - apply simp - apply (rule power2_le_imp_le, simp) - apply (rule order_trans) - apply (rule power_mono) - apply (erule add_left_mono) - apply (simp add: add_nonneg_nonneg mult_nonneg_nonneg setsum_nonneg) - apply (simp add: power2_sum) - apply (simp add: power_mult_distrib) - apply (simp add: right_distrib left_distrib) - apply (rule ord_le_eq_trans) - apply (rule setL2_mult_ineq_lemma) - apply simp - apply (intro mult_nonneg_nonneg setL2_nonneg) - apply simp - done - -lemma member_le_setL2: "\finite A; i \ A\ \ f i \ setL2 f A" - apply (rule_tac s="insert i (A - {i})" and t="A" in subst) - apply fast - apply (subst setL2_insert) - apply simp - apply simp - apply simp - done - subsection {* Metric *} (* TODO: move somewhere else *) diff -r 3ddb2bc07784 -r 82356c9e218a src/HOL/Multivariate_Analysis/L2_Norm.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Multivariate_Analysis/L2_Norm.thy Sat Apr 24 11:11:09 2010 -0700 @@ -0,0 +1,187 @@ +(* Title: Multivariate_Analysis/L2_Norm.thy + Author: Brian Huffman, Portland State University +*) + +header {* Square root of sum of squares *} + +theory L2_Norm +imports NthRoot +begin + +definition + "setL2 f A = sqrt (\i\A. (f i)\)" + +lemma setL2_cong: + "\A = B; \x. x \ B \ f x = g x\ \ setL2 f A = setL2 g B" + unfolding setL2_def by simp + +lemma strong_setL2_cong: + "\A = B; \x. x \ B =simp=> f x = g x\ \ setL2 f A = setL2 g B" + unfolding setL2_def simp_implies_def by simp + +lemma setL2_infinite [simp]: "\ finite A \ setL2 f A = 0" + unfolding setL2_def by simp + +lemma setL2_empty [simp]: "setL2 f {} = 0" + unfolding setL2_def by simp + +lemma setL2_insert [simp]: + "\finite F; a \ F\ \ + setL2 f (insert a F) = sqrt ((f a)\ + (setL2 f F)\)" + unfolding setL2_def by (simp add: setsum_nonneg) + +lemma setL2_nonneg [simp]: "0 \ setL2 f A" + unfolding setL2_def by (simp add: setsum_nonneg) + +lemma setL2_0': "\a\A. f a = 0 \ setL2 f A = 0" + unfolding setL2_def by simp + +lemma setL2_constant: "setL2 (\x. y) A = sqrt (of_nat (card A)) * \y\" + unfolding setL2_def by (simp add: real_sqrt_mult) + +lemma setL2_mono: + assumes "\i. i \ K \ f i \ g i" + assumes "\i. i \ K \ 0 \ f i" + shows "setL2 f K \ setL2 g K" + unfolding setL2_def + by (simp add: setsum_nonneg setsum_mono power_mono prems) + +lemma setL2_strict_mono: + assumes "finite K" and "K \ {}" + assumes "\i. i \ K \ f i < g i" + assumes "\i. i \ K \ 0 \ f i" + shows "setL2 f K < setL2 g K" + unfolding setL2_def + by (simp add: setsum_strict_mono power_strict_mono assms) + +lemma setL2_right_distrib: + "0 \ r \ r * setL2 f A = setL2 (\x. r * f x) A" + unfolding setL2_def + apply (simp add: power_mult_distrib) + apply (simp add: setsum_right_distrib [symmetric]) + apply (simp add: real_sqrt_mult setsum_nonneg) + done + +lemma setL2_left_distrib: + "0 \ r \ setL2 f A * r = setL2 (\x. f x * r) A" + unfolding setL2_def + apply (simp add: power_mult_distrib) + apply (simp add: setsum_left_distrib [symmetric]) + apply (simp add: real_sqrt_mult setsum_nonneg) + done + +lemma setsum_nonneg_eq_0_iff: + fixes f :: "'a \ 'b::ordered_ab_group_add" + shows "\finite A; \x\A. 0 \ f x\ \ setsum f A = 0 \ (\x\A. f x = 0)" + apply (induct set: finite, simp) + apply (simp add: add_nonneg_eq_0_iff setsum_nonneg) + done + +lemma setL2_eq_0_iff: "finite A \ setL2 f A = 0 \ (\x\A. f x = 0)" + unfolding setL2_def + by (simp add: setsum_nonneg setsum_nonneg_eq_0_iff) + +lemma setL2_triangle_ineq: + shows "setL2 (\i. f i + g i) A \ setL2 f A + setL2 g A" +proof (cases "finite A") + case False + thus ?thesis by simp +next + case True + thus ?thesis + proof (induct set: finite) + case empty + show ?case by simp + next + case (insert x F) + hence "sqrt ((f x + g x)\ + (setL2 (\i. f i + g i) F)\) \ + sqrt ((f x + g x)\ + (setL2 f F + setL2 g F)\)" + by (intro real_sqrt_le_mono add_left_mono power_mono insert + setL2_nonneg add_increasing zero_le_power2) + also have + "\ \ sqrt ((f x)\ + (setL2 f F)\) + sqrt ((g x)\ + (setL2 g F)\)" + by (rule real_sqrt_sum_squares_triangle_ineq) + finally show ?case + using insert by simp + qed +qed + +lemma sqrt_sum_squares_le_sum: + "\0 \ x; 0 \ y\ \ sqrt (x\ + y\) \ x + y" + apply (rule power2_le_imp_le) + apply (simp add: power2_sum) + apply (simp add: mult_nonneg_nonneg) + apply (simp add: add_nonneg_nonneg) + done + +lemma setL2_le_setsum [rule_format]: + "(\i\A. 0 \ f i) \ setL2 f A \ setsum f A" + apply (cases "finite A") + apply (induct set: finite) + apply simp + apply clarsimp + apply (erule order_trans [OF sqrt_sum_squares_le_sum]) + apply simp + apply simp + apply simp + done + +lemma sqrt_sum_squares_le_sum_abs: "sqrt (x\ + y\) \ \x\ + \y\" + apply (rule power2_le_imp_le) + apply (simp add: power2_sum) + apply (simp add: mult_nonneg_nonneg) + apply (simp add: add_nonneg_nonneg) + done + +lemma setL2_le_setsum_abs: "setL2 f A \ (\i\A. \f i\)" + apply (cases "finite A") + apply (induct set: finite) + apply simp + apply simp + apply (rule order_trans [OF sqrt_sum_squares_le_sum_abs]) + apply simp + apply simp + done + +lemma setL2_mult_ineq_lemma: + fixes a b c d :: real + shows "2 * (a * c) * (b * d) \ a\ * d\ + b\ * c\" +proof - + have "0 \ (a * d - b * c)\" by simp + also have "\ = a\ * d\ + b\ * c\ - 2 * (a * d) * (b * c)" + by (simp only: power2_diff power_mult_distrib) + also have "\ = a\ * d\ + b\ * c\ - 2 * (a * c) * (b * d)" + by simp + finally show "2 * (a * c) * (b * d) \ a\ * d\ + b\ * c\" + by simp +qed + +lemma setL2_mult_ineq: "(\i\A. \f i\ * \g i\) \ setL2 f A * setL2 g A" + apply (cases "finite A") + apply (induct set: finite) + apply simp + apply (rule power2_le_imp_le, simp) + apply (rule order_trans) + apply (rule power_mono) + apply (erule add_left_mono) + apply (simp add: add_nonneg_nonneg mult_nonneg_nonneg setsum_nonneg) + apply (simp add: power2_sum) + apply (simp add: power_mult_distrib) + apply (simp add: right_distrib left_distrib) + apply (rule ord_le_eq_trans) + apply (rule setL2_mult_ineq_lemma) + apply simp + apply (intro mult_nonneg_nonneg setL2_nonneg) + apply simp + done + +lemma member_le_setL2: "\finite A; i \ A\ \ f i \ setL2 f A" + apply (rule_tac s="insert i (A - {i})" and t="A" in subst) + apply fast + apply (subst setL2_insert) + apply simp + apply simp + apply simp + done + +end