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 BA B A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AB A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:CB A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:DB A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:BB 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.piReal.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) = 1Real.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 BA B A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AB A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhD:DBA:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AD A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhD:DB All goals completed! 🐙 A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhC:CDA:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AC A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhC:CD 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.piReal.sin (x / 2) + 1 = 2 x:h:x = Real.pih1:Real.sin (x / 2) = 1Real.sin (x / 2) + 1 = 2x:h:x = Real.piReal.sin (x / 2) = 1 x:h:x = Real.pih1:Real.sin (x / 2) = 1Real.sin (x / 2) + 1 = 2 x:h:x = Real.pih1:Real.sin (x / 2) = 11 + 1 = 2 All goals completed! 🐙 x:h:x = Real.pih2:x / 2 = Real.pi / 2Real.sin (x / 2) = 1x:h:x = Real.pix / 2 = Real.pi / 2 x:h:x = Real.pih2:x / 2 = Real.pi / 2Real.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 < 1Summable fun n => n * r ^ n r:h:0 < rh':r < 1∀ᶠ (n : ) in Filter.atTop, n * r ^ n 0r:h:0 < rh':r < 1Filter.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 < 1Filter.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 br * ((b + 1) / b) = |b + 1| * |r| ^ (b + 1) / (b * |r| ^ b) have : b > 0 := r:h:0 < rh':r < 1Summable fun n => n * r ^ n All goals completed! 🐙 have hb1 : (b+1:) > 0 := r:h:0 < rh':r < 1Summable 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 < 1Filter.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 < 1Filter.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 b1 + (↑b)⁻¹ = (b + 1) / b have : (b:) > 0 := r:h:0 < rh':r < 1Summable 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 < 1Filter.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 BA B A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AB A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhD:DBA:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AD A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhD:DB All goals completed! 🐙 A:PropB:PropC:PropD:ProphAC:A ChCD:C DhDB:D Bh:AhC:C := hAC hD 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 CA 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:BC 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 hAC 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, hBC 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, hBhCG:C GC 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, hBC 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, hBhCG:C GC 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, hBhC:ChG:GC 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, hBhC:ChG:GhD:D := hADG hA hGC 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, hBhH:HC 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, hBhI:IC 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, hBhH:HC 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, hBhH:HhC:C := hFHC hF, hHC 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, hBhH:HhC:C := hFHC hF, hHhG:G := hAHG hA, hHC 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, hBhI:IhG:G := hIG hIC 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, hBhI:IhG:G := hIG hIhC:C := hIGC hGC 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 ¬CA ¬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:BFalse A:PropB:PropC:PropD:ProphBC:B ChAD:A DhCD:D ¬ChA:AhB:BhC:C := hBC hBFalse A:PropB:PropC:PropD:ProphBC:B ChAD:A DhCD:D ¬ChA:AhB:BhC:C := hBC hBhD:D := hAD hAFalse A:PropB:PropC:PropD:ProphBC:B ChAD:A DhCD:D ¬ChA:AhB:BhC:C := hBC hBhD:D := hAD hAhC':¬C := hCD hDFalse All goals completed! 🐙