Ir al contenido principal

Reto 2: La sucesión 1, -1, 1, -1,... no es convergente

Demostrar que la sucesión definida por 1, -1, 1, -1,... no converge.

Para ello, se propone completar la siguiente demostración en Lean 4:

import Mathlib.Data.Real.Basic
import Mathlib.Tactic

variable {a : ℕ → ℝ}

def SeqLim (a : ℕ → ℝ) (L : ℝ) : Prop :=
  ∀ ε > 0, ∃ N : ℕ, ∀ n ≥ N, |a n - L| < ε

def SeqConv (a : ℕ → ℝ) : Prop :=
  ∃ L, SeqLim a L

example
  (ha : ∀ n, a n = (-1) ^ n)
  : ¬ SeqConv a :=
by sorry

1. Demostración en lenguaje natural

Sea \(a\) la sucesión definida por \(a(n) = (-1)^n\). Supongamos que \(a\) es convergente. Entonces, existe un \(L\) tal que \(a\) converge a \(L\). Por tanto, existe un \(k ∈ ℕ\) tal que, \[ ∀n ≥ k, |a(n) - L| < 1/2 \tag{1} \] Entonces, \begin{align} 2 &= |2| \newline &= |(1 - L) + (1 + L)| \newline &= |(1 - L) + (-1)(-1 - L)| \newline &≤ |1 - L| + |(-1)(-1 - L)| \newline &= |1 - L| + |-1 - L| \newline &= |(-1)^{2k} - L| + |(-1)^{2k+1} - L| \newline &= |a(2k) - L| + |a(2k+1) - L| \newline &< 1/2 + 1/2 &\text{[por (1), \(2k ≥ k\) y \(2k+1 ≥ k\)]} \newline &= 1 \newline \end{align} Luego, 2 < 1 que es una contradicción.

2. Demostraciones con Lean4

import Mathlib.Data.Real.Basic
import Mathlib.Tactic

variable {a : ℕ → ℝ}

def SeqLim (a : ℕ → ℝ) (L : ℝ) : Prop :=
  ∀ ε > 0, ∃ k : ℕ, ∀ n ≥ k, |a n - L| < ε

def SeqConv (a : ℕ → ℝ) : Prop :=
  ∃ L, SeqLim a L

-- 1ª demostración
-- ===============

example
  (ha : ∀ n, a n = (-1) ^ n)
  : ¬ SeqConv a :=
by
  intro h
  -- h : SeqConv a
  -- ⊢ False
  obtain ⟨L, hL⟩ := h
  -- L : ℝ
  -- hL : SeqLim a L
  obtain ⟨k, hk⟩ := hL (1/2) (by grind)
  -- k : ℕ
  -- hk : ∀ n ≥ k, |a n - L| < 1 / 2
  have h1 : ¬(2 : ℝ) < 1 := lt_asymm one_lt_two
  apply h1
  -- ⊢ 2 < 1
  calc
    2 = |2|                                        := by grind
    _ = |(1 - L) + (1 + L)|                        := by grind
    _ = |(1 - L) + (-1)*(-1 - L)|                  := by grind
    _ ≤ |1 - L| + |(-1)*(-1 - L)|                  := by grind
    _ = |1 - L| + |-1 - L|                         := by grind
    _ = |(-1:ℝ)^(2*k) - L| + |(-1:ℝ)^(2*k+1) - L|  := by
          have h2 : (-1:ℝ)^(2*k) = 1    := by simp
          have h3 : (-1:ℝ)^(2*k+1) = -1 := by grind
          rw [h2, h3]
    _ = |a (2*k) - L| + |a (2*k+1) - L|            := by simp [*]
    _ < 1/2 + 1/2                                  := by grind
    _ = 1                                          := by grind

-- 2ª demostración
-- ===============

example
  (ha : ∀ n, a n = (-1) ^ n)
  : ¬SeqConv a :=
