1-- Order on rational quotient classes2-- Part of Cumulus, the Grace17 mathematics library.3-- Copyright (c) 2026 Grant Passmore.4-- Released under the Apache License 2.0. See LICENSE in the repository root.5-- Authors: Grant Passmore67module Grace.Cumulus.Rat.Order8import Defs9import Cumulus.Order1011-- For representatives ((a,b),m) and ((c,d),n), the intended fractions are12-- (a-b)/m and (c-d)/n. Cross multiplication uses naturals only:13-- n*a + m*d < m*c + n*b.14predicate rationalRepresentativeLess (u v : Set) :=15∃ a ∈ ℕ, ∃ b ∈ ℕ,16∃ m ∈ positiveNaturals, ∃ c ∈ ℕ,17∃ d ∈ ℕ, ∃ n ∈ positiveNaturals,18 u = ((a, b), m) ∧ v = ((c, d), n) ∧19 n * a + m * d < m * c + n * b2021-- On displayed representatives, rational order is exactly the familiar22-- cross-multiplication inequality. This is the arithmetic boundary used by23-- the quotient-level order proofs below.24theorem rationalRepresentativeLess.pair (a b m c d n : Nat)25requires mNonzero : m ≠026requires nNonzero : n ≠027shows rationalRepresentativeLess(((a, b), m), ((c, d), n)) ↔28 n * a + m * d < m * c + n * b29proof30constructor31 . intro less32obtain⟨wa, waNat, wb, wbNat, wm, wmPositive, wc, wcNat, wd, wdNat, wn, wnPositive, leftShape, rightShape, inequality⟩:= less33obtain⟨numeratorLeft, denominatorLeft⟩:= orderedPair.injective with leftShape34obtain⟨numeratorRight, denominatorRight⟩:= orderedPair.injective with rightShape35obtain⟨aEquals, bEquals⟩:= orderedPair.injective with numeratorLeft36obtain⟨cEquals, dEquals⟩:= orderedPair.injective with numeratorRight37 simpa [aEquals, bEquals, denominatorLeft, cEquals, dEquals, denominatorRight] using inequality38 . intro inequality39have mPositive : m ∈ positiveNaturals bysimp [nat.omega, positiveNaturals.membership]40have nPositive : n ∈ positiveNaturals bysimp [nat.omega, positiveNaturals.membership]41unfold rationalRepresentativeLess42refine⟨a, _, b, _, m, mPositive, c, _, d, _, n, nPositive, rfl, rfl, inequality⟩43 . settlewith nat.omega44 . settlewith nat.omega45 . settlewith nat.omega46 . settlewith nat.omega4748-- Replacing the right-hand fraction by an equivalent representative preserves49-- strict comparison. The certificate scales the comparison and equivalence50-- equation, combines them additively, then cancels the positive denominator.51theorem rationalRepresentativeLess.transport_right_cross (a b m c d n e f p : Nat)52requires mNonzero : m ≠053requires nNonzero : n ≠054requires pNonzero : p ≠055requires less : n * a + m * d < m * c + n * b56requires equivalent : p * c + n * f = n * e + p * d57shows p * a + m * f < m * e + p * b58proof59have scaledLess := Less.mul_left with pNonzero, less60ring_nfat scaledLess61have scaledEquivalent : m * (p * c + n * f) = m * (n * e + p * d) bylinear_combination m * equivalent62ring_nfat scaledEquivalent63have combined := Less.replace_right with scaledLess, scaledEquivalent64have scaledTarget : n * (p * a + m * f) < n * (m * e + p * b)65ring_nfat combined66ring_nf67exact combined68exact Less.mul_left_cancel_positive with nNonzero, scaledTarget6970-- Replacing the left-hand fraction by an equivalent representative preserves71-- strict comparison. Clearing denominators reduces this to an ordered-additive72-- replacement, followed by cancellation of the positive common factor.73theorem rationalRepresentativeLess.transport_left_cross (a b m c d n e f p : Nat)74requires mNonzero : m ≠075requires nNonzero : n ≠076requires pNonzero : p ≠077requires equivalent : p * a + m * f = m * e + p * b78requires less : n * a + m * d < m * c + n * b79shows n * e + p * d < p * c + n * f80proof81have scaledLess := Less.mul_left with pNonzero, less82ring_nfat scaledLess83have scaledEquivalent : n * (p * a + m * f) = n * (m * e + p * b) bylinear_combination n * equivalent84ring_nfat scaledEquivalent85have combined := Less.replace_left with scaledEquivalent, scaledLess86have scaledTarget : m * (n * e + p * d) < m * (p * c + n * f)87ring_nfat combined88ring_nf89exact combined90exact Less.mul_left_cancel_positive with mNonzero, scaledTarget9192-- Strict comparison of displayed representatives is transitive. The middle93-- representative disappears by scaling both comparisons to common products,94-- composing the resulting inequalities, and cancelling positive factors.95theorem rationalRepresentativeLess.transitive_cross (a b m c d n e f p : Nat)96requires mNonzero : m ≠097requires nNonzero : n ≠098requires pNonzero : p ≠099requiresleft : n * a + m * d < m * c + n * b100requiresright : p * c + n * f < n * e + p * d101shows p * a + m * f < m * e + p * b102proof103have scaledLeft := Less.mul_left with pNonzero, left104ring_nfat scaledLeft105have scaledRight := Less.mul_left with mNonzero, right106ring_nfat scaledRight107have combined := Less.cross_transitive with scaledLeft, scaledRight108have scaledTarget : n * (p * a + m * f) < n * (m * e + p * b)109ring_nfat combined110ring_nf111exact combined112exact Less.mul_left_cancel_positive with nNonzero, scaledTarget113114theorem rationalRepresentativeLess.transport_right (u v w : Set)115requires hu : u ∈ rationalRepresentatives116requires hv : v ∈ rationalRepresentatives117requires hw : w ∈ rationalRepresentatives118requires less : rationalRepresentativeLess(u, v)119requires equivalent : relates(rationalEquivalent, v, w)120shows rationalRepresentativeLess(u, w)121proof122obtain⟨a, aNat, b, bNat, m, mNat, mNonzero, uShape⟩:= rationalRepresentatives.coordinates with hu123obtain⟨c, cNat, d, dNat, n, nNat, nNonzero, vShape⟩:= rationalRepresentatives.coordinates with hv124obtain⟨e, eNat, f, fNat, p, pNat, pNonzero, wShape⟩:= rationalRepresentatives.coordinates with hw125have displayedLess : rationalRepresentativeLess(126 ((a, b), m), ((c, d), n))127 simpa [uShape, vShape] using less128have displayedEquivalent : relates(129 rationalEquivalent, ((c, d), n), ((e, f), p))130 simpa [vShape, wShape] using equivalent131have crossLess := rationalRepresentativeLess.pair.forward with mNonzero, nNonzero, displayedLess132have crossEquivalent := rationalEquivalent.relates_representatives.forward with133 nNonzero, pNonzero, displayedEquivalent134have transported := rationalRepresentativeLess.transport_right_cross with135 mNonzero, nNonzero, pNonzero, crossLess, crossEquivalent136have displayedResult := rationalRepresentativeLess.pair.backward with mNonzero, pNonzero, transported137 simpa [uShape, wShape] using displayedResult138139theorem rationalRepresentativeLess.transport_left (u v w : Set)140requires hu : u ∈ rationalRepresentatives141requires hv : v ∈ rationalRepresentatives142requires hw : w ∈ rationalRepresentatives143requires equivalent : relates(rationalEquivalent, u, w)144requires less : rationalRepresentativeLess(u, v)145shows rationalRepresentativeLess(w, v)146proof147obtain⟨a, aNat, b, bNat, m, mNat, mNonzero, uShape⟩:= rationalRepresentatives.coordinates with hu148obtain⟨c, cNat, d, dNat, n, nNat, nNonzero, vShape⟩:= rationalRepresentatives.coordinates with hv149obtain⟨e, eNat, f, fNat, p, pNat, pNonzero, wShape⟩:= rationalRepresentatives.coordinates with hw150have displayedEquivalent : relates(151 rationalEquivalent, ((a, b), m), ((e, f), p))152 simpa [uShape, wShape] using equivalent153have displayedLess : rationalRepresentativeLess(154 ((a, b), m), ((c, d), n))155 simpa [uShape, vShape] using less156have crossEquivalent := rationalEquivalent.relates_representatives.forward with157 mNonzero, pNonzero, displayedEquivalent158have crossLess := rationalRepresentativeLess.pair.forward with mNonzero, nNonzero, displayedLess159have transported := rationalRepresentativeLess.transport_left_cross with160 mNonzero, nNonzero, pNonzero, crossEquivalent, crossLess161have displayedResult := rationalRepresentativeLess.pair.backward with pNonzero, nNonzero, transported162 simpa [wShape, vShape] using displayedResult163164theorem rationalRepresentativeLess.transport (u v uPrime vPrime : Set)165requires hu : u ∈ rationalRepresentatives166requires hv : v ∈ rationalRepresentatives167requires huPrime : uPrime ∈ rationalRepresentatives168requires hvPrime : vPrime ∈ rationalRepresentatives169requires leftEquivalent : relates(rationalEquivalent, u, uPrime)170requires rightEquivalent : relates(rationalEquivalent, v, vPrime)171requires less : rationalRepresentativeLess(u, v)172shows rationalRepresentativeLess(uPrime, vPrime)173proof174have movedLeft := rationalRepresentativeLess.transport_left with hu, hv, huPrime, leftEquivalent, less175exact rationalRepresentativeLess.transport_right with huPrime, hv, hvPrime, movedLeft, rightEquivalent176177theorem rationalRepresentativeLess.transitive (u v w : Set)178requires hu : u ∈ rationalRepresentatives179requires hv : v ∈ rationalRepresentatives180requires hw : w ∈ rationalRepresentatives181requiresleft : rationalRepresentativeLess(u, v)182requiresright : rationalRepresentativeLess(v, w)183shows rationalRepresentativeLess(u, w)184proof185obtain⟨a, aNat, b, bNat, m, mNat, mNonzero, uShape⟩:= rationalRepresentatives.coordinates with hu186obtain⟨c, cNat, d, dNat, n, nNat, nNonzero, vShape⟩:= rationalRepresentatives.coordinates with hv187obtain⟨e, eNat, f, fNat, p, pNat, pNonzero, wShape⟩:= rationalRepresentatives.coordinates with hw188have displayedLeft : rationalRepresentativeLess(189 ((a, b), m), ((c, d), n))190 simpa [uShape, vShape] usingleft191have displayedRight : rationalRepresentativeLess(192 ((c, d), n), ((e, f), p))193 simpa [vShape, wShape] usingright194have leftCross := rationalRepresentativeLess.pair.forward with mNonzero, nNonzero, displayedLeft195have rightCross := rationalRepresentativeLess.pair.forward with nNonzero, pNonzero, displayedRight196have cross := rationalRepresentativeLess.transitive_cross with197 mNonzero, nNonzero, pNonzero, leftCross, rightCross198have displayedResult := rationalRepresentativeLess.pair.backward with mNonzero, pNonzero, cross199 simpa [uShape, wShape] using displayedResult200201predicate rationalLessWitness (p : Set) :=202∃ q ∈ ℚ, ∃ r ∈ ℚ,203 p = (q, r) ∧∃ u ∈ q, ∃ v ∈ r,204 rationalRepresentativeLess(u, v)205206-- This graph is bounded by rationals × rationals, hence is a set.207-- Well-definedness under rationalEquivalent is the next arithmetic theorem;208-- the definition itself already exposes the exact representative semantics.209def rationalLess : Set:=210 { p ∈ ℚ × ℚ | rationalLessWitness(p) }211212theorem rationalLess.bounded213shows (rationalLess ⊆ ℚ × ℚ)214proof215simp216217theorem rationalLess.relation218shows RelationOn(rationalLess, ℚ)219proof220unfold RelationOn221exact rationalLess.bounded222223instance rationalLess.operation224shows LessOperation(ℚ, rationalLess)225proof226unfold LessOperation227exact rationalLess.relation228229notationinfix50"<"=> relates via LessOperation(ℚ, _) forRational230231theorem rationalLess.of_members (q r u v : Set)232requires qRational : q ∈ ℚ233requires rRational : r ∈ ℚ234requires hu : u ∈ q235requires hv : v ∈ r236requires less : rationalRepresentativeLess(u, v)237shows relates(rationalLess, q, r)238proof239unfold relates240apply rationalLess.membership.backward241have bounded := product.pair with qRational, rRational242constructor243 . exact bounded244 . unfold rationalLessWitness245refine⟨q, qRational, r, rRational, rfl, u, hu, v, hv, less⟩246247-- Equivalent rational representatives denote the same quotient point, so a248-- strict representative comparison between them is impossible.249theorem rationalRepresentativeLess.not_equivalent (u v : Set)250requires hu : u ∈ rationalRepresentatives251requires hv : v ∈ rationalRepresentatives252requires equivalent : relates(rationalEquivalent, u, v)253shows¬rationalRepresentativeLess(u, v)254proof255intro less256obtain⟨a, aNat, b, bNat, m, mNat, mNonzero, uShape⟩:= rationalRepresentatives.coordinates with hu257obtain⟨c, cNat, d, dNat, n, nNat, nNonzero, vShape⟩:= rationalRepresentatives.coordinates with hv258have displayedEquivalent : relates(259 rationalEquivalent, ((a, b), m), ((c, d), n))260 simpa [uShape, vShape] using equivalent261have displayedLess : rationalRepresentativeLess(262 ((a, b), m), ((c, d), n))263 simpa [uShape, vShape] using less264have crossEqual := rationalEquivalent.relates_representatives.forward with265 mNonzero, nNonzero, displayedEquivalent266have crossLess := rationalRepresentativeLess.pair.forward with mNonzero, nNonzero, displayedLess267rw crossEqual at crossLess268exact Less.irreflexive with crossLess269270-- Elimination view for rational order. Client proofs receive representatives271-- together with their class memberships and ambient representative facts;272-- the quotient encoding stays behind this boundary.273theorem rationalLess.representatives (q r : Set)274requires qRational : q ∈ ℚ275requires rRational : r ∈ ℚ276requires less : relates(rationalLess, q, r)277shows∃ u ∈ q, u ∈ rationalRepresentatives ∧278∃ v ∈ r, v ∈ rationalRepresentatives ∧ rationalRepresentativeLess(u, v)279proof280unfold relates at less281obtain⟨_, left, _, right, _, shape, u, uMember, v, vMember, representativeLess⟩:= rationalLess.membership.forward with less282obtain⟨leftShape, rightShape⟩:= orderedPair.injective with shape283rw← leftShape at uMember284rw← rightShape at vMember285have uRepresentative :=Rational.representative with qRational, uMember286have vRepresentative :=Rational.representative with rRational, vMember287refine⟨u, uMember, uRepresentative, v, vMember, vRepresentative, representativeLess⟩288289theorem rationalLess.irreflexive_on290shows IrreflexiveOn(ℚ, rationalLess)291proof292intros q qRational less293obtain⟨u, uInQ, uRepresentative, v, vInQ, vRepresentative, representativeLess⟩:= rationalLess.representatives with294 qRational, qRational, less295have equivalent :=Rational.members_related with qRational, uInQ, vInQ296exact rationalRepresentativeLess.not_equivalent with297 uRepresentative, vRepresentative, equivalent, representativeLess298299theorem rationalLess.transitive_on300shows TransitiveOn(ℚ, rationalLess)301proof302intros q qRational r rRational s sRational lessQR lessRS303obtain⟨u, uInQ, uRepresentative, v, vInR, vRepresentative, representativeLessUV⟩:= rationalLess.representatives with304 qRational, rRational, lessQR305obtain⟨vPrime, vPrimeInR, vPrimeRepresentative, w, wInS, wRepresentative, representativeLessVW⟩:= rationalLess.representatives with306 rRational, sRational, lessRS307have middleEquivalent :=Rational.members_related with rRational, vInR, vPrimeInR308have aligned := rationalRepresentativeLess.transport_right with309 uRepresentative, vRepresentative, vPrimeRepresentative, representativeLessUV, middleEquivalent310have representativeLessUW := rationalRepresentativeLess.transitive with311 uRepresentative, vPrimeRepresentative, wRepresentative, aligned, representativeLessVW312exact rationalLess.of_members with qRational, sRational, uInQ, wInS, representativeLessUW313314theorem rationalLess.connected_on315shows ConnectedOn(ℚ, rationalLess)316proof317intros q qRational r rRational distinct318obtain⟨u, uInQ, uRepresentative⟩:=Rational.some_representative with qRational319obtain⟨v, vInR, vRepresentative⟩:=Rational.some_representative with rRational320obtain⟨a, aNat, b, bNat, m, mNat, mNonzero, uShape⟩:= rationalRepresentatives.coordinates with uRepresentative321obtain⟨c, cNat, d, dNat, n, nNat, nNonzero, vShape⟩:= rationalRepresentatives.coordinates with vRepresentative322have leftCrossNat : Nat(n * a + m * d) bytypecheck323have rightCrossNat : Nat(m * c + n * b) bytypecheck324have comparison := Less.trichotomy with leftCrossNat, rightCrossNat325rcases comparison with less | equal | greater326 . left327have representativeLess : rationalRepresentativeLess(u, v)328 simpa [uShape, vShape] using329 rationalRepresentativeLess.pair.backward with mNonzero, nNonzero, less330exact rationalLess.of_members with qRational, rRational, uInQ, vInR, representativeLess331 . exfalso332have representativeEquivalent : relates(rationalEquivalent, u, v)333 simpa [uShape, vShape] using334 rationalEquivalent.relates_representatives.backward with mNonzero, nNonzero, equal335apply distinct336exactRational.eq_of_related_members with qRational, rRational, uInQ, vInR, representativeEquivalent337 . right338have representativeGreater : rationalRepresentativeLess(v, u)339 simpa [uShape, vShape] using340 rationalRepresentativeLess.pair.backward with nNonzero, mNonzero, greater341exact rationalLess.of_members with rRational, qRational, vInR, uInQ, representativeGreater342343theorem rationalLess.strict_order344shows StrictOrder(ℚ, rationalLess)345proof346unfold StrictOrder347have relation := rationalLess.relation348refine⟨relation, rationalLess.irreflexive_on, rationalLess.transitive_on⟩349350theorem rationalLess.strict_linear_order351shows StrictLinearOrder(ℚ, rationalLess)352proof353refine⟨rationalLess.strict_order, rationalLess.connected_on⟩354355-- A strict comparison of representatives descends to a comparison of their356-- rational equivalence classes. No representative is chosen by the kernel:357-- the two displayed representatives are explicit witnesses in their classes.358theorem rationalLess.of_representatives (a b m c d n : Nat)359requires mNonzero : m ≠0360requires nNonzero : n ≠0361requires crossLess : n * a + m * d < m * c + n * b362shows relates(363 rationalLess,364 ⟦((a, b), m)⟧[rationalRepresentatives, rationalEquivalent],365 ⟦((c, d), n)⟧[rationalRepresentatives, rationalEquivalent])366proof367have leftRepresentative := rationalRepresentatives.pair at a, b, m with mNonzero368have rightRepresentative := rationalRepresentatives.pair at c, d, n with nNonzero369have equivalence := rationalEquivalent.equivalence370have leftRational := quotient.contains_class with equivalence, leftRepresentative371have rightRational := quotient.contains_class with equivalence, rightRepresentative372have leftSelf := equivalenceClass.self with equivalence, leftRepresentative373have rightSelf := equivalenceClass.self with equivalence, rightRepresentative374have representativeLess := rationalRepresentativeLess.pair.backward with mNonzero, nNonzero, crossLess375exact rationalLess.of_members with leftSelf, rightSelf, representativeLess376