mathematics_in_lean

My solutions for this book

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
import Mathlib.Data.Real.Basic

def ConvergesTo (s :   ) (a : ) :=
   ε > 0,  N,  n  N, abs (s n - a) < ε

example : (fun x y :  => (x + y) ^ 2) = fun x y :  => x ^ 2 + 2 * x * y + y ^ 2 := by
  ext
  ring

example (a b : ) : abs a = abs (a - b + b) := by
  congr
  ring

example {a : } (h : 1 < a) : a < a * a := by
  convert(mul_lt_mul_right _).2 h
  · rw [one_mul]
  exact lt_trans zero_lt_one h

theorem convergesTo_const (a : ) : ConvergesTo (fun x :  => a) a := by
  intro ε εpos
  use 0
  intro n nge; dsimp
  rw [sub_self, abs_zero]
  apply εpos

theorem convergesTo_add {s t :   } {a b : } (cs : ConvergesTo s a) (ct : ConvergesTo t b) :
    ConvergesTo (fun n => s n + t n) (a + b) := by
  intro ε εpos
  dsimp
  have ε2pos : 0 < ε / 2 := by linarith
  cases' cs (ε / 2) ε2pos with Ns hs
  cases' ct (ε / 2) ε2pos with Nt ht
  use max Ns Nt
  sorry

theorem convergesTo_mul_const {s :   } {a : } (c : ) (cs : ConvergesTo s a) :
    ConvergesTo (fun n => c * s n) (c * a) := by
  by_cases h : c = 0
  · convert convergesTo_const 0
    · rw [h, MulZeroClass.zero_mul]
    rw [h, MulZeroClass.zero_mul]
  have acpos : 0 < abs c := abs_pos.mpr h
  sorry

theorem exists_abs_le_of_convergesTo {s :   } {a : } (cs : ConvergesTo s a) :
     N b,  n, N  n  abs (s n) < b := by
  cases' cs 1 zero_lt_one with N h
  use N, abs a + 1
  sorry

theorem aux {s t :   } {a : } (cs : ConvergesTo s a) (ct : ConvergesTo t 0) :
    ConvergesTo (fun n => s n * t n) 0 := by
  intro ε εpos
  dsimp
  rcases exists_abs_le_of_convergesTo cs with N₀, B, h₀
  have Bpos : 0 < B := lt_of_le_of_lt (abs_nonneg _) (h₀ N₀ (le_refl _))
  have pos₀ : ε / B > 0 := div_pos εpos Bpos
  cases' ct _ pos₀ with N₁ h₁
  sorry

theorem convergesTo_mul {s t :   } {a b : } (cs : ConvergesTo s a) (ct : ConvergesTo t b) :
    ConvergesTo (fun n => s n * t n) (a * b) := by
  have h₁ : ConvergesTo (fun n => s n * (t n + -b)) 0 := by
    apply aux cs
    convert convergesTo_add ct (convergesTo_const (-b))
    ring
  have := convergesTo_add h₁ (convergesTo_mul_const b cs)
  convert convergesTo_add h₁ (convergesTo_mul_const b cs) using 1
  · ext; ring
  ring

theorem convergesTo_unique {s :   } {a b : } (sa : ConvergesTo s a) (sb : ConvergesTo s b) :
    a = b := by
  by_contra abne
  have : abs (a - b) > 0 := by sorry
  let ε := abs (a - b) / 2
  have εpos : ε > 0 := by
    change abs (a - b) / 2 > 0
    linarith
  cases' sa ε εpos with Na hNa
  cases' sb ε εpos with Nb hNb
  let N := max Na Nb
  have absa : abs (s N - a) < ε := by sorry
  have absb : abs (s N - b) < ε := by sorry
  have : abs (a - b) < abs (a - b) := by sorry
  exact lt_irrefl _ this

section
variable {α : Type _} [LinearOrder α]

def ConvergesTo' (s : α  ) (a : ) :=
   ε > 0,  N,  n  N, abs (s n - a) < ε

end