by
  rintro ⟨L, hL⟩
  -- L : ℝ
  -- hL : SeqLim a L
  -- ⊢ False
  obtain ⟨k, hk⟩ := hL (1 / 2) (by positivity)
  -- k : ℕ
  -- hk : ∀ n ≥ k, |a n - L| < 1 / 2
  have h1 := hk (2 * k) (by omega)
  -- h1 : |a (2 * k) - L| < 1 / 2
  have h2 := hk (2 * k + 1) (by omega)
  -- h2 : |a (2 * k + 1) - L| < 1 / 2
  simp only [ha, pow_succ] at h1 h2
  -- h1 : |(-1) ^ (2 * k) - L| < 1 / 2
  -- h2 : |(-1) ^ (2 * k) * -1 - L| < 1 / 2
  norm_num at h1 h2
  -- h1 : |1 - L| < 1 / 2
  -- h2 : |-1 - L| < 1 / 2
  rw [abs_lt] at h1 h2
  -- h1 : -(1 / 2) < 1 - L ∧ 1 - L < 1 / 2
  -- h2 : -(1 / 2) < -1 - L ∧ -1 - L < 1 / 2
  linarith

-- 3ª demostración
-- ===============

variable {x y z x' y' : ℝ}
variable {m n k : ℕ}
variable (f : ℝ → ℝ)

lemma L1 : (1 - x) + (1 + x) = 2 := by
  calc (1 - x) + (1 + x)
       = 1 + 1             := sub_add_add_cancel 1 1 x
     _ = 2                 := one_add_one_eq_two

lemma L2 : (-1:ℝ) * -1 = 1 := by
  calc (-1:ℝ) * -1
       = 1 * 1   := neg_mul_neg 1 1
     _ = 1       := one_mul 1

lemma L3 : -1 * -x = x := by
  calc -1 * -x
       = -(1 * -x) := neg_mul 1 (-x)
     _ = - -x      := congr_arg (- ·) (one_mul (-x))
     _ = x         := neg_neg x

lemma L4 : -1 * (-1 - x) = 1 + x := by
  calc -1 * (-1 - x)
       = -1 * (-1 + -x)     := congr_arg (-1 * ·) (sub_eq_add_neg (-1) x)
     _ = -1 * -1 + -1 * -x  := left_distrib (-1) (-1) (-x)
     _ = 1 + -1 * -x        := congr_arg (· + (-1)*(-x)) L2
     _ = 1 + x              := congr_arg ( 1 + ·) L3

lemma L5 : |-1 * (-1 - x)| = |-1 - x| := by
  calc |-1 * (-1 - x)|
       = |-1| * |-1 - x| := abs_mul (-1) (-1 - x)
     _ = |1| * |-1 - x|  := congrArg (· * |-1 - x|) (abs_neg 1)
     _ = 1 * |-1 - x|    := congrArg (· * |-1 - x|) abs_one
     _ = |-1 - x|        := one_mul |-1 - x|

lemma L6 : (-1:ℝ)^(2*n) = 1 := by
  calc (-1:ℝ)^(2*n)
       = ((-1:ℝ)^2)^n := pow_mul (-1) 2 n
     _ = (1:ℝ)^n      := congr_arg ( · ^ n) neg_one_sq
     _ = 1            := one_pow n

lemma L7 : (-1:ℝ)^(2*n+1) = -1 := by
  calc (-1:ℝ)^(2*n+1)
       = (-1)^(2*n) * -1 := pow_succ (-1) (2 * n)
     _ = 1 * -1          := congr_arg (· * -1) L6
     _ = -1              := one_mul (-1)

lemma L8 : n ≤ 2 * n := by
  calc n
       = 1 * n := (one_mul n).symm
     _ ≤ 2 * n := Nat.mul_le_mul_right n one_le_two

lemma L9
  (hk : ∀ n ≥ k, |a n - x| < 1 / 2)
  : |a (2*k) - x| < 1 / 2 :=
hk (2*k) L8

lemma L10 : n ≤ 2 * n + 1 := by
  calc n
       ≤ 2 * n     := L8
     _ ≤ 2 * n + 1 := Nat.le_add_right (2 * n) 1

lemma L11
  (hk : ∀ n ≥ k, |a n - x| < 1 / 2)
  : |a (2*k+1) - x| < 1 / 2 :=
