Analysis I, Appendix A.6: Some examples of proofs and quantifiers
Some examples of proofs and quantifiers in Lean
Proposition A.6.1
example : ∀ ε > (0:ℝ), ∃ δ > 0, 2 * δ < ε := ⊢ ∀ ε > 0, ∃ δ > 0, 2 * δ < ε
ε:ℝhε:ε > 0⊢ ∃ δ > 0, 2 * δ < ε
ε:ℝhε:ε > 0⊢ ε / 3 > 0 ∧ 2 * (ε / 3) < ε
ε:ℝhε:ε > 0⊢ ε / 3 > 0ε:ℝhε:ε > 0⊢ 2 * (ε / 3) < ε
ε:ℝhε:ε > 0⊢ ε / 3 > 0 All goals completed! 🐙
ε:ℝhε:ε > 0⊢ 2 * (ε / 3) < ε All goals completed! 🐙example : ¬ ∃ δ > 0, ∀ ε > (0:ℝ), 2 * δ < ε := ⊢ ¬∃ δ > 0, ∀ ε > 0, 2 * δ < ε
All goals completed! 🐙open Real in
/-- Proposition A.6.2. The proof below is somewhat non-idiomatic for Lean, but illustrates how to implement a "let ε be a quantity to be chosen later" type of proof. -/
example : ∃ ε > 0, ∀ x, 0 < x ∧ x < ε → sin x > x / 2 := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2
⊢ ?eps > 0 ∧ ∀ (x : ℝ), 0 < x ∧ x < ?eps → sin x > x / 2⊢ ℝ -- we will choose this later
⊢ ?eps > 0⊢ ∀ (x : ℝ), 0 < x ∧ x < ?eps → sin x > x / 2⊢ ℝ
⊢ ∀ (x : ℝ), 0 < x ∧ x < ?eps → sin x > x / 2⊢ ?eps > 0⊢ ℝ -- defer the checking of positivity until later
x:ℝhpos:0 < xhx:x < ?eps⊢ sin x > x / 2⊢ ?eps > 0⊢ ℝ
have hderiv : deriv sin = cos := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2
x✝:ℝhpos:0 < x✝hx:x✝ < ?epsx:ℝ⊢ deriv sin x = cos x
x✝:ℝhpos:0 < x✝hx:x✝ < ?epsx:ℝ⊢ HasDerivAt sin (cos x) x
All goals completed! 🐙
have := exists_deriv_eq_slope sin hpos (x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)⊢ ContinuousOn sin (Set.Icc 0 x) All goals completed! 🐙) (x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)⊢ DifferentiableOn ℝ sin (Set.Ioo 0 x) All goals completed! 🐙)
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478this:∃ c, (0 < c ∧ c < x) ∧ cos c = sin x / x⊢ sin x > x / 2⊢ ?eps > 0⊢ ℝ
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < x⊢ sin x > x / 2⊢ ?eps > 0⊢ ℝ
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:cos y > 1 / 2⊢ sin x > x / 2x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < x⊢ cos y > 1 / 2⊢ ?eps > 0⊢ ℝ
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:cos y > 1 / 2⊢ sin x > x / 2 x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)⊢ sin x > x / 2
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 < sin x
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 = x * (1 / 2)x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)⊢ sin x = x * (sin x / x)
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 = x * (1 / 2) All goals completed! 🐙
All goals completed! 🐙
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3⊢ cos y > 1 / 2x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < x⊢ y < π / 3⊢ ?eps > 0⊢ ℝ
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3⊢ cos y > 1 / 2 have := cos_lt_cos_of_nonneg_of_le_pi (le_of_lt hy1) (x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3⊢ π / 3 ≤ π All goals completed! 🐙) ybound
x:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3this:cos y > 1 / 2⊢ cos y > 1 / 2
All goals completed! 🐙
have : y < ?eps := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2
All goals completed! 🐙
⊢ ℝx:ℝhpos:0 < xhx:x < ?epshderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xthis:_fvar.9778 < ?_mvar.2936 := ?_mvar.15012⊢ y < π / 3⊢ ?eps > 0 -- Now it is time to pick ε
⊢ ℝ All goals completed! 🐙
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.3478y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xthis:_fvar.9778 < ?_mvar.2936 := ?_mvar.15012⊢ y < π / 3 All goals completed! 🐙
All goals completed! 🐙open Real in
/-- Proposition A.6.2: a more idiomatic proof -/
example : ∃ ε > 0, ∀ x, 0 < x ∧ x < ε → sin x > x / 2 := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2
use π/3, ⊢ π / 3 > 0 All goals completed! 🐙
x:ℝhpos:0 < xhx:x < π / 3⊢ sin x > x / 2
have hderiv : deriv sin = cos := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2
x✝:ℝhpos:0 < x✝hx:x✝ < π / 3x:ℝ⊢ deriv sin x = cos x
x✝:ℝhpos:0 < x✝hx:x✝ < π / 3x:ℝ⊢ HasDerivAt sin (cos x) x
All goals completed! 🐙
have := exists_deriv_eq_slope sin hpos (x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)⊢ ContinuousOn sin (Set.Icc 0 x) All goals completed! 🐙) (x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)⊢ DifferentiableOn ℝ sin (Set.Ioo 0 x) All goals completed! 🐙)
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149this:∃ c, (0 < c ∧ c < x) ∧ cos c = sin x / x⊢ sin x > x / 2
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < x⊢ sin x > x / 2
have ybound : y < π/3 := ⊢ ∃ ε > 0, ∀ (x : ℝ), 0 < x ∧ x < ε → sin x > x / 2 All goals completed! 🐙
have hcosy := cos_lt_cos_of_nonneg_of_le_pi (le_of_lt hy1) (x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 :=
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.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)))
(Mathlib.Tactic.Ring.atom_pf _fvar.16622)
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right _fvar.16622 (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 3)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 3))
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.16622 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))
(Mathlib.Tactic.Ring.zero_mul (_fvar.16622 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.16622 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.atom_pf Real.pi)
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right Real.pi (Nat.rawCast 1)
(Mathlib.Tactic.Ring.one_mul (Nat.rawCast 1)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 1))
(Mathlib.Tactic.Ring.add_pf_add_zero (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul Real.pi (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 (_fvar.16622 ^ Nat.rawCast 1 * Nat.rawCast 3)
(Mathlib.Tactic.Ring.add_pf_zero_add (Real.pi ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0)))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)))
(Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf _fvar.23449)
(Mathlib.Tactic.Ring.atom_pf _fvar.16622)
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul _fvar.16622 (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_gt (_fvar.16622 ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right _fvar.16622 (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 3))
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 3)))))
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right _fvar.23449 (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 3)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 3))
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_lt (_fvar.16622 ^ Nat.rawCast 1 * (Int.negOfNat 3).rawCast)
(Mathlib.Tactic.Ring.add_pf_zero_add (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))))
(Mathlib.Tactic.Ring.zero_mul
(_fvar.16622 ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast +
(_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.add_pf_add_zero
(_fvar.16622 ^ Nat.rawCast 1 * (Int.negOfNat 3).rawCast +
(_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero _fvar.16622 (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 3))
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 3)) (Eq.refl (Int.ofNat 0)))))
(Mathlib.Tactic.Ring.add_pf_add_lt (Real.pi ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast)
(Mathlib.Tactic.Ring.add_pf_zero_add (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))))
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Tactic.Ring.atom_pf Real.pi)
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right Real.pi (Nat.rawCast 1)
(Mathlib.Tactic.Ring.one_mul (Nat.rawCast 1)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 1))
(Mathlib.Tactic.Ring.add_pf_add_zero (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)))
(Mathlib.Tactic.Ring.atom_pf _fvar.23449)
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right _fvar.23449 (Nat.rawCast 1)
(Mathlib.Tactic.Ring.mul_one (Nat.rawCast 3)))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 3))
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))
(Mathlib.Tactic.Ring.zero_mul (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23449 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul _fvar.23449 (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 ℝ 3))
(Eq.refl (Int.negOfNat 3))))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_lt (Real.pi ^ Nat.rawCast 1 * Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_zero_add (_fvar.23449 ^ Nat.rawCast 1 * (Int.negOfNat 3).rawCast + 0)))))
(Mathlib.Tactic.Ring.add_pf_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero Real.pi (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_add_overlap_zero
(Mathlib.Tactic.Ring.add_overlap_pf_zero _fvar.23449 (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℝ 3))
(Mathlib.Meta.NormNum.IsInt.of_raw ℝ (Int.negOfNat 3)) (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
(Eq.mp
(congrArg (fun _a => _a < 0)
(CancelDenoms.sub_subst rfl
(CancelDenoms.div_subst rfl
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.IsNNRat.to_isNat
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.IsNNRat.to_isNat
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3))))
(Eq.refl (Nat.mul 3 1)) (Eq.refl 3))))))
(Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one) (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3))
(Eq.refl 3))
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3))))))
(Mathlib.Tactic.Linarith.mul_neg (Mathlib.Tactic.Linarith.sub_neg_of_lt _fvar.16650)
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero)
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)) (Eq.refl false))))
(Mathlib.Tactic.Linarith.mul_neg (Mathlib.Tactic.Linarith.sub_neg_of_lt _fvar.23490)
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero)
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)) (Eq.refl false))))
(Eq.mp
(congrArg (fun _a => _a ≤ 0)
(CancelDenoms.sub_subst
(CancelDenoms.div_subst rfl
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.IsNNRat.to_isNat
(Mathlib.Meta.NormNum.isNNRat_div
(Mathlib.Meta.NormNum.IsNat.to_isNNRat
(Mathlib.Meta.NormNum.IsNNRat.to_isNat
(Mathlib.Meta.NormNum.isNNRat_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isNNRat (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)))
(Mathlib.Meta.NormNum.isNNRat_inv_pos
(Mathlib.Meta.NormNum.IsNat.to_isNNRat (Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3))))
(Eq.refl (Nat.mul 3 1)) (Eq.refl 3))))))
(Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_one)
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)) (Eq.refl 3))
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3))))
rfl))
(Mathlib.Tactic.Linarith.mul_nonpos (Mathlib.Tactic.Linarith.sub_nonpos_of_le a)
(Mathlib.Meta.NormNum.isNat_lt_true (Mathlib.Meta.NormNum.isNat_ofNat ℝ Nat.cast_zero)
(Mathlib.Meta.NormNum.isNat_ofNat ℝ (Eq.refl 3)) (Eq.refl false))))))⊢ π / 3 ≤ π All goals completed! 🐙) ybound
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:cos y > 1 / 2⊢ sin x > x / 2
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:x * (1 / 2) < x * (sin x / x)⊢ sin x > x / 2
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 < sin x
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 = x * (1 / 2)x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:x * (1 / 2) < x * (sin x / x)⊢ sin x = x * (sin x / x)
x:ℝhpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17149y:ℝhy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23449 < Real.pi / 3 := ?_mvar.23598hcosy:x * (1 / 2) < x * (sin x / x)⊢ x / 2 = x * (1 / 2) All goals completed! 🐙
All goals completed! 🐙