theorem square_diff_nat (a b: ℕ) (h: b ≤ a) : a ^ 2 - b ^ 2 = (a + b) * (a - b) := by
calc
a ^ 2 - b ^ 2
= a * a - b * b := by repeat rw [Nat.pow_two]
_ = a * a - b * b + 0 := by rw [add_zero (a * a - b * b)]
_ = a * a - b * b + (a * b - a * b) := by rw [←Nat.sub_self (a * b)]
have h1: a * b ≤ a * b := by rfl
have h2: b * b ≤ a * a := Nat.mul_self_le_mul_self h
calc
_ = a * a + (a * b - a * b) - b * b := by rw[←Nat.sub_add_comm h2]
_ = a * a + a * b - a * b - b * b := by rw [← Nat.add_sub_assoc h1]
_ = a * (a + b) - (b * (a + b)) := by rw[←Nat.mul_add, Nat.sub_sub, ← Nat.add_mul, Nat.mul_comm (a + b) b]
_ = (a + b) * (a - b) := by rw [← Nat.sub_mul, Nat.mul_comm]