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" |