Analysis I, Appendix A.3: The structure of proofs
Some examples of proofs
Proposition A.3.1
example {A B C D: Prop} (hAC: A → C) (hCD: C → D) (hDB: D → B): A → B := A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → B⊢ A → B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:C⊢ B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:D⊢ B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:B⊢ B
All goals completed! 🐙Proposition A.3.2
example {x:ℝ} : x = Real.pi → Real.sin (x/2) + 1 = 2 := x:ℝ⊢ x = Real.pi → Real.sin (x / 2) + 1 = 2
x:ℝh:x = Real.pi⊢ Real.sin (x / 2) + 1 = 2
-- congr() produces an equality (or similar relation) from one or more existing relations, such as `h`, by substituting that relation in every location marked with a `$` sign followed by that relation, for instance `h` would be substituted at every location of `$h`.
x:ℝh:x / 2 = Real.pi / 2 := id (congrArg (fun x => x / 2) _fvar.317)⊢ Real.sin (x / 2) + 1 = 2
x:ℝh:Real.sin (x / 2) = Real.sin (Real.pi / 2) := id (congrArg Real.sin _fvar.484)⊢ Real.sin (x / 2) + 1 = 2
x:ℝh:Real.sin (x / 2) = 1⊢ Real.sin (x / 2) + 1 = 2
x:ℝh:Real.sin (x / 2) + 1 = 1 + 1 := id (congrArg (fun x => x + 1) _fvar.714)⊢ Real.sin (x / 2) + 1 = 2
x:ℝh:Real.sin (x / 2) + 1 = 1 + 1 := id (congrArg (fun x => x + 1) _fvar.714)⊢ 2 = 1 + 1
All goals completed! 🐙Proposition A.3.1, alternate proof
example {A B C D: Prop} (hAC: A → C) (hCD: C → D) (hDB: D → B): A → B := A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → B⊢ A → B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhD:D⊢ BA:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ D
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhD:D⊢ B All goals completed! 🐙
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhC:C⊢ DA:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ C
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhC:C⊢ D All goals completed! 🐙
All goals completed! 🐙Proposition A.3.2, alternate proof
example {x:ℝ} : x = Real.pi → Real.sin (x/2) + 1 = 2 := x:ℝ⊢ x = Real.pi → Real.sin (x / 2) + 1 = 2
x:ℝh:x = Real.pi⊢ Real.sin (x / 2) + 1 = 2
x:ℝh:x = Real.pih1:Real.sin (x / 2) = 1⊢ Real.sin (x / 2) + 1 = 2x:ℝh:x = Real.pi⊢ Real.sin (x / 2) = 1
x:ℝh:x = Real.pih1:Real.sin (x / 2) = 1⊢ Real.sin (x / 2) + 1 = 2 x:ℝh:x = Real.pih1:Real.sin (x / 2) = 1⊢ 1 + 1 = 2
All goals completed! 🐙
x:ℝh:x = Real.pih2:x / 2 = Real.pi / 2⊢ Real.sin (x / 2) = 1x:ℝh:x = Real.pi⊢ x / 2 = Real.pi / 2
x:ℝh:x = Real.pih2:x / 2 = Real.pi / 2⊢ Real.sin (x / 2) = 1 All goals completed! 🐙
All goals completed! 🐙Proposition A.3.3
example {r:ℝ} (h: 0 < r) (h': r < 1) : Summable (fun n:ℕ ↦ n * r^n) := r:ℝh:0 < rh':r < 1⊢ Summable fun n => ↑n * r ^ n
r:ℝh:0 < rh':r < 1⊢ ∀ᶠ (n : ℕ) in Filter.atTop, ↑n * r ^ n ≠ 0r:ℝh:0 < rh':r < 1⊢ Filter.Tendsto (fun n => ‖↑(n + 1) * r ^ (n + 1)‖ / ‖↑n * r ^ n‖) Filter.atTop (nhds r)
r:ℝh:0 < rh':r < 1⊢ ∀ᶠ (n : ℕ) in Filter.atTop, ↑n * r ^ n ≠ 0 r:ℝh:0 < rh':r < 1⊢ ∃ a, ∀ (b : ℕ), a ≤ b → ¬b = 0 ∧ (r = 0 → b = 0)
r:ℝh:0 < rh':r < 1⊢ ∀ (b : ℕ), 1 ≤ b → ¬b = 0 ∧ (r = 0 → b = 0)
intro b r:ℝh:0 < rh':r < 1b:ℕhb:1 ≤ b⊢ ¬b = 0 ∧ (r = 0 → b = 0)
All goals completed! 🐙
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)⊢ Filter.Tendsto (fun n => ‖↑(n + 1) * r ^ (n + 1)‖ / ‖↑n * r ^ n‖) Filter.atTop (nhds r)r:ℝh:0 < rh':r < 1⊢ Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)⊢ Filter.Tendsto (fun n => ‖↑(n + 1) * r ^ (n + 1)‖ / ‖↑n * r ^ n‖) Filter.atTop (nhds r) r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)⊢ (fun n => r * ((↑n + 1) / ↑n)) =ᶠ[Filter.atTop] fun n => ‖↑(n + 1) * r ^ (n + 1)‖ / ‖↑n * r ^ n‖
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)⊢ ∃ a, ∀ (b : ℕ), a ≤ b → r * ((↑b + 1) / ↑b) = |↑b + 1| * |r| ^ (b + 1) / (↑b * |r| ^ b)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)⊢ ∀ (b : ℕ), 1 ≤ b → r * ((↑b + 1) / ↑b) = |↑b + 1| * |r| ^ (b + 1) / (↑b * |r| ^ b)
intro b r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)b:ℕhb:1 ≤ b⊢ r * ((↑b + 1) / ↑b) = |↑b + 1| * |r| ^ (b + 1) / (↑b * |r| ^ b)
have : b > 0 := r:ℝh:0 < rh':r < 1⊢ Summable fun n => ↑n * r ^ n All goals completed! 🐙
have hb1 : (b+1:ℝ) > 0 := r:ℝh:0 < rh':r < 1⊢ Summable fun n => ↑n * r ^ n All goals completed! 🐙
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)b:ℕhb:1 ≤ bthis:b > 0 :=
lt_of_not_ge fun a =>
Mathlib.Tactic.Linarith.lt_irrefl
(Eq.mp
(congrArg (fun _a => _a < 0)
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.neg_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑b) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.ofNat 0))))
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero (↑b) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le (neg_neg_of_pos Mathlib.Tactic.Linarith.zero_lt_one)
(Mathlib.Tactic.Linarith.sub_nonpos_of_le
(id
(Eq.mp
(Eq.trans (Mathlib.Tactic.Zify.natCast_le._simp_1 1 b) (congrFun' (congrArg LE.le Nat.cast_one) ↑b))
hb))))
(Mathlib.Tactic.Linarith.sub_nonpos_of_le
(id (Eq.mp (Eq.trans (Mathlib.Tactic.Zify.natCast_le._simp_1 b 0) (congrArg (LE.le ↑b) Nat.cast_zero)) a)))))hb1:↑b + 1 > 0 :=
lt_of_not_ge fun a =>
Mathlib.Tactic.Linarith.lt_irrefl
(Eq.mp
(congrArg (fun _a => _a < 0)
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑b) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.atom_pf r)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul r (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.add_pf_add_lt (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf r)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 1).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 1).rawCast
(Mathlib.Tactic.Ring.add_pf_add_lt (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero r (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 1 + (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero (↑b) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))))
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le
(Mathlib.Tactic.Linarith.add_neg
(Mathlib.Tactic.Linarith.add_lt_of_le_of_neg
(Mathlib.Tactic.Linarith.sub_nonpos_of_le (Mathlib.Tactic.Linarith.natCast_nonneg ℝ b))
(Mathlib.Tactic.Linarith.sub_neg_of_lt h))
(Mathlib.Tactic.Linarith.sub_neg_of_lt h'))
(Mathlib.Tactic.Linarith.sub_nonpos_of_le a)))⊢ r * ((↑b + 1) / ↑b) = (↑b + 1) * r ^ (b + 1) / (↑b * r ^ b)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)b:ℕhb:1 ≤ bthis:b > 0 :=
lt_of_not_ge fun a =>
Mathlib.Tactic.Linarith.lt_irrefl
(Eq.mp
(congrArg (fun _a => _a < 0)
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.neg_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1)))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑b) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_lt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.ofNat 0))))
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero (↑b) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le (neg_neg_of_pos Mathlib.Tactic.Linarith.zero_lt_one)
(Mathlib.Tactic.Linarith.sub_nonpos_of_le
(id
(Eq.mp
(Eq.trans (Mathlib.Tactic.Zify.natCast_le._simp_1 1 b) (congrFun' (congrArg LE.le Nat.cast_one) ↑b))
hb))))
(Mathlib.Tactic.Linarith.sub_nonpos_of_le
(id (Eq.mp (Eq.trans (Mathlib.Tactic.Zify.natCast_le._simp_1 b 0) (congrArg (LE.le ↑b) Nat.cast_zero)) a)))))hb1:↑b + 1 > 0 :=
lt_of_not_ge fun a =>
Mathlib.Tactic.Linarith.lt_irrefl
(Eq.mp
(congrArg (fun _a => _a < 0)
(Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑b) (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_zero_add (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.atom_pf r)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul r (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.add_pf_add_lt (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))
(Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf r)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.negOfNat 1)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 1).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 1).rawCast
(Mathlib.Tactic.Ring.add_pf_add_lt (↑b ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero r (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0)))))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.add_congr (Mathlib.Tactic.Ring.atom_pf ↑b)
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))
(Mathlib.Tactic.Ring.sub_pf Mathlib.Tactic.Ring.neg_zero
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 1 + (↑b ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero (↑b) (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 1))
(Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_zero_add 0))))
(Mathlib.Tactic.Ring.cast_zero (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero))))
(Mathlib.Tactic.Linarith.add_lt_of_neg_of_le
(Mathlib.Tactic.Linarith.add_neg
(Mathlib.Tactic.Linarith.add_lt_of_le_of_neg
(Mathlib.Tactic.Linarith.sub_nonpos_of_le (Mathlib.Tactic.Linarith.natCast_nonneg ℝ b))
(Mathlib.Tactic.Linarith.sub_neg_of_lt h))
(Mathlib.Tactic.Linarith.sub_neg_of_lt h'))
(Mathlib.Tactic.Linarith.sub_nonpos_of_le a)))⊢ r * r ^ b = r ^ (b + 1)
All goals completed! 🐙
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1)⊢ Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r)r:ℝh:0 < rh':r < 1⊢ Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1)⊢ Filter.Tendsto (fun n => r * ((↑n + 1) / ↑n)) Filter.atTop (nhds r) r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1)⊢ r = r * 1
All goals completed! 🐙
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)⊢ Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1)r:ℝh:0 < rh':r < 1⊢ Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)⊢ Filter.Tendsto (fun n => (↑n + 1) / ↑n) Filter.atTop (nhds 1) r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)⊢ (fun n => 1 + 1 / ↑n) =ᶠ[Filter.atTop] fun n => (↑n + 1) / ↑n
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)⊢ ∃ a, ∀ (b : ℕ), a ≤ b → 1 + (↑b)⁻¹ = (↑b + 1) / ↑b
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)⊢ ∀ (b : ℕ), 1 ≤ b → 1 + (↑b)⁻¹ = (↑b + 1) / ↑b
intro b r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)b:ℕhb:1 ≤ b⊢ 1 + (↑b)⁻¹ = (↑b + 1) / ↑b
have : (b:ℝ) > 0 := r:ℝh:0 < rh':r < 1⊢ Summable fun n => ↑n * r ^ n All goals completed! 🐙
All goals completed! 🐙
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 / ↑n) Filter.atTop (nhds 0)⊢ Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1)r:ℝh:0 < rh':r < 1⊢ Filter.Tendsto (fun n => 1 / ↑n) Filter.atTop (nhds 0)
r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 / ↑n) Filter.atTop (nhds 0)⊢ Filter.Tendsto (fun n => 1 + 1 / ↑n) Filter.atTop (nhds 1) r:ℝh:0 < rh':r < 1hconv:Filter.Tendsto (fun n => 1 / ↑n) Filter.atTop (nhds 0)⊢ 1 = 1 + 0
All goals completed! 🐙
All goals completed! 🐙Proposition A.3.1, third proof
example {A B C D: Prop} (hAC: A → C) (hCD: C → D) (hDB: D → B): A → B := A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → B⊢ A → B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ B
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhD:D⊢ BA:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:A⊢ D
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhD:D⊢ B All goals completed! 🐙
A:PropB:PropC:PropD:ProphAC:A → ChCD:C → DhDB:D → Bh:AhC:C := hAC h⊢ D
All goals completed! 🐙Proposition A.3.4
example {A B C D E F G H I:Prop} (hAE: A → E) (hEB: E ∧ B → F) (hADG : A → G → D) (hHI: H ∨ I) (hFHC : F ∧ H → C) (hAHG : A ∧ H → G) (hIG: I → G) (hIGC: G → C) : A ∧ B → C ∧ D := A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → C⊢ A ∧ B → C ∧ D
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:B⊢ C ∧ D
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hA⊢ C ∧ D
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩⊢ C ∧ D
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hCG:C ∧ G⊢ C ∧ DA:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩⊢ C ∧ G
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hCG:C ∧ G⊢ C ∧ D A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hC:ChG:G⊢ C ∧ D
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhHI:H ∨ IhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hC:ChG:GhD:D := hADG hA hG⊢ C ∧ D
All goals completed! 🐙
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hH:H⊢ C ∧ GA:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hI:I⊢ C ∧ G
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hH:H⊢ C ∧ G A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hH:HhC:C := hFHC ⟨hF, hH⟩⊢ C ∧ G
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hH:HhC:C := hFHC ⟨hF, hH⟩hG:G := hAHG ⟨hA, hH⟩⊢ C ∧ G
All goals completed! 🐙
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hI:IhG:G := hIG hI⊢ C ∧ G
A:PropB:PropC:PropD:PropE:PropF:PropG:PropH:PropI:ProphAE:A → EhEB:E ∧ B → FhADG:A → G → DhFHC:F ∧ H → ChAHG:A ∧ H → GhIG:I → GhIGC:G → ChA:AhB:BhE:E := hAE hAhF:F := hEB ⟨hE, hB⟩hI:IhG:G := hIG hIhC:C := hIGC hG⊢ C ∧ G
All goals completed! 🐙Proposition A.3.5
example {A B C D:Prop} (hBC: B → C) (hAD: A → D) (hCD: D → ¬ C) : A → ¬ B := A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬C⊢ A → ¬B
A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬ChA:A⊢ ¬B
A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬ChA:AhB:B⊢ False
A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬ChA:AhB:BhC:C := hBC hB⊢ False
A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬ChA:AhB:BhC:C := hBC hBhD:D := hAD hA⊢ False
A:PropB:PropC:PropD:ProphBC:B → ChAD:A → DhCD:D → ¬ChA:AhB:BhC:C := hBC hBhD:D := hAD hAhC':¬C := hCD hD⊢ False
All goals completed! 🐙