src/HOL/Real/RealVector.thy
changeset 28029 4c55cdec4ce7
parent 28009 e93b121074fb
child 28562 4e74209f113e
equal deleted inserted replaced
28028:c0f54a32491e 28029:4c55cdec4ce7
     7 
     7 
     8 theory RealVector
     8 theory RealVector
     9 imports RealPow
     9 imports RealPow
    10 begin
    10 begin
    11 
    11 
    12 subsection {* Group homomorphisms *}
       
    13 
       
    14 locale group_hom =
       
    15   ab_group_add
       
    16     mA (infixl "-\<^sub>A" 65)
       
    17     uA ("-\<^sub>A _" [81] 80)
       
    18     zA ("0\<^sub>A")
       
    19     pA (infixl "+\<^sub>A" 65) +
       
    20   ab_group_add
       
    21     mB (infixl "-\<^sub>B" 65)
       
    22     uB ("-\<^sub>B _" [81] 80)
       
    23     zB ("0\<^sub>B")
       
    24     pB (infixl "+\<^sub>B" 65) +
       
    25   fixes f :: "'a \<Rightarrow> 'b"
       
    26   assumes plus: "f (x +\<^sub>A y) = f x +\<^sub>B f y"
       
    27 begin
       
    28 
       
    29 lemma zero: "f 0\<^sub>A = 0\<^sub>B"
       
    30 proof -
       
    31   have "f 0\<^sub>A +\<^sub>B f 0\<^sub>A = f (0\<^sub>A +\<^sub>A 0\<^sub>A)" by (rule plus [symmetric])
       
    32   also have "f (0\<^sub>A +\<^sub>A 0\<^sub>A) = 0\<^sub>B +\<^sub>B f 0\<^sub>A" by simp
       
    33   finally show "f 0\<^sub>A = 0\<^sub>B" by (rule pB.add_right_imp_eq)
       
    34 qed
       
    35 
       
    36 lemma uminus: "f (-\<^sub>A x) = -\<^sub>B f x"
       
    37 proof -
       
    38   have "f (-\<^sub>A x) +\<^sub>B f x = f (-\<^sub>A x +\<^sub>A x)" by (rule plus [symmetric])
       
    39   also have "\<dots> = -\<^sub>B f x +\<^sub>B f x" by (simp add: zero)
       
    40   finally show "f (-\<^sub>A x) = -\<^sub>B f x" by (rule pB.add_right_imp_eq)
       
    41 qed
       
    42 
       
    43 lemma diff: "f (x -\<^sub>A y) = f x -\<^sub>B f y"
       
    44 by (simp add: mA_uA_zA_pA.diff_minus mB_uB_zB_pB.diff_minus plus uminus)
       
    45 
       
    46 text {* TODO:
       
    47 Locale-ize definition of setsum, so we can prove a lemma for it *}
       
    48 
       
    49 end
       
    50 
       
    51 subsection {* Vector spaces *}
       
    52 
       
    53 locale vector_space =
       
    54   field
       
    55     inverse
       
    56     divide (infixl "'/\<^sub>F" 70)
       
    57     one ("1\<^sub>F")
       
    58     times (infixl "*\<^sub>F" 70)
       
    59     mF (infixl "-\<^sub>F" 65)
       
    60     uF ("-\<^sub>F _" [81] 80)
       
    61     zF ("0\<^sub>F")
       
    62     pF (infixl "+\<^sub>F" 65) +
       
    63   ab_group_add
       
    64     mV (infixl "-\<^sub>V" 65)
       
    65     uV ("-\<^sub>V _" [81] 80)
       
    66     zV ("0\<^sub>V")
       
    67     pV (infixl "+\<^sub>V" 65) +
       
    68   fixes scale :: "'a \<Rightarrow> 'b \<Rightarrow> 'b" (infixr "%*" 75)
       
    69   assumes scale_right_distrib: "scale a (x +\<^sub>V y) = scale a x +\<^sub>V scale a y"
       
    70   and scale_left_distrib: "scale (a +\<^sub>F b) x = scale a x +\<^sub>V scale b x"
       
    71   and scale_scale [simp]: "scale a (scale b x) = scale (a *\<^sub>F b) x"
       
    72   and scale_one [simp]: "scale 1\<^sub>F x = x"
       
    73 begin
       
    74 
       
    75 lemma scale_left_commute:
       
    76   "scale a (scale b x) = scale b (scale a x)"
       
    77 by (simp add: mult_commute)
       
    78 
       
    79 lemma scale_zero_left [simp]: "scale 0\<^sub>F x = 0\<^sub>V"
       
    80   and scale_minus_left [simp]: "scale (-\<^sub>F a) x = -\<^sub>V (scale a x)"
       
    81   and scale_left_diff_distrib: "scale (a -\<^sub>F b) x = scale a x -\<^sub>V scale b x"
       
    82 proof -
       
    83   interpret s: group_hom
       
    84     [mF uF zF pF mV uV zV pV "\<lambda>a. scale a x"]
       
    85     by unfold_locales (rule scale_left_distrib)
       
    86   show "scale 0\<^sub>F x = 0\<^sub>V" by (rule s.zero)
       
    87   show "scale (-\<^sub>F a) x = -\<^sub>V (scale a x)" by (rule s.uminus)
       
    88   show "scale (a -\<^sub>F b) x = scale a x -\<^sub>V scale b x" by (rule s.diff)
       
    89 qed
       
    90 
       
    91 lemma scale_zero_right [simp]: "scale a 0\<^sub>V = 0\<^sub>V"
       
    92   and scale_minus_right [simp]: "scale a (-\<^sub>V x) = -\<^sub>V (scale a x)"
       
    93   and scale_right_diff_distrib: "scale a (x -\<^sub>V y) = scale a x -\<^sub>V scale a y"
       
    94 proof -
       
    95   interpret s: group_hom
       
    96     [mV uV zV pV mV uV zV pV "\<lambda>x. scale a x"]
       
    97     by unfold_locales (rule scale_right_distrib)
       
    98   show "scale a 0\<^sub>V = 0\<^sub>V" by (rule s.zero)
       
    99   show "scale a (-\<^sub>V x) = -\<^sub>V (scale a x)" by (rule s.uminus)
       
   100   show "scale a (x -\<^sub>V y) = scale a x -\<^sub>V scale a y" by (rule s.diff)
       
   101 qed
       
   102 
       
   103 lemma scale_eq_0_iff [simp]:
       
   104   "scale a x = 0\<^sub>V \<longleftrightarrow> a = 0\<^sub>F \<or> x = 0\<^sub>V"
       
   105 proof cases
       
   106   assume "a = 0\<^sub>F" thus ?thesis by simp
       
   107 next
       
   108   assume anz [simp]: "a \<noteq> 0\<^sub>F"
       
   109   { assume "scale a x = 0\<^sub>V"
       
   110     hence "scale (inverse a) (scale a x) = 0\<^sub>V" by simp
       
   111     hence "x = 0\<^sub>V" by simp }
       
   112   thus ?thesis by force
       
   113 qed
       
   114 
       
   115 lemma scale_left_imp_eq:
       
   116   "\<lbrakk>a \<noteq> 0\<^sub>F; scale a x = scale a y\<rbrakk> \<Longrightarrow> x = y"
       
   117 proof -
       
   118   assume nonzero: "a \<noteq> 0\<^sub>F"
       
   119   assume "scale a x = scale a y"
       
   120   hence "scale a (x -\<^sub>V y) = 0\<^sub>V"
       
   121      by (simp add: scale_right_diff_distrib)
       
   122   hence "x -\<^sub>V y = 0\<^sub>V" by (simp add: nonzero)
       
   123   thus "x = y" by (simp only: mV_uV_zV_pV.right_minus_eq)
       
   124 qed
       
   125 
       
   126 lemma scale_right_imp_eq:
       
   127   "\<lbrakk>x \<noteq> 0\<^sub>V; scale a x = scale b x\<rbrakk> \<Longrightarrow> a = b"
       
   128 proof -
       
   129   assume nonzero: "x \<noteq> 0\<^sub>V"
       
   130   assume "scale a x = scale b x"
       
   131   hence "scale (a -\<^sub>F b) x = 0\<^sub>V"
       
   132      by (simp add: scale_left_diff_distrib)
       
   133   hence "a -\<^sub>F b = 0\<^sub>F" by (simp add: nonzero)
       
   134   thus "a = b" by (simp only: mF_uF_zF_pF.right_minus_eq)
       
   135 qed
       
   136 
       
   137 lemma scale_cancel_left:
       
   138   "scale a x = scale a y \<longleftrightarrow> x = y \<or> a = 0\<^sub>F"
       
   139 by (auto intro: scale_left_imp_eq)
       
   140 
       
   141 lemma scale_cancel_right:
       
   142   "scale a x = scale b x \<longleftrightarrow> a = b \<or> x = 0\<^sub>V"
       
   143 by (auto intro: scale_right_imp_eq)
       
   144 
       
   145 end
       
   146 
       
   147 (* TODO: locale additive is superseded by group_hom; remove *)
       
   148 subsection {* Locale for additive functions *}
    12 subsection {* Locale for additive functions *}
   149 
    13 
   150 locale additive =
    14 locale additive =
   151   fixes f :: "'a::ab_group_add \<Rightarrow> 'b::ab_group_add"
    15   fixes f :: "'a::ab_group_add \<Rightarrow> 'b::ab_group_add"
   152   assumes add: "f (x + y) = f x + f y"
    16   assumes add: "f (x + y) = f x + f y"
   177 apply (simp add: zero)
    41 apply (simp add: zero)
   178 done
    42 done
   179 
    43 
   180 end
    44 end
   181 
    45 
       
    46 subsection {* Vector spaces *}
       
    47 
       
    48 locale vector_space =
       
    49   fixes scale :: "'a::field \<Rightarrow> 'b::ab_group_add \<Rightarrow> 'b"
       
    50   assumes scale_right_distrib: "scale a (x + y) = scale a x + scale a y"
       
    51   and scale_left_distrib: "scale (a + b) x = scale a x + scale b x"
       
    52   and scale_scale [simp]: "scale a (scale b x) = scale (a * b) x"
       
    53   and scale_one [simp]: "scale 1 x = x"
       
    54 begin
       
    55 
       
    56 lemma scale_left_commute:
       
    57   "scale a (scale b x) = scale b (scale a x)"
       
    58 by (simp add: mult_commute)
       
    59 
       
    60 lemma scale_zero_left [simp]: "scale 0 x = 0"
       
    61   and scale_minus_left [simp]: "scale (- a) x = - (scale a x)"
       
    62   and scale_left_diff_distrib: "scale (a - b) x = scale a x - scale b x"
       
    63 proof -
       
    64   interpret s: additive ["\<lambda>a. scale a x"]
       
    65     by unfold_locales (rule scale_left_distrib)
       
    66   show "scale 0 x = 0" by (rule s.zero)
       
    67   show "scale (- a) x = - (scale a x)" by (rule s.minus)
       
    68   show "scale (a - b) x = scale a x - scale b x" by (rule s.diff)
       
    69 qed
       
    70 
       
    71 lemma scale_zero_right [simp]: "scale a 0 = 0"
       
    72   and scale_minus_right [simp]: "scale a (- x) = - (scale a x)"
       
    73   and scale_right_diff_distrib: "scale a (x - y) = scale a x - scale a y"
       
    74 proof -
       
    75   interpret s: additive ["\<lambda>x. scale a x"]
       
    76     by unfold_locales (rule scale_right_distrib)
       
    77   show "scale a 0 = 0" by (rule s.zero)
       
    78   show "scale a (- x) = - (scale a x)" by (rule s.minus)
       
    79   show "scale a (x - y) = scale a x - scale a y" by (rule s.diff)
       
    80 qed
       
    81 
       
    82 lemma scale_eq_0_iff [simp]:
       
    83   "scale a x = 0 \<longleftrightarrow> a = 0 \<or> x = 0"
       
    84 proof cases
       
    85   assume "a = 0" thus ?thesis by simp
       
    86 next
       
    87   assume anz [simp]: "a \<noteq> 0"
       
    88   { assume "scale a x = 0"
       
    89     hence "scale (inverse a) (scale a x) = 0" by simp
       
    90     hence "x = 0" by simp }
       
    91   thus ?thesis by force
       
    92 qed
       
    93 
       
    94 lemma scale_left_imp_eq:
       
    95   "\<lbrakk>a \<noteq> 0; scale a x = scale a y\<rbrakk> \<Longrightarrow> x = y"
       
    96 proof -
       
    97   assume nonzero: "a \<noteq> 0"
       
    98   assume "scale a x = scale a y"
       
    99   hence "scale a (x - y) = 0"
       
   100      by (simp add: scale_right_diff_distrib)
       
   101   hence "x - y = 0" by (simp add: nonzero)
       
   102   thus "x = y" by (simp only: right_minus_eq)
       
   103 qed
       
   104 
       
   105 lemma scale_right_imp_eq:
       
   106   "\<lbrakk>x \<noteq> 0; scale a x = scale b x\<rbrakk> \<Longrightarrow> a = b"
       
   107 proof -
       
   108   assume nonzero: "x \<noteq> 0"
       
   109   assume "scale a x = scale b x"
       
   110   hence "scale (a - b) x = 0"
       
   111      by (simp add: scale_left_diff_distrib)
       
   112   hence "a - b = 0" by (simp add: nonzero)
       
   113   thus "a = b" by (simp only: right_minus_eq)
       
   114 qed
       
   115 
       
   116 lemma scale_cancel_left:
       
   117   "scale a x = scale a y \<longleftrightarrow> x = y \<or> a = 0"
       
   118 by (auto intro: scale_left_imp_eq)
       
   119 
       
   120 lemma scale_cancel_right:
       
   121   "scale a x = scale b x \<longleftrightarrow> a = b \<or> x = 0"
       
   122 by (auto intro: scale_right_imp_eq)
       
   123 
       
   124 end
       
   125 
   182 subsection {* Real vector spaces *}
   126 subsection {* Real vector spaces *}
   183 
   127 
   184 class scaleR = type +
   128 class scaleR = type +
   185   fixes scaleR :: "real \<Rightarrow> 'a \<Rightarrow> 'a" (infixr "*\<^sub>R" 75)
   129   fixes scaleR :: "real \<Rightarrow> 'a \<Rightarrow> 'a" (infixr "*\<^sub>R" 75)
   186 begin
   130 begin
   206   assumes scaleR_right_distrib: "scaleR a (x + y) = scaleR a x + scaleR a y"
   150   assumes scaleR_right_distrib: "scaleR a (x + y) = scaleR a x + scaleR a y"
   207   and scaleR_left_distrib: "scaleR (a + b) x = scaleR a x + scaleR b x"
   151   and scaleR_left_distrib: "scaleR (a + b) x = scaleR a x + scaleR b x"
   208   and scaleR_scaleR [simp]: "scaleR a (scaleR b x) = scaleR (a * b) x"
   152   and scaleR_scaleR [simp]: "scaleR a (scaleR b x) = scaleR (a * b) x"
   209   and scaleR_one [simp]: "scaleR 1 x = x"
   153   and scaleR_one [simp]: "scaleR 1 x = x"
   210 
   154 
   211 interpretation real_vector: vector_space
   155 interpretation real_vector:
   212   [inverse divide "1" times minus uminus "0" plus
   156   vector_space ["scaleR :: real \<Rightarrow> 'a \<Rightarrow> 'a::real_vector"]
   213    minus uminus "0" plus "scaleR::real \<Rightarrow> 'a \<Rightarrow> 'a::real_vector"]
       
   214 apply unfold_locales
   157 apply unfold_locales
   215 apply (rule scaleR_right_distrib)
   158 apply (rule scaleR_right_distrib)
   216 apply (rule scaleR_left_distrib)
   159 apply (rule scaleR_left_distrib)
   217 apply (rule scaleR_scaleR)
   160 apply (rule scaleR_scaleR)
   218 apply (rule scaleR_one)
   161 apply (rule scaleR_one)