1-- The laws of ordinal arithmetic: associativity of addition and2-- multiplication, left distributivity, and the two power laws, each by3-- transfinite induction on the right argument4-- Part of Cumulus, the Grace17 mathematics library.5-- Copyright (c) 2026 Grant Passmore.6-- Released under the Apache License 2.0. See LICENSE in the repository root.7-- Authors: Grant Passmore89module Grace.Cumulus.Set.Ordinal.ArithmeticLaws10import Monotone1112theorem ordinalAdd.associative (α β : Ordinal, γ : Set)13shows γ ∈Ordinal→ (α + β) + γ = α + (β + γ)14proof15induction γ using membership16intros current ih hCurrent17have βOrdinal : β ∈Ordinalbyassumption18have sumOrdinal := ordinalAdd.ordinal at α, β with βOrdinal19havecases:=Ordinal.cases with hCurrent20casescaseswith zero | rest21 . rw zero22rw← nat.zero23have first := ordinalAdd.zero at α + β24have second := ordinalAdd.zero at β25rw [first, second]26rfl27 . cases rest with successor | limit28 . obtain⟨δ, hδ, shape⟩:= successor29rw← shape30have δOrdinal:=Ordinal.member with hCurrent, hδ31have step := ih with hδ, δOrdinal32have innerOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal33have first := ordinalAdd.next at α + β, δ34have second := ordinalAdd.next at β, δ35have third := ordinalAdd.next at α, β + δ36rw [first, second, third, step]37rfl38 . have innerLimit := ordinalAdd.limit_right at β, current with limit39have innerOrdinal := ordinalAdd.ordinal at β, current with hCurrent40apply Subset.antisymmetric41 . intros x hx42obtain⟨δ, hδ, hxδ⟩:=43 ordinalAdd.limit_membership.forward at x, α + β, current44with limit, hx45have δOrdinal:=Ordinal.member with hCurrent, hδ46have step := ih with hδ, δOrdinal47rw step at hxδ48apply ordinalAdd.limit_membership.backward at x, α, β + current49with innerLimit50witness β + δ51constructor52 . exact ordinalAdd.monotone at β, δ, current with hCurrent, hδ53 . exact hxδ54 . intros x hx55obtain⟨ε, hε, hxε⟩:=56 ordinalAdd.limit_membership.forward at x, α, β + current57with innerLimit, hx58obtain⟨δ, hδ, hεδ⟩:=59 ordinalAdd.limit_membership.forward at ε, β, current with limit, hε60have δOrdinal:=Ordinal.member with hCurrent, hδ61have stageOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal62have εOrdinal:=Ordinal.member with stageOrdinal, hεδ63have grows := ordinalAdd.monotone at α, ε, β + δ with stageOrdinal, hεδ64have sumStage := ordinalAdd.ordinal at α, β + δ with stageOrdinal65have included :=Ordinal.member_subset with sumStage, grows66have step := ih with hδ, δOrdinal67apply ordinalAdd.limit_membership.backward at x, α + β, current68with limit69witness δ70constructor71 . exact hδ72 . rw step73exact included with x, hxε7475theorem ordinalMul.distributive (α β : Ordinal, γ : Set)76shows γ ∈Ordinal→ α * (β + γ) = α * β + α * γ77proof78induction γ using membership79intros current ih hCurrent80have αOrdinal : α ∈Ordinalbyassumption81have βOrdinal : β ∈Ordinalbyassumption82have productOrdinal := ordinalMul.ordinal at α, β with βOrdinal83havecases:=Ordinal.cases with hCurrent84casescaseswith zero | rest85 . rw zero86rw← nat.zero87have first := ordinalAdd.zero at β88have second := ordinalMul.zero at α89have third := ordinalAdd.zero at α * β90rw nat.zero at third91rw [first, second, third]92rfl93 . cases rest with successor | limit94 . obtain⟨δ, hδ, shape⟩:= successor95rw← shape96have δOrdinal:=Ordinal.member with hCurrent, hδ97have step := ih with hδ, δOrdinal98have sumOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal99have stageOrdinal := ordinalMul.ordinal at α, δ with δOrdinal100have first := ordinalAdd.next at β, δ101have second := ordinalMul.next at α, β + δ102have third := ordinalMul.next at α, δ103have fourth := ordinalAdd.associative at α * β, α * δ, α with αOrdinal104rw [first, second, step, third, fourth]105rfl106 . have zeroCases :=Ordinal.trichotomy at∅withOrdinal.empty, α, αOrdinal107cases zeroCases with positive | rest2108 . have innerLimit := ordinalAdd.limit_right at β, current with limit109have productLimit := ordinalMul.limit_right at α, current110with positive, limit111have innerOrdinal := ordinalAdd.ordinal at β, current with hCurrent112have productCurrent := ordinalMul.ordinal at α, current with hCurrent113apply Subset.antisymmetric114 . intros x hx115obtain⟨ε, hε, hxε⟩:=116 ordinalMul.limit_membership.forward at x, α, β + current117with innerLimit, hx118obtain⟨δ, hδ, hεδ⟩:=119 ordinalAdd.limit_membership.forward at ε, β, current with limit, hε120have δOrdinal:=Ordinal.member with hCurrent, hδ121have sumOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal122have εOrdinal:=Ordinal.member with sumOrdinal, hεδ123have included := ordinalMul.subset_monotone at α, ε, β + δ124with sumOrdinal, hεδ125have step := ih with hδ, δOrdinal126have inStage : x ∈ α * (β + δ) := included with x, hxε127rw step at inStage128apply ordinalAdd.limit_membership.backward at x, α * β, α * current129with productLimit130witness α * δ131constructor132 . exact ordinalMul.monotone at α, δ, current133with positive, hCurrent, hδ134 . exact inStage135 . intros x hx136obtain⟨ε, hε, hxε⟩:=137 ordinalAdd.limit_membership.forward at x, α * β, α * current138with productLimit, hx139obtain⟨δ, hδ, hεδ⟩:=140 ordinalMul.limit_membership.forward at ε, α, current with limit, hε141have δOrdinal:=Ordinal.member with hCurrent, hδ142have stageOrdinal := ordinalMul.ordinal at α, δ with δOrdinal143have εOrdinal:=Ordinal.member with stageOrdinal, hεδ144have grows := ordinalAdd.monotone at α * β, ε, α * δ145with stageOrdinal, hεδ146have sumStage := ordinalAdd.ordinal at α * β, α * δ with stageOrdinal147have included :=Ordinal.member_subset with sumStage, grows148have step := ih with hδ, δOrdinal149apply ordinalMul.limit_membership.backward at x, α, β + current150with innerLimit151witness β + δ152constructor153 . exact ordinalAdd.monotone at β, δ, current with hCurrent, hδ154 . rw step155exact included with x, hxε156 . cases rest2 with equal | below157 . rw← nat.zero at equal158rw← equal159have innerOrdinal := ordinalAdd.ordinal at β, current with hCurrent160have first := ordinalMul.zero_left at β + current with innerOrdinal161have second := ordinalMul.zero_left at β with βOrdinal162have third := ordinalMul.zero_left at current with hCurrent163rw [first, second, third]164 symm165exact ordinalAdd.zero at0166 . exfalso167exactset.empty with below168169theorem ordinalMul.associative (α β : Ordinal, γ : Set)170shows γ ∈Ordinal→ (α * β) * γ = α * (β * γ)171proof172induction γ using membership173intros current ih hCurrent174have αOrdinal : α ∈Ordinalbyassumption175have βOrdinal : β ∈Ordinalbyassumption176have productOrdinal := ordinalMul.ordinal at α, β with βOrdinal177havecases:=Ordinal.cases with hCurrent178casescaseswith zero | rest179 . rw zero180rw← nat.zero181have first := ordinalMul.zero at α * β182have second := ordinalMul.zero at β183have third := ordinalMul.zero at α184rw nat.zero at third185rw [first, second, third]186rfl187 . cases rest with successor | limit188 . obtain⟨δ, hδ, shape⟩:= successor189rw← shape190have δOrdinal:=Ordinal.member with hCurrent, hδ191have step := ih with hδ, δOrdinal192have innerOrdinal := ordinalMul.ordinal at β, δ with δOrdinal193have first := ordinalMul.next at α * β, δ194have second := ordinalMul.next at β, δ195have third := ordinalMul.distributive at α, β * δ, β with βOrdinal196rw [first, step, second, third]197rfl198 . have zeroCases :=Ordinal.trichotomy at∅withOrdinal.empty, β, βOrdinal199cases zeroCases with positive | rest2200 . have innerLimit := ordinalMul.limit_right at β, current201with positive, limit202have innerOrdinal := ordinalMul.ordinal at β, current with hCurrent203apply Subset.antisymmetric204 . intros x hx205obtain⟨δ, hδ, hxδ⟩:=206 ordinalMul.limit_membership.forward at x, α * β, current207with limit, hx208have δOrdinal:=Ordinal.member with hCurrent, hδ209have step := ih with hδ, δOrdinal210rw step at hxδ211apply ordinalMul.limit_membership.backward at x, α, β * current212with innerLimit213witness β * δ214constructor215 . exact ordinalMul.monotone at β, δ, current216with positive, hCurrent, hδ217 . exact hxδ218 . intros x hx219obtain⟨ε, hε, hxε⟩:=220 ordinalMul.limit_membership.forward at x, α, β * current221with innerLimit, hx222obtain⟨δ, hδ, hεδ⟩:=223 ordinalMul.limit_membership.forward at ε, β, current with limit, hε224have δOrdinal:=Ordinal.member with hCurrent, hδ225have stageOrdinal := ordinalMul.ordinal at β, δ with δOrdinal226have εOrdinal:=Ordinal.member with stageOrdinal, hεδ227have included := ordinalMul.subset_monotone at α, ε, β * δ228with stageOrdinal, hεδ229have step := ih with hδ, δOrdinal230apply ordinalMul.limit_membership.backward at x, α * β, current231with limit232witness δ233constructor234 . exact hδ235 . rw step236exact included with x, hxε237 . cases rest2 with equal | below238 . rw← nat.zero at equal239rw← equal240have first : α *0=0241rw ordinalMul.zero242 symm243exact nat.zero244have second := ordinalMul.zero_left at current with hCurrent245rw [first, second, first]246rfl247 . exfalso248exactset.empty with below249250-- Powers251252theorem ordinalPow.one_left (β : Set)253shows β ∈Ordinal→ ordinalPow(1, β) =1254proof255induction β using membership256intros current ih hCurrent257have oneOrdinal :=Ordinal.natural at1258havecases:=Ordinal.cases with hCurrent259casescaseswith zero | rest260 . rw zero261have base := ordinalPow.zero at1262rw nat.zero at base263exact base264 . cases rest with successor | limit265 . obtain⟨γ, hγ, shape⟩:= successor266rw← shape267have γOrdinal:=Ordinal.member with hCurrent, hγ268have step := ih with hγ, γOrdinal269rw [ordinalPow.next, step]270exact ordinalMul.one at1271 . apply Subset.antisymmetric272 . intros x hx273obtain⟨stage, hStage, hxStage⟩:=274 ordinalPow.limit_membership.forward at x, 1, current with limit, hx275have step := ih with hStage, (Ordinal.member with hCurrent, hStage)276rw step at hxStage277exact hxStage278 . intros x hx279apply ordinalPow.limit_membership.backward at x, 1, current with limit280witness∅281constructor282 . exactOrdinal.zero_member with limit.right.left283 . have base := ordinalPow.zero at1284rw nat.zero at base285rw base286exact hx287288-- A positive ordinal is one or lies above one.289theoremOrdinal.one_or_above_one (α : Ordinal)290requires positive : ∅∈ α291shows α =1∨1∈ α292proof293have αOrdinal : α ∈Ordinalbyassumption294have oneOrdinal :=Ordinal.natural at1295havecases:=Ordinal.trichotomy at α with αOrdinal, 1, oneOrdinal296casescaseswith below | rest297 . exfalso298have one : 1= next(0) bysimp [next.natural]299rw one at below300simp [next.membership] at below301cases below with inZero | isZero302 . rw nat.zero at inZero303exactset.empty with inZero304 . rw isZero at positive305rw nat.zero at positive306exactset.empty with positive307 . cases rest with equal | above308 . left309exact equal310 . right311exact above312313theorem ordinalPow.add (α β : Ordinal, γ : Set)314requires positive : ∅∈ α315shows γ ∈Ordinal→ α ^ (β + γ) = α ^ β * α ^ γ316proof317induction γ using membership318intros current ih hCurrent319have αOrdinal : α ∈Ordinalbyassumption320have βOrdinal : β ∈Ordinalbyassumption321have powerOrdinal := ordinalPow.ordinal at α, β with βOrdinal322havecases:=Ordinal.cases with hCurrent323casescaseswith zero | rest324 . rw zero325rw← nat.zero326have first := ordinalAdd.zero at β327have second := ordinalPow.zero at α328have third := ordinalMul.one at α ^ β329rw [first, second, third]330rfl331 . cases rest with successor | limit332 . obtain⟨δ, hδ, shape⟩:= successor333rw← shape334have δOrdinal:=Ordinal.member with hCurrent, hδ335have step := ih with hδ, δOrdinal336have sumOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal337have stageOrdinal := ordinalPow.ordinal at α, δ with δOrdinal338have first := ordinalAdd.next at β, δ339have second := ordinalPow.next at α, β + δ340have third := ordinalPow.next at α, δ341have fourth := ordinalMul.associative at α ^ β, α ^ δ, α with αOrdinal342rw [first, second, step, third, fourth]343rfl344 . have oneCases :=Ordinal.one_or_above_one with positive345cases oneCases with one | above346 . rw one347have innerOrdinal := ordinalAdd.ordinal at β, current with hCurrent348have first := ordinalPow.one_left at β + current with innerOrdinal349have second := ordinalPow.one_left at β with βOrdinal350have third := ordinalPow.one_left at current with hCurrent351rw [first, second, third]352 symm353exact ordinalMul.one at1354 . have innerLimit := ordinalAdd.limit_right at β, current with limit355have powerLimit := ordinalPow.limit_right at α, current356with above, limit357have innerOrdinal := ordinalAdd.ordinal at β, current with hCurrent358have powerCurrent := ordinalPow.ordinal at α, current with hCurrent359apply Subset.antisymmetric360 . intros x hx361obtain⟨ε, hε, hxε⟩:=362 ordinalPow.limit_membership.forward at x, α, β + current363with innerLimit, hx364obtain⟨δ, hδ, hεδ⟩:=365 ordinalAdd.limit_membership.forward at ε, β, current with limit, hε366have δOrdinal:=Ordinal.member with hCurrent, hδ367have sumOrdinal := ordinalAdd.ordinal at β, δ with δOrdinal368have εOrdinal:=Ordinal.member with sumOrdinal, hεδ369have included := ordinalPow.subset_monotone at α, ε, β + δ370with positive, sumOrdinal, hεδ371have step := ih with hδ, δOrdinal372have inStage : x ∈ α ^ (β + δ) := included with x, hxε373rw step at inStage374apply ordinalMul.limit_membership.backward at x, α ^ β, α ^ current375with powerLimit376witness α ^ δ377constructor378 . exact ordinalPow.monotone at α, δ, current with above, hCurrent, hδ379 . exact inStage380 . intros x hx381obtain⟨ε, hε, hxε⟩:=382 ordinalMul.limit_membership.forward at x, α ^ β, α ^ current383with powerLimit, hx384obtain⟨δ, hδ, hεδ⟩:=385 ordinalPow.limit_membership.forward at ε, α, current with limit, hε386have δOrdinal:=Ordinal.member with hCurrent, hδ387have stageOrdinal := ordinalPow.ordinal at α, δ with δOrdinal388have εOrdinal:=Ordinal.member with stageOrdinal, hεδ389have included := ordinalMul.subset_monotone at α ^ β, ε, α ^ δ390with stageOrdinal, hεδ391have step := ih with hδ, δOrdinal392apply ordinalPow.limit_membership.backward at x, α, β + current393with innerLimit394witness β + δ395constructor396 . exact ordinalAdd.monotone at β, δ, current with hCurrent, hδ397 . rw step398exact included with x, hxε399400theorem ordinalPow.mul (α β : Ordinal, γ : Set)401requires positive : ∅∈ α402shows γ ∈Ordinal→ (α ^ β) ^ γ = α ^ (β * γ)403proof404induction γ using membership405intros current ih hCurrent406have αOrdinal : α ∈Ordinalbyassumption407have βOrdinal : β ∈Ordinalbyassumption408have powerOrdinal := ordinalPow.ordinal at α, β with βOrdinal409havecases:=Ordinal.cases with hCurrent410casescaseswith zero | rest411 . rw zero412rw← nat.zero413have first := ordinalPow.zero at α ^ β414have second := ordinalMul.zero at β415have third := ordinalPow.zero at α416rw nat.zero at third417rw [first, second, third]418rfl419 . cases rest with successor | limit420 . obtain⟨δ, hδ, shape⟩:= successor421rw← shape422have δOrdinal:=Ordinal.member with hCurrent, hδ423have step := ih with hδ, δOrdinal424have innerOrdinal := ordinalMul.ordinal at β, δ with δOrdinal425have first := ordinalPow.next at α ^ β, δ426have second := ordinalMul.next at β, δ427have third := ordinalPow.add at α, β * δ, β with positive, βOrdinal428rw [first, step, second, third]429rfl430 . have oneCases :=Ordinal.one_or_above_one with positive431cases oneCases with one | above432 . rw one433have innerOrdinal := ordinalMul.ordinal at β, current with hCurrent434have first := ordinalPow.one_left at β with βOrdinal435have second := ordinalPow.one_left at current with hCurrent436have third := ordinalPow.one_left at β * current with innerOrdinal437rw [first, second, third]438rfl439 . have zeroCases :=Ordinal.trichotomy at∅440withOrdinal.empty, β, βOrdinal441cases zeroCases with βPositive | rest2442 . have innerLimit := ordinalMul.limit_right at β, current443with βPositive, limit444have innerOrdinal := ordinalMul.ordinal at β, current with hCurrent445apply Subset.antisymmetric446 . intros x hx447obtain⟨δ, hδ, hxδ⟩:=448 ordinalPow.limit_membership.forward at x, α ^ β, current449with limit, hx450have δOrdinal:=Ordinal.member with hCurrent, hδ451have step := ih with hδ, δOrdinal452rw step at hxδ453apply ordinalPow.limit_membership.backward at x, α, β * current454with innerLimit455witness β * δ456constructor457 . exact ordinalMul.monotone at β, δ, current458with βPositive, hCurrent, hδ459 . exact hxδ460 . intros x hx461obtain⟨ε, hε, hxε⟩:=462 ordinalPow.limit_membership.forward at x, α, β * current463with innerLimit, hx464obtain⟨δ, hδ, hεδ⟩:=465 ordinalMul.limit_membership.forward at ε, β, current466with limit, hε467have δOrdinal:=Ordinal.member with hCurrent, hδ468have stageOrdinal := ordinalMul.ordinal at β, δ with δOrdinal469have εOrdinal:=Ordinal.member with stageOrdinal, hεδ470have included := ordinalPow.subset_monotone at α, ε, β * δ471with positive, stageOrdinal, hεδ472have step := ih with hδ, δOrdinal473apply ordinalPow.limit_membership.backward at x, α ^ β, current474with limit475witness δ476constructor477 . exact hδ478 . rw step479exact included with x, hxε480 . cases rest2 with equal | below481 . rw← nat.zero at equal482rw← equal483have first := ordinalPow.zero at α484have second := ordinalMul.zero_left at current with hCurrent485have third := ordinalPow.one_left at current with hCurrent486rw [first, second, third, first]487rfl488 . exfalso489exactset.empty with below490