import Lean4AnalysisTao.C02_NaturalNumbers.S02_Addition -- Definition 2.3.1 axiom MyNat.mul : MyNat โ†’ MyNat โ†’ MyNat infixl:70 " * " => MyNat.mul axiom MyNat.zero_mul : โˆ€ (m : MyNat), ๐Ÿ˜ * m = ๐Ÿ˜ axiom MyNat.succ_mul : โˆ€ (n m : MyNat), (n++) * m = n * m + m -- Lemma 2.3.2 theorem MyNat.mul_zero : โˆ€ (n : MyNat), n * ๐Ÿ˜ = ๐Ÿ˜ := by sorry theorem MyNat.mul_succ : โˆ€ (n m : MyNat), n * m++ = n * m + n := by sorry theorem MyNat.mul_comm : โˆ€ (n m : MyNat), n * m = m * n := by sorry -- Lemma 2.3.3 theorem MyNat.mul_pos {n m : MyNat} (hn : n.is_positive) (hm : m.is_positive) : (n * m).is_positive := by sorry theorem MyNat.mul_eq_zero {n m : MyNat} : n * m = ๐Ÿ˜ โ†” n = ๐Ÿ˜ โˆจ m = ๐Ÿ˜ := by sorry -- Proposition 2.3.4 theorem MyNat.mul_distrib (a b c : MyNat) : a * (b + c) = a * b + a * c := by have : โˆ€ (c : MyNat), a * (b + c) = a * b + a * c := by have hbase : a * (b + ๐Ÿ˜) = a * b + a * ๐Ÿ˜ := by rw [MyNat.add_zero] rw [MyNat.mul_zero] rw [MyNat.add_zero] have hind : โˆ€ {c : MyNat}, a * (b + c) = a * b + a * c โ†’ a * (b + c++) = a * b + a * (c++) := by intro c hc rw [MyNat.add_succ b c] rw [MyNat.mul_succ a (b + c)] rw [MyNat.mul_succ a c] rw [โ† MyNat.add_assoc (a * b) (a * c) a] rw [โ† hc] exact MyNat.induction hbase hind exact this c theorem MyNat.mul_distrib' (a b c : MyNat) : (b + c) * a = b * a + c * a := by rw [MyNat.mul_comm (b + c) a] rw [MyNat.mul_distrib a b c] rw [MyNat.mul_comm a b] rw [MyNat.mul_comm a c] -- Proposition 2.3.5 theorem MyNat.mul_assoc : โˆ€ (a b c : MyNat), (a * b) * c = a * (b * c) := by sorry -- Proposition 2.3.6 theorem MyNat.mul_lt_mul_of_pos_right {a b c : MyNat} (hab : a < b) (hc : c.is_positive) : a * c < b * c := by rcases MyNat.lt_iff_eq_add.mp hab with โŸจd, hd, hโŸฉ have h' : b * c = a * c + d * c := by rw [h] rw [MyNat.mul_distrib'] have hdcpos : (d * c).is_positive := MyNat.mul_pos hd hc exact MyNat.lt_iff_eq_add.mpr โŸจd * c, hdcpos, h'โŸฉ -- Corollary 2.3.7 theorem MyNat.mul_cancel_of_pos (a b : MyNat) {c : MyNat} (hc : c โ‰  ๐Ÿ˜) (h : a * c = b * c): a = b := by rcases MyNat.order_trichotomy a b with (h | h | h) ยท rcases h with โŸจhlt, hne, hngtโŸฉ by_contra have : a * c < b * c := MyNat.mul_lt_mul_of_pos_right hlt hc exact this.right h.symm ยท rcases h with โŸจhngt, heq, hnltโŸฉ exact heq ยท rcases h with โŸจhnlt, hne, hgtโŸฉ by_contra have : b * c < a * c := MyNat.mul_lt_mul_of_pos_right hgt hc exact this.right h -- Proposition 2.3.9 theorem MyNat.euclid_division (n : MyNat) {q : MyNat} (hqpos : q.is_positive) : โˆƒ (m r : MyNat), ๐Ÿ˜ โ‰ค r โˆง r < q โˆง n = m * q + r := by sorry -- Definition 2.3.11 axiom MyNat.exp : MyNat โ†’ MyNat โ†’ MyNat infixr:80 " ^ " => MyNat.exp axiom MyNat.exp_zero : โˆ€ (m : MyNat), m ^ ๐Ÿ˜ = ๐Ÿ™ axiom MyNat.exp_succ : โˆ€ (m n : MyNat), m ^ (n++) = m ^ n * m -- Example 2.3.12 theorem MyNat.exp_one (x : MyNat) : x ^ ๐Ÿ™ = x := by rw [MyNat.exp_succ x ๐Ÿ˜] rw [MyNat.exp_zero x] rw [MyNat.succ_mul ๐Ÿ˜ x] rw [MyNat.zero_mul x] rw [MyNat.zero_add x] theorem MyNat.exp_two (x : MyNat) : x ^ ๐Ÿš = x * x := by rw [MyNat.exp_succ x ๐Ÿ™] rw [MyNat.exp_one x] section Exercises -- Exercise 2.3.4 example (a b : MyNat) : (a + b) ^ ๐Ÿš = a ^ ๐Ÿš + ๐Ÿš * a * b + b ^ ๐Ÿš := by sorry end Exercises