theorem
proved
toNat_mul
show as:
view math explainer →
open explainer
Generate a durable explainer page for this declaration.
open lean source
IndisputableMonolith.Foundation.ArithmeticFromLogic on GitHub at line 274.
browse module
All declarations in this module, on Recognition.
explainer page
depends on
-
step -
via -
LogicNat -
mul_succ -
mul_zero -
succ -
toNat -
toNat_add -
toNat_succ -
toNat_zero -
identity -
succ -
identity
used by
formal source
271/-- **Recovery theorem (multiplication)**: the multiplication
272`LogicNat` carries agrees with `Nat` multiplication under the
273equivalence. -/
274theorem toNat_mul (a b : LogicNat) :
275 toNat (a * b) = toNat a * toNat b := by
276 induction b with
277 | identity =>
278 show toNat (a * zero) = toNat a * toNat zero
279 rw [mul_zero, toNat_zero, Nat.mul_zero]
280 | step b ih =>
281 show toNat (a * succ b) = toNat a * toNat (succ b)
282 rw [mul_succ, toNat_succ, toNat_add, ih, Nat.mul_succ]
283
284/-- Left cancellation: `a + b = a + c ⇒ b = c`. Proved by transferring
285to `Nat` via the recovery isomorphism. -/
286theorem add_left_cancel {a b c : LogicNat} (h : a + b = a + c) : b = c := by
287 have hcast := congrArg toNat h
288 rw [toNat_add, toNat_add] at hcast
289 have hnat : toNat b = toNat c := by omega
290 have := congrArg fromNat hnat
291 rw [fromNat_toNat, fromNat_toNat] at this
292 exact this
293
294/-- Right cancellation: `a + c = b + c ⇒ a = b`. -/
295theorem add_right_cancel {a b c : LogicNat} (h : a + c = b + c) : a = b := by
296 rw [add_comm a c, add_comm b c] at h
297 exact add_left_cancel h
298
299/-- Transfer principle: an equation in `LogicNat` holds iff it holds
300under `toNat`. This is the workhorse for proofs that route through
301`omega` on `Nat`. -/
302theorem eq_iff_toNat_eq {a b : LogicNat} : a = b ↔ toNat a = toNat b := by
303 constructor
304 · exact congrArg toNat