Zulip Chat Archive

Stream: new members

Topic: limUnder_add_atTop_eq_nat


Arshak Parsa (Sep 25 2024 at 08:00):

Is this theorem provable?

import Mathlib

theorem limUnder_add_atTop_eq_nat
  [TopologicalSpace α] [Nonempty α]
  (f :   α) (k : ) :
    limUnder atTop (fun n => f (n + k)) = limUnder atTop (fun n => f n) := by
  sorry

this is OK when the limit exists, but what happens if the limit does not exist?

Kevin Buzzard (Sep 25 2024 at 08:12):

It's not obviously OK when the limit exists, as in this generality a sequence can have more than one limit, so how can you be sure that the two limUnders are choosing the same one?

However if you unfold the definitions it looks to me like probably this result is provable. Start with

import Mathlib

set_option autoImplicit true

theorem limUnder_add_atTop_eq_nat
  [TopologicalSpace α] [Nonempty α]
  (f :   α) (k : ) :
    limUnder atTop (fun n => f (n + k)) = limUnder atTop (fun n => f n) := by
  refine congr_arg Classical.epsilon ?h
  ext x
  -- looks OK

and now it looks like you have to prove that the set of limit points is the same for both f and shifted-f, which should be OK.

Arshak Parsa (Sep 25 2024 at 08:26):

tendsto_add_atTop_iff_nat is true, but I'm not sure what happens if the limit does not exist.

Vincent Beffara (Sep 25 2024 at 09:16):

Then neither limit exists and presumably you get the same junk value on both sides so equality still holds

Vincent Beffara (Sep 25 2024 at 09:33):

Also, check docs#Filter.map_add_atTop_eq_nat

Vincent Beffara (Sep 25 2024 at 09:43):

import Mathlib

theorem limUnder_add_atTop_eq_nat
  [TopologicalSpace α] [Nonempty α]
  (f :   α) (k : ) :
    limUnder Filter.atTop (fun n => f (n + k)) = limUnder Filter.atTop (fun n => f n) := by
  unfold limUnder
  change lim (Filter.map (f  fun n => (n + k)) _) = _
  rw [ Filter.map_compose]
  change lim (Filter.map f (Filter.map (fun n => n + k) _)) = _
  rw [Filter.map_add_atTop_eq_nat k]

Vincent Beffara (Sep 25 2024 at 09:44):

Note that your initial statement is not provable because AtTop (rather than Filter.AtTop) is taken as an implicit parameter, so you are stating that it holds for any filter, which it doen't.

Kevin Buzzard (Sep 25 2024 at 12:43):

(deleted)

Kevin Buzzard (Sep 25 2024 at 12:50):

Here's my effort:

import Mathlib

variable (α : Type)
 open Filter

theorem limUnder_add_atTop_eq_nat
  [TopologicalSpace α] [Nonempty α]
  (f :   α) (k : ) :
    limUnder atTop (fun n => f (n + k)) = limUnder atTop (fun n => f n) := by
  refine congr_arg Classical.epsilon ?h
  ext x
  change map (f  fun n  n + k) _  _  _
  rw [ map_compose]
  unfold Function.comp
  rw [map_add_atTop_eq_nat]

Last updated: May 02 2025 at 03:31 UTC