src/HOL/Hyperreal/SEQ.thy
changeset 20685 fee8c75e3b5d
parent 20682 cecff1f51431
child 20691 53cbea20e4d9
equal deleted inserted replaced
20684:74e8b46abb97 20685:fee8c75e3b5d
   201 
   201 
   202 lemma LIMSEQ_add: "[| X ----> a; Y ----> b |] ==> (%n. X n + Y n) ----> a + b"
   202 lemma LIMSEQ_add: "[| X ----> a; Y ----> b |] ==> (%n. X n + Y n) ----> a + b"
   203 by (simp add: LIMSEQ_NSLIMSEQ_iff NSLIMSEQ_add)
   203 by (simp add: LIMSEQ_NSLIMSEQ_iff NSLIMSEQ_add)
   204 
   204 
   205 lemma LIMSEQ_add_const: "f ----> a ==> (%n.(f n + b)) ----> a + b"
   205 lemma LIMSEQ_add_const: "f ----> a ==> (%n.(f n + b)) ----> a + b"
   206   apply (subgoal_tac "%n. (f n + b) == %n. (f n + (%n. b) n)")
   206 by (simp add: LIMSEQ_add LIMSEQ_const)
   207   apply (subgoal_tac "(%n. b) ----> b")
       
   208   apply (auto simp add: LIMSEQ_add LIMSEQ_const)
       
   209 done
       
   210 
   207 
   211 lemma NSLIMSEQ_add_const: "f ----NS> a ==> (%n.(f n + b)) ----NS> a + b"
   208 lemma NSLIMSEQ_add_const: "f ----NS> a ==> (%n.(f n + b)) ----NS> a + b"
   212 by (simp add: LIMSEQ_NSLIMSEQ_iff [THEN sym] LIMSEQ_add_const)
   209 by (simp add: LIMSEQ_NSLIMSEQ_iff [THEN sym] LIMSEQ_add_const)
   213 
   210 
   214 lemma NSLIMSEQ_mult:
   211 lemma NSLIMSEQ_mult:
   232 by (drule LIMSEQ_minus, simp)
   229 by (drule LIMSEQ_minus, simp)
   233 
   230 
   234 lemma NSLIMSEQ_minus_cancel: "(%n. -(X n)) ----NS> -a ==> X ----NS> a"
   231 lemma NSLIMSEQ_minus_cancel: "(%n. -(X n)) ----NS> -a ==> X ----NS> a"
   235 by (drule NSLIMSEQ_minus, simp)
   232 by (drule NSLIMSEQ_minus, simp)
   236 
   233 
       
   234 (* FIXME: delete *)
   237 lemma NSLIMSEQ_add_minus:
   235 lemma NSLIMSEQ_add_minus:
   238      "[| X ----NS> a; Y ----NS> b |] ==> (%n. X n + -Y n) ----NS> a + -b"
   236      "[| X ----NS> a; Y ----NS> b |] ==> (%n. X n + -Y n) ----NS> a + -b"
   239 by (simp add: NSLIMSEQ_add NSLIMSEQ_minus [of Y])
   237 by (simp add: NSLIMSEQ_add NSLIMSEQ_minus)
   240 
   238 
       
   239 (* FIXME: delete *)
   241 lemma LIMSEQ_add_minus:
   240 lemma LIMSEQ_add_minus:
   242      "[| X ----> a; Y ----> b |] ==> (%n. X n + -Y n) ----> a + -b"
   241      "[| X ----> a; Y ----> b |] ==> (%n. X n + -Y n) ----> a + -b"
   243 by (simp add: LIMSEQ_NSLIMSEQ_iff NSLIMSEQ_add_minus)
   242 by (simp add: LIMSEQ_NSLIMSEQ_iff NSLIMSEQ_add_minus)
   244 
   243 
   245 lemma LIMSEQ_diff: "[| X ----> a; Y ----> b |] ==> (%n. X n - Y n) ----> a - b"
   244 lemma LIMSEQ_diff: "[| X ----> a; Y ----> b |] ==> (%n. X n - Y n) ----> a - b"
   246 apply (simp add: diff_minus)
   245 by (simp add: diff_minus LIMSEQ_add LIMSEQ_minus)
   247 apply (blast intro: LIMSEQ_add_minus)
       
   248 done
       
   249 
   246 
   250 lemma NSLIMSEQ_diff:
   247 lemma NSLIMSEQ_diff:
   251      "[| X ----NS> a; Y ----NS> b |] ==> (%n. X n - Y n) ----NS> a - b"
   248      "[| X ----NS> a; Y ----NS> b |] ==> (%n. X n - Y n) ----NS> a - b"
   252 apply (simp add: diff_minus)
   249 by (simp add: diff_minus NSLIMSEQ_add NSLIMSEQ_minus)
   253 apply (blast intro: NSLIMSEQ_add_minus)
       
   254 done
       
   255 
   250 
   256 lemma LIMSEQ_diff_const: "f ----> a ==> (%n.(f n  - b)) ----> a - b"
   251 lemma LIMSEQ_diff_const: "f ----> a ==> (%n.(f n  - b)) ----> a - b"
   257   apply (subgoal_tac "%n. (f n - b) == %n. (f n - (%n. b) n)")
   252 by (simp add: LIMSEQ_diff LIMSEQ_const)
   258   apply (subgoal_tac "(%n. b) ----> b")
       
   259   apply (auto simp add: LIMSEQ_diff LIMSEQ_const)
       
   260 done
       
   261 
   253 
   262 lemma NSLIMSEQ_diff_const: "f ----NS> a ==> (%n.(f n - b)) ----NS> a - b"
   254 lemma NSLIMSEQ_diff_const: "f ----NS> a ==> (%n.(f n - b)) ----NS> a - b"
   263 by (simp add: LIMSEQ_NSLIMSEQ_iff [THEN sym] LIMSEQ_diff_const)
   255 by (simp add: NSLIMSEQ_diff NSLIMSEQ_const)
   264 
   256 
   265 text{*Proof is like that of @{text NSLIM_inverse}.*}
   257 text{*Proof is like that of @{text NSLIM_inverse}.*}
   266 lemma NSLIMSEQ_inverse:
   258 lemma NSLIMSEQ_inverse:
   267   fixes a :: "'a::real_normed_div_algebra"
   259   fixes a :: "'a::real_normed_div_algebra"
   268   shows "[| X ----NS> a;  a ~= 0 |] ==> (%n. inverse(X n)) ----NS> inverse(a)"
   260   shows "[| X ----NS> a;  a ~= 0 |] ==> (%n. inverse(X n)) ----NS> inverse(a)"
   283 
   275 
   284 lemma LIMSEQ_divide:
   276 lemma LIMSEQ_divide:
   285   fixes a b :: "'a::{real_normed_div_algebra,field}"
   277   fixes a b :: "'a::{real_normed_div_algebra,field}"
   286   shows "[| X ----> a;  Y ----> b;  b ~= 0 |] ==> (%n. X n / Y n) ----> a/b"
   278   shows "[| X ----> a;  Y ----> b;  b ~= 0 |] ==> (%n. X n / Y n) ----> a/b"
   287 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse)
   279 by (simp add: LIMSEQ_mult LIMSEQ_inverse divide_inverse)
       
   280 
       
   281 lemma starfun_hnorm: "\<And>x. hnorm (( *f* f) x) = ( *f* (\<lambda>x. norm (f x))) x"
       
   282 by transfer simp
       
   283 
       
   284 lemma star_of_norm [simp]: "star_of (norm x) = hnorm (star_of x)"
       
   285 by transfer simp
       
   286 
       
   287 lemma NSLIMSEQ_norm: "X ----NS> a \<Longrightarrow> (\<lambda>n. norm (X n)) ----NS> norm a"
       
   288 by (simp add: NSLIMSEQ_def starfun_hnorm [symmetric] approx_hnorm)
       
   289 
       
   290 lemma LIMSEQ_norm: "X ----> a \<Longrightarrow> (\<lambda>n. norm (X n)) ----> norm a"
       
   291 apply (simp add: LIMSEQ_def, safe)
       
   292 apply (drule_tac x="r" in spec, safe)
       
   293 apply (rule_tac x="no" in exI, safe)
       
   294 apply (drule_tac x="n" in spec, safe)
       
   295 apply (erule order_le_less_trans [OF norm_triangle_ineq3])
       
   296 done
   288 
   297 
   289 text{*Uniqueness of limit*}
   298 text{*Uniqueness of limit*}
   290 lemma NSLIMSEQ_unique: "[| X ----NS> a; X ----NS> b |] ==> a = b"
   299 lemma NSLIMSEQ_unique: "[| X ----NS> a; X ----NS> b |] ==> a = b"
   291 apply (simp add: NSLIMSEQ_def)
   300 apply (simp add: NSLIMSEQ_def)
   292 apply (drule HNatInfinite_whn [THEN [2] bspec])+
   301 apply (drule HNatInfinite_whn [THEN [2] bspec])+
  1001 
  1010 
  1002 lemma NSLIMSEQ_Suc_iff: "((%n. f(Suc n)) ----NS> l) = (f ----NS> l)"
  1011 lemma NSLIMSEQ_Suc_iff: "((%n. f(Suc n)) ----NS> l) = (f ----NS> l)"
  1003 by (blast intro: NSLIMSEQ_imp_Suc NSLIMSEQ_Suc)
  1012 by (blast intro: NSLIMSEQ_imp_Suc NSLIMSEQ_Suc)
  1004 
  1013 
  1005 text{*A sequence tends to zero iff its abs does*}
  1014 text{*A sequence tends to zero iff its abs does*}
       
  1015 lemma LIMSEQ_norm_zero: "((\<lambda>n. norm (X n)) ----> 0) = (X ----> 0)"
       
  1016 by (simp add: LIMSEQ_def)
       
  1017 
  1006 lemma LIMSEQ_rabs_zero: "((%n. \<bar>f n\<bar>) ----> 0) = (f ----> (0::real))"
  1018 lemma LIMSEQ_rabs_zero: "((%n. \<bar>f n\<bar>) ----> 0) = (f ----> (0::real))"
  1007 by (simp add: LIMSEQ_def)
  1019 by (simp add: LIMSEQ_def)
  1008 
  1020 
  1009 text{*We prove the NS version from the standard one, since the NS proof
  1021 text{*We prove the NS version from the standard one, since the NS proof
  1010    seems more complicated than the standard one above!*}
  1022    seems more complicated than the standard one above!*}
       
  1023 lemma NSLIMSEQ_norm_zero: "((\<lambda>n. norm (X n)) ----NS> 0) = (X ----NS> 0)"
       
  1024 by (simp add: LIMSEQ_NSLIMSEQ_iff [symmetric] LIMSEQ_norm_zero)
       
  1025 
  1011 lemma NSLIMSEQ_rabs_zero: "((%n. \<bar>f n\<bar>) ----NS> 0) = (f ----NS> (0::real))"
  1026 lemma NSLIMSEQ_rabs_zero: "((%n. \<bar>f n\<bar>) ----NS> 0) = (f ----NS> (0::real))"
  1012 by (simp add: LIMSEQ_NSLIMSEQ_iff [symmetric] LIMSEQ_rabs_zero)
  1027 by (simp add: LIMSEQ_NSLIMSEQ_iff [symmetric] LIMSEQ_rabs_zero)
  1013 
  1028 
  1014 text{*Generalization to other limits*}
  1029 text{*Generalization to other limits*}
  1015 lemma NSLIMSEQ_imp_rabs: "f ----NS> (l::real) ==> (%n. \<bar>f n\<bar>) ----NS> \<bar>l\<bar>"
  1030 lemma NSLIMSEQ_imp_rabs: "f ----NS> (l::real) ==> (%n. \<bar>f n\<bar>) ----NS> \<bar>l\<bar>"
  1141 text{* standard version *}
  1156 text{* standard version *}
  1142 lemma LIMSEQ_realpow_zero:
  1157 lemma LIMSEQ_realpow_zero:
  1143   "[| 0 \<le> (x::real); x < 1 |] ==> (%n. x ^ n) ----> 0"
  1158   "[| 0 \<le> (x::real); x < 1 |] ==> (%n. x ^ n) ----> 0"
  1144 by (simp add: NSLIMSEQ_realpow_zero LIMSEQ_NSLIMSEQ_iff)
  1159 by (simp add: NSLIMSEQ_realpow_zero LIMSEQ_NSLIMSEQ_iff)
  1145 
  1160 
       
  1161 lemma LIMSEQ_power_zero:
       
  1162   fixes x :: "'a::{real_normed_div_algebra,recpower}"
       
  1163   shows "norm x < 1 \<Longrightarrow> (\<lambda>n. x ^ n) ----> 0"
       
  1164 apply (drule LIMSEQ_realpow_zero [OF norm_ge_zero])
       
  1165 apply (simp add: norm_power [symmetric] LIMSEQ_norm_zero)
       
  1166 done
       
  1167 
  1146 lemma LIMSEQ_divide_realpow_zero:
  1168 lemma LIMSEQ_divide_realpow_zero:
  1147   "1 < (x::real) ==> (%n. a / (x ^ n)) ----> 0"
  1169   "1 < (x::real) ==> (%n. a / (x ^ n)) ----> 0"
  1148 apply (cut_tac a = a and x1 = "inverse x" in
  1170 apply (cut_tac a = a and x1 = "inverse x" in
  1149         LIMSEQ_mult [OF LIMSEQ_const LIMSEQ_realpow_zero])
  1171         LIMSEQ_mult [OF LIMSEQ_const LIMSEQ_realpow_zero])
  1150 apply (auto simp add: divide_inverse power_inverse)
  1172 apply (auto simp add: divide_inverse power_inverse)
  1152 done
  1174 done
  1153 
  1175 
  1154 text{*Limit of @{term "c^n"} for @{term"\<bar>c\<bar> < 1"}*}
  1176 text{*Limit of @{term "c^n"} for @{term"\<bar>c\<bar> < 1"}*}
  1155 
  1177 
  1156 lemma LIMSEQ_rabs_realpow_zero: "\<bar>c\<bar> < (1::real) ==> (%n. \<bar>c\<bar> ^ n) ----> 0"
  1178 lemma LIMSEQ_rabs_realpow_zero: "\<bar>c\<bar> < (1::real) ==> (%n. \<bar>c\<bar> ^ n) ----> 0"
  1157 by (blast intro!: LIMSEQ_realpow_zero abs_ge_zero)
  1179 by (rule LIMSEQ_realpow_zero [OF abs_ge_zero])
  1158 
  1180 
  1159 lemma NSLIMSEQ_rabs_realpow_zero: "\<bar>c\<bar> < (1::real) ==> (%n. \<bar>c\<bar> ^ n) ----NS> 0"
  1181 lemma NSLIMSEQ_rabs_realpow_zero: "\<bar>c\<bar> < (1::real) ==> (%n. \<bar>c\<bar> ^ n) ----NS> 0"
  1160 by (simp add: LIMSEQ_rabs_realpow_zero LIMSEQ_NSLIMSEQ_iff [symmetric])
  1182 by (simp add: LIMSEQ_rabs_realpow_zero LIMSEQ_NSLIMSEQ_iff [symmetric])
  1161 
  1183 
  1162 lemma LIMSEQ_rabs_realpow_zero2: "\<bar>c\<bar> < (1::real) ==> (%n. c ^ n) ----> 0"
  1184 lemma LIMSEQ_rabs_realpow_zero2: "\<bar>c\<bar> < (1::real) ==> (%n. c ^ n) ----> 0"