Analysis I, Appendix A.6: Деякі приклади доказів та квантифікаторів

Деякі приклади доказів та квантифікаторів у Lean

Твердження A.6.1

example : ε > (0:), δ > 0, 2 * δ < ε := ε > 0, δ > 0, 2 * δ < ε ε::ε > 0 δ > 0, 2 * δ < ε ε::ε > 0ε / 3 > 0 2 * (ε / 3) < ε ε::ε > 0ε / 3 > 0ε::ε > 02 * (ε / 3) < ε ε::ε > 0ε / 3 > 0 All goals completed! 🐙 ε::ε > 02 * (ε / 3) < ε All goals completed! 🐙
declaration uses 'sorry'example : ¬ δ > 0, ε > (0:), 2 * δ < ε := ¬ δ > 0, ε > 0, 2 * δ < ε All goals completed! 🐙open Real in /-- Твердження A.6.2. Наведений нижче доказ є дещо не ідіоматичним для Lean, але ілюструє, як реалізувати доказ типу "нехай ε буде величиною, яку буде обрано пізніше". -/ 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 -- ми оберемо це пізніше ?eps > 0 (x : ), 0 < x x < ?eps sin x > x / 2 (x : ), 0 < x x < ?eps sin x > x / 2?eps > 0 -- відкласти перевірку позитивності на потім x:hx:0 < x x < ?epssin x > x / 2?eps > 0 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)sin x > x / 2?eps > 0 have hderiv : deriv sin = cos := ε > 0, (x : ), 0 < x x < ε sin x > x / 2 x✝:hx:0 < x✝ x✝ < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)x:deriv sin x = cos x x✝:hx:0 < x✝ x✝ < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)x:HasDerivAt sin (cos x) x All goals completed! 🐙 have := exists_deriv_eq_slope sin hpos (x:hx:0 < x x < ?epshpos:0 < _fvar.3011 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)ContinuousOn sin (Set.Icc 0 x) All goals completed! 🐙) (x:hx:0 < x x < ?epshpos:0 < _fvar.3011 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := funext fun x => HasDerivAt.deriv (Real.hasDerivAt_sin x)DifferentiableOn sin (Set.Ioo 0 x) All goals completed! 🐙) x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466this: c, (0 < c c < x) cos c = sin x / xsin x > x / 2?eps > 0 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xsin x > x / 2?eps > 0 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:cos y > 1 / 2sin x > x / 2x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xcos y > 1 / 2?eps > 0 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:cos y > 1 / 2sin x > x / 2 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)sin x > x / 2 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)x / 2 < sin x x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)x / 2 = x * (1 / 2)x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xhcosy:x * (1 / 2) < x * (sin x / x)sin x = x * (sin x / x) x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y: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:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3cos y > 1 / 2x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xy < π / 3?eps > 0 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3cos y > 1 / 2 have := cos_lt_cos_of_nonneg_of_le_pi (le_of_lt hy1) (x:hx:0 < x x < ?epshpos:0 < _fvar.3011 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv: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:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:y < π / 3this:cos y > 1 / 2cos y > 1 / 2 All goals completed! 🐙 have : y < ?eps := ε > 0, (x : ), 0 < x x < ε sin x > x / 2 All goals completed! 🐙 x:hx:0 < x x < ?epshpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xthis:_fvar.9766 < ?_mvar.2936 := ?_mvar.15216y < π / 3?eps > 0 -- Тепер час підібрати ε All goals completed! 🐙 x:hx:0 < x x < π / 3hpos:?_mvar.3018 := failed to pretty print expression (use 'set_option pp.rawOnError true' for raw representation)hderiv:deriv Real.sin = Real.cos := ?_mvar.3466y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xthis:_fvar.9766 < ?_mvar.2936 := ?_mvar.15216y < π / 3 All goals completed! 🐙 All goals completed! 🐙open Real in /-- Твердження A.6.2: більш ідіоматичний доказ -/ 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 < π / 3sin 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.17357this: c, (0 < c c < x) cos c = sin x / xsin x > x / 2 x:hpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xsin 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.23657 < 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.16830) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right _fvar.16830 (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.16830 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))) (Mathlib.Tactic.Ring.zero_mul (_fvar.16830 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.16830 ^ 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.16830 ^ 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.23657) (Mathlib.Tactic.Ring.atom_pf _fvar.16830) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul _fvar.16830 (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.16830 ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast) (Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right _fvar.16830 (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.23657 (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.23657 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))) (Mathlib.Tactic.Ring.add_pf_add_lt (_fvar.16830 ^ Nat.rawCast 1 * (Int.negOfNat 3).rawCast) (Mathlib.Tactic.Ring.add_pf_zero_add (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))) (Mathlib.Tactic.Ring.zero_mul (_fvar.16830 ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))) (Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.16830 ^ Nat.rawCast 1 * (Int.negOfNat 3).rawCast + (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))))) (Mathlib.Tactic.Ring.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.add_overlap_pf_zero _fvar.16830 (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.23657 ^ 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.23657) (Mathlib.Tactic.Ring.add_mul (Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_pf_right _fvar.23657 (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.23657 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0))) (Mathlib.Tactic.Ring.zero_mul (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 1 + 0)) (Mathlib.Tactic.Ring.add_pf_add_zero (_fvar.23657 ^ Nat.rawCast 1 * Nat.rawCast 3 + 0)))) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul _fvar.23657 (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.23657 ^ 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.23657 (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.16858) (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.23698) (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.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy:cos y > 1 / 2sin x > x / 2 x:hpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy:x * (1 / 2) < x * (sin x / x)sin x > x / 2 x:hpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy:x * (1 / 2) < x * (sin x / x)x / 2 < sin x x:hpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy:x * (1 / 2) < x * (sin x / x)x / 2 = x * (1 / 2)x:hpos:0 < xhx:x < π / 3hderiv:deriv Real.sin = Real.cos := ?_mvar.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy: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.17357y:hy3:cos y = sin x / xhy1:0 < yhy2:y < xybound:_fvar.23657 < Real.pi / 3 := ?_mvar.23806hcosy:x * (1 / 2) < x * (sin x / x)x / 2 = x * (1 / 2) All goals completed! 🐙 All goals completed! 🐙