src/HOL/Library/Determinants.thy
changeset 30240 5b25fee0362c
parent 29846 57dccccc37b3
child 30259 11cb411913b4
equal deleted inserted replaced
30239:179ff9cb160b 30240:5b25fee0362c
  1046       apply (simp add: ring_simps)
  1046       apply (simp add: ring_simps)
  1047       by (simp only: right_distrib[symmetric])}
  1047       by (simp only: right_distrib[symmetric])}
  1048   note th0 = this
  1048   note th0 = this
  1049   let ?g = "\<lambda>x. if x = 0 then 0 else norm x *s f (inverse (norm x) *s x)"
  1049   let ?g = "\<lambda>x. if x = 0 then 0 else norm x *s f (inverse (norm x) *s x)"
  1050   {fix x:: "real ^'n" assume nx: "norm x = 1"
  1050   {fix x:: "real ^'n" assume nx: "norm x = 1"
  1051     have "?g x = f x" using nx by (simp add: norm_eq_0[symmetric])}
  1051     have "?g x = f x" using nx by auto}
  1052   hence thfg: "\<forall>x. norm x = 1 \<longrightarrow> ?g x = f x" by blast
  1052   hence thfg: "\<forall>x. norm x = 1 \<longrightarrow> ?g x = f x" by blast
  1053   have g0: "?g 0 = 0" by simp
  1053   have g0: "?g 0 = 0" by simp
  1054   {fix x y :: "real ^'n"
  1054   {fix x y :: "real ^'n"
  1055     {assume "x = 0" "y = 0"
  1055     {assume "x = 0" "y = 0"
  1056       then have "dist (?g x) (?g y) = dist x y" by simp }
  1056       then have "dist (?g x) (?g y) = dist x y" by simp }
  1057     moreover
  1057     moreover
  1058     {assume "x = 0" "y \<noteq> 0"
  1058     {assume "x = 0" "y \<noteq> 0"
  1059       then have "dist (?g x) (?g y) = dist x y" 
  1059       then have "dist (?g x) (?g y) = dist x y" 
  1060 	apply (simp add: dist_def norm_neg norm_mul norm_eq_0)
  1060 	apply (simp add: dist_def norm_mul)
  1061 	apply (rule f1[rule_format])
  1061 	apply (rule f1[rule_format])
  1062 	by(simp add: norm_mul norm_eq_0 field_simps)}
  1062 	by(simp add: norm_mul field_simps)}
  1063     moreover
  1063     moreover
  1064     {assume "x \<noteq> 0" "y = 0"
  1064     {assume "x \<noteq> 0" "y = 0"
  1065       then have "dist (?g x) (?g y) = dist x y" 
  1065       then have "dist (?g x) (?g y) = dist x y" 
  1066 	apply (simp add: dist_def norm_neg norm_mul norm_eq_0)
  1066 	apply (simp add: dist_def norm_mul)
  1067 	apply (rule f1[rule_format])
  1067 	apply (rule f1[rule_format])
  1068 	by(simp add: norm_mul norm_eq_0 field_simps)}
  1068 	by(simp add: norm_mul field_simps)}
  1069     moreover
  1069     moreover
  1070     {assume z: "x \<noteq> 0" "y \<noteq> 0"
  1070     {assume z: "x \<noteq> 0" "y \<noteq> 0"
  1071       have th00: "x = norm x *s inverse (norm x) *s x" "y = norm y *s inverse (norm y) *s y" "norm x *s f (inverse (norm x) *s x) = norm x *s f (inverse (norm x) *s x)"
  1071       have th00: "x = norm x *s inverse (norm x) *s x" "y = norm y *s inverse (norm y) *s y" "norm x *s f (inverse (norm x) *s x) = norm x *s f (inverse (norm x) *s x)"
  1072 	"norm y *s f (inverse (norm y) *s y) = norm y *s f (inverse (norm y) *s y)"
  1072 	"norm y *s f (inverse (norm y) *s y) = norm y *s f (inverse (norm y) *s y)"
  1073 	"norm (inverse (norm x) *s x) = 1"
  1073 	"norm (inverse (norm x) *s x) = 1"
  1075 	"norm (inverse (norm y) *s y) = 1"
  1075 	"norm (inverse (norm y) *s y) = 1"
  1076 	"norm (f (inverse (norm y) *s y)) = 1"
  1076 	"norm (f (inverse (norm y) *s y)) = 1"
  1077 	"norm (f (inverse (norm x) *s x) - f (inverse (norm y) *s y)) =
  1077 	"norm (f (inverse (norm x) *s x) - f (inverse (norm y) *s y)) =
  1078 	norm (inverse (norm x) *s x - inverse (norm y) *s y)"
  1078 	norm (inverse (norm x) *s x - inverse (norm y) *s y)"
  1079 	using z
  1079 	using z
  1080 	by (auto simp add: norm_eq_0 vector_smult_assoc field_simps norm_mul intro: f1[rule_format] fd1[rule_format, unfolded dist_def])
  1080 	by (auto simp add: vector_smult_assoc field_simps norm_mul intro: f1[rule_format] fd1[rule_format, unfolded dist_def])
  1081       from z th0[OF th00] have "dist (?g x) (?g y) = dist x y" 
  1081       from z th0[OF th00] have "dist (?g x) (?g y) = dist x y" 
  1082 	by (simp add: dist_def)}
  1082 	by (simp add: dist_def)}
  1083     ultimately have "dist (?g x) (?g y) = dist x y" by blast}
  1083     ultimately have "dist (?g x) (?g y) = dist x y" by blast}
  1084   note thd = this
  1084   note thd = this
  1085     show ?thesis 
  1085     show ?thesis