pith. machine review for the scientific record. sign in
theorem

toNat_mul

proved
show as:
view math explainer →
module
IndisputableMonolith.Foundation.ArithmeticFromLogic
domain
Foundation
line
274 · github
papers citing
none yet

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

Tracked in the explainer inventory; generation is lazy so crawlers do not trigger LLM jobs.

open explainer

depends on

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