1-- The embedding of the natural numbers in the integers: order, subtraction,2-- distance, minimum, and maximum3-- Part of Cumulus, the Grace17 mathematics library.4-- Copyright (c) 2026 Grant Passmore.5-- Released under the Apache License 2.0. See LICENSE in the repository root.6-- Authors: Grant Passmore78module Grace.Cumulus.Int.Embedding9import MinMax10import Nat.Distance1112theorem integerOfNat.one13shows integerOfNat(1) = integerOne14proof15unfold integerOne16rfl1718theorem integerOfNat.add_one (n : Nat)19shows integerOfNat(n +1) = integerOfNat(n) +120proof21have sum := integerOfNat.add at n, 122rw [sum, integerOfNat.one]23rfl2425theorem integerOfNat.injective_iff (a b : Nat)26shows integerOfNat(a) = integerOfNat(b) ↔ a = b27proof28constructor29 . intro same30exact integerOfNat.injective with same31 . intro same32rw same33rfl3435theorem integerOfNat.eq_zero_iff (n : Nat)36shows integerOfNat(n) = integerZero ↔ n =037proof38rw← integerOfNat.zero39exact integerOfNat.injective_iff at n, 04041theorem integerOfNat.positive_iff (n : Nat)42shows integerZero < integerOfNat(n) ↔0 < n43proof44rw← integerOfNat.zero45exact integerLess.ofNat_iff at0, n4647theorem integerClass.difference (a b : Nat)48shows integerClass(a, b) = integerOfNat(a) - integerOfNat(b)49proof50have negated := integerOfNat.neg at b51have shape : integerOfNat(a) - integerOfNat(b) =52 integerOfNat(a) + (-integerOfNat(b))53ring54rw [shape, negated]55unfold integerOfNat56unfold integerNegativeOfNat57rw integerAddValue.classes58unfold integerClassSum59haveleft:= add.right_unit at a60haveright:= add.left_unit at b61rw [left, right]62rfl6364theorem integerNegativeOfNat.eq_neg (n : Nat)65shows integerNegativeOfNat(n) = -integerOfNat(n)66proof67 symm68exact integerOfNat.neg with*6970theorem integerNegativeOfNat.add (a b : Nat)71shows72 integerNegativeOfNat(a + b) =73 integerNegativeOfNat(a) + integerNegativeOfNat(b)74proof75have sum := integerOfNat.add at a, b76rw [integerNegativeOfNat.eq_neg, integerNegativeOfNat.eq_neg]77rw [integerNegativeOfNat.eq_neg, sum]78ring7980theorem integerNegativeOfNat.le_iff (a b : Nat)81shows integerNegativeOfNat(a) ≤ integerNegativeOfNat(b) ↔ b ≤ a82proof83have flipped := integerLe.neg at integerOfNat(b), integerOfNat(a)84have bridge := integerLe.ofNat_iff at b, a85rw [integerNegativeOfNat.eq_neg, integerNegativeOfNat.eq_neg]86constructor87 . intro below88have lifted := flipped.backward with below89exact bridge.forward with lifted90 . intro below91have lifted := bridge.backward with below92exact flipped.forward with lifted9394theorem integerOfNat.sub (a b : Nat)95requires below : b ≤ a96shows integerOfNat(a - b) = integerOfNat(a) - integerOfNat(b)97proof98have subNat := sub.closed at a, b99have cancel := sub.add_cancel with below100have sum := integerOfNat.add at a - b, b101rw [← cancel, sum]102have restore : (a - b) + b - b = a - b byarith103rw restore104ring105106theorem integerOfNat.sub_of_le (a b : Nat)107requires below : a ≤ b108shows integerOfNat(a) - integerOfNat(b) = integerNegativeOfNat(b - a)109proof110have lifted := integerOfNat.sub at b, a with below111rw [integerNegativeOfNat.eq_neg, lifted]112ring113114theorem integerNatAbs.ofNat_sub (a b : Nat)115shows integerNatAbs(integerOfNat(a) - integerOfNat(b)) = natDist(a, b)116proof117have total := LessEqual.total at b, a118cases total with below | above119 . have lifted := integerOfNat.sub with below120have subNat := sub.closed at a, b121have value := natDist.of_ge with below122rw [← lifted, integerNatAbs.ofNat, value]123rfl124 . have lifted := integerOfNat.sub_of_le with above125have subNat := sub.closed at b, a126have value := natDist.of_le with above127rw [lifted, integerNatAbs.ofNegativeNat, value]128rfl129130theorem integerAbs.ofNat_sub (a b : Nat)131shows132 integerAbs(integerOfNat(a) - integerOfNat(b)) = integerOfNat(natDist(a, b))133proof134have difference := integerSubValue.integer at integerOfNat(a), integerOfNat(b)135rw [integerAbs.value, integerNatAbs.ofNat_sub]136rfl137138theorem integerOfNat.natMin (a b : Nat)139shows140 integerOfNat(natMin(a, b)) = integerMin(integerOfNat(a), integerOfNat(b))141proof142have total := LessEqual.total at a, b143cases total with below | above144 . have lifted := integerLe.ofNat_iff.backward with below145haveleft:= natMin.of_le with below146haveright:= integerMin.of_le with lifted147rw [left, right]148rfl149 . have lifted := integerLe.ofNat_iff.backward with above150haveleft:= natMin.of_ge with above151haveright:= integerMin.of_ge with lifted152rw [left, right]153rfl154155theorem integerOfNat.natMax (a b : Nat)156shows157 integerOfNat(natMax(a, b)) = integerMax(integerOfNat(a), integerOfNat(b))158proof159have total := LessEqual.total at a, b160cases total with below | above161 . have lifted := integerLe.ofNat_iff.backward with below162haveleft:= natMax.of_le with below163haveright:= integerMax.of_le with lifted164rw [left, right]165rfl166 . have lifted := integerLe.ofNat_iff.backward with above167haveleft:= natMax.of_ge with above168haveright:= integerMax.of_ge with lifted169rw [left, right]170rfl171172theorem integerOfNat.monotone (a b : Nat)173requires below : a ≤ b174shows integerOfNat(a) ≤ integerOfNat(b)175proof176exact integerLe.ofNat_iff.backward with below177178theorem integerOfNat.strict_monotone (a b : Nat)179requires below : a < b180shows integerOfNat(a) < integerOfNat(b)181proof182exact integerLess.ofNat_iff.backward with below183184theorem integerNatAbs.le_of_le (x y : Integer)185requires nonnegative : 0≤ x186requires below : x ≤ y187shows integerNatAbs(x) ≤ integerNatAbs(y)188proof189have xNat := integerNatAbs.natural at x190have yNat := integerNatAbs.natural at y191have bound := integerAbs.monotone_nonneg with nonnegative, below192rw [integerAbs.value, integerAbs.value] at bound193exact integerLe.ofNat_iff.forward with bound194