hk (2*k+1) L10

example
  (ha : ∀ n, a n = (-1) ^ n)
  : ¬ SeqConv a :=
by
  intro h
  -- h : SeqConv a
  -- ⊢ False
  obtain ⟨L, hL⟩ := h
  -- L : ℝ
  -- hL : SeqLim a L
  obtain ⟨k, hk⟩ := hL (1/2) one_half_pos
  -- k : ℕ
  -- hk : ∀ n ≥ k, |a n - L| < 1 / 2
  have h1 : ¬(2 : ℝ) < 1 := Nat.not_ofNat_lt_one
  apply h1
  -- ⊢ 2 < 1
  calc
    2 = |2| :=
          abs_two.symm
    _ = |(1 - L) + (1 + L)| :=
          congrArg abs L1.symm
    _ = |(1 - L) + (-1)*(-1 - L)| :=
          congr_arg (abs ((1 - L) + ·)) L4.symm
    _ ≤ |1 - L| + |(-1)*(-1 - L)| :=
          abs_add_le (1 - L) (-1 * (-1 - L))
    _ = |1 - L| + |-1 - L| :=
          congr_arg (|1 - L| + ·) L5
    _ = |(-1:ℝ)^(2*k) - L| + |(-1:ℝ)^(2*k+1) - L|  :=
          congrArg₂ (|· - L| + |· - L|) L6.symm L7.symm
    _ = |a (2*k) - L| + |a (2*k+1) - L| :=
          congrArg₂ (· + ·)
            (congrArg (|· - L|) (ha (2*k)).symm)
            (congrArg (|· - L|) (ha (2*k+1)).symm)
    _ < 1 / 2 + 1 / 2 :=
          add_lt_add (L9 hk) (L11 hk)
    _ = 1 := add_halves 1

-- Lemas usados
-- ============

variable (a b c d : ℝ)
#check (Nat.le_add_right n k : n ≤ n + k)
#check (Nat.mul_le_mul_right k : n ≤ m → n * k ≤ m * k)
#check (abs_add_le a b : |a + b| ≤ |a| + |b|)
#check (abs_lt : |a| < b ↔ -b < a ∧ a < b)
#check (abs_mul a b : |a * b| = |a| * |b|)
#check (abs_neg a : |(-a)| = |a|)
#check (abs_one : |(1 : ℝ)| = 1)
#check (abs_two : |(2 : ℝ)| = 2)
#check (add_halves a : a / 2 + a / 2 = a)
#check (add_lt_add : a < b → c < d → a + c < b + d)
#check (left_distrib a b c : a * (b + c) = a * b + a * c)
#check (lt_asymm  : a < b → ¬b < a)
#check (neg_mul a b : -a * b = -(a * b))
#check (neg_mul_neg a b : -a * -b = a * b)
#check (neg_neg a : - -a = a)
#check (neg_one_sq : (-1) ^ 2 = 1)
#check (one_add_one_eq_two : 1 + 1 = 2)
#check (one_half_pos : (0 : ℝ) < 1 / 2)
#check (one_lt_two : 1 < 2)
#check (one_mul a : 1 * a = a)
#check (one_pow n : 1 ^ n = 1)
#check (pow_mul a m n : a ^ (m * n) = (a ^ m) ^ n)
#check (pow_succ a n : a ^ (n + 1) = a ^ n * a)
#check (sub_add_add_cancel a b c : a - c + (b + c) = a + b)
#check (sub_eq_add_neg a b : a - b = a + -b)

Es posible consultar, modificar y ejecutar el código de estas demostraciones de forma interactiva en Lean 4 Web.

3. Soluciones colaborativas

¿Has encontrado una demostración distinta de las publicadas? Puedes compartirla en los comentarios de abajo siguiendo estos pasos:

  • Escribe tu demostración en live.lean-lang.org y comprueba que se compila sin errores.
  • Copia el código y publícalo en los comentarios de esta entrada, dentro de un bloque de código de Lean:
```lean
   -- tu demostración
```

Comentarios