1-- Hartogs construction2-- 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.Cardinal.Hartogs8import Product9import Order1011-- All well-orders carried by subsets of A form a set. The first12-- coordinate is bounded by 𝒫(A), and the relation coordinate by 𝒫(A × A).13-- Hartogs' ordinal will arise from the order types represented here.14def wellOrderCodes (A : Set) : Set:= {15 p ∈𝒫(A) ×𝒫(A × A) |16∃ B, (B ⊆ A) ∧∃ r, RelationBetween(r, A, A) ∧ p = (B, r) ∧ WellOrder(B, r)17}1819-- Guarding the relation makes the recursive definition below total in A and20-- r. When r is a well-order this is just r; otherwise it is empty.21def activeWellOrderRelation (A r : Set) : Set:= { p ∈ r | WellOrder(A, r) }2223theorem activeWellOrderRelation.relates (x y A r : Set)24shows relates(activeWellOrderRelation(A, r), x, y) ↔25 relates(r, x, y) ∧ WellOrder(A, r)26proof27simp [activeWellOrderRelation, relates]2829theorem activeWellOrderRelation.well_founded (A r : Set)30shows wellFoundedOn(activeWellOrderRelation(A, r), A)31proof32have alternatives : WellOrder(A, r) ∨¬WellOrder(A, r) bytauto33cases alternatives with wellOrdered | notWellOrdered34 . have founded := WellOrder.well_founded with wellOrdered35intros s hs36specialize founded with s, hs37obtain⟨m, hm⟩:= founded38witness m39rcases hm with⟨hmS, minimal⟩40constructor41 . exact hmS42 . intros y hyS hActive43obtain⟨hRelation, retainedOrder⟩:= activeWellOrderRelation.relates.forward with hActive44exact minimal with y, hyS, hRelation45intros s hs46rcases hs with⟨hSubset, hNonempty⟩47obtain⟨m2, hm2⟩:=set.foundation with hNonempty48witness m249rcases hm2 with⟨hmS2, minimal2⟩50constructor51 . exact hmS252 . intros y hyS hActive53have shape := activeWellOrderRelation.relates.forward with hActive54tauto5556theorem activeWellOrderRelation.transitive (A r : Set)57requires order : WellOrder(A, r)58shows TransitiveOn(A, activeWellOrderRelation(A, r))59proof60have linear := WellOrder.strict_linear with order61have transitive := StrictLinearOrder.transitive with linear62intros x hx y hy z hz hxy hyz63have xy := activeWellOrderRelation.relates.forward with hxy64have yz := activeWellOrderRelation.relates.forward with hyz65rcases xy with⟨rxy, retainedOrder⟩66rcases yz with⟨ryz, retainedOrder2⟩67specialize transitive with x, hx, y, hy, z, hz, rxy, ryz68exact activeWellOrderRelation.relates.backward with⟨transitive, order⟩6970-- The first genuinely recursive layer of the well-order collapse. The value71-- at x is the set of values already assigned to r-predecessors of x.72noncomputable well-founded def wellOrderCollapse (A r x : Set) : Set73over A orderedby activeWellOrderRelation(A, r)74certifiedby activeWellOrderRelation.well_founded75| x using history => Relation.range(history)7677def wellOrderCollapseGraph (A r : Set) : Set:= {78 (x ↦ wellOrderCollapse(A, r, x)) | x ∈ A79}8081def wellOrderType (A r : Set) : Set:= Relation.range(wellOrderCollapseGraph(A, r))8283theorem wellOrderCollapse.membership (z A r x : Set)84requires hx : x ∈ A85shows z ∈ wellOrderCollapse(A, r, x) ↔86∃ y ∈ A, relates(activeWellOrderRelation(A, r), y, x) ∧87 z = wellOrderCollapse(A, r, y)88proof89have equation := wellOrderCollapse.equation.direct at A, r, x with hx90rw equation91constructor92 . intro hz93obtain⟨bounded, source, sourcePair⟩:= Relation.range.membership.forward with hz94obtain⟨y, hyA, hyx, pairEqual⟩:= wellOrderCollapse.history.membership.forward with sourcePair95obtain⟨sourceEqual, valueEqual⟩:= orderedPair.injective with pairEqual96refine⟨y, hyA, hyx, valueEqual⟩97 . introwitness98obtain⟨y2, hyA2, hyx2, valueEqual2⟩:=witness99have inHistory : (y2 ↦ wellOrderCollapse(A, r, y2)) ∈ wellOrderCollapse.history(A, r, x)100exact wellOrderCollapse.history.membership.backward with⟨y2, hyA2, hyx2, rfl⟩101have inRange := Relation.range.contains with inHistory102 rwa valueEqual2103104theorem wellOrderCollapseGraph.relates (x y A r : Set)105shows relates(wellOrderCollapseGraph(A, r), x, y) ↔106 x ∈ A ∧ y = wellOrderCollapse(A, r, x)107proof108constructor109 . intro hPair110unfold relates at hPair111obtain⟨source, sourceInA, pairEqual⟩:= wellOrderCollapseGraph.membership.forward with hPair112obtain⟨sourceEqual, valueEqual⟩:= orderedPair.injective with pairEqual113constructor114 . rw← sourceEqual115exact sourceInA116 . rw [← sourceEqual, valueEqual]117rfl118 . intro shape119rcases shape with⟨hx, valueEqual⟩120unfold relates121apply wellOrderCollapseGraph.membership.backward122witness x123constructor124 . exact hx125 . rw valueEqual126rfl127128theorem wellOrderType.membership (y A r : Set)129shows y ∈ wellOrderType(A, r) ↔130∃ x ∈ A, y = wellOrderCollapse(A, r, x)131proof132constructor133 . intro hy134unfold wellOrderType at hy135obtain⟨bounded, x, pair⟩:= Relation.range.membership.forward with hy136have graphShape := wellOrderCollapseGraph.relates.forward at x, y, A, r137have related : relates(wellOrderCollapseGraph(A, r), x, y) byexact pair138specialize graphShape with related139witness x140exact graphShape141 . intro witnessData142obtain⟨x2, hxA, valueEqual⟩:= witnessData143unfold wellOrderType144apply Relation.range.contains at x2, y, wellOrderCollapseGraph(A, r)145have graphPair := wellOrderCollapseGraph.relates.backward at x2, y, A, r146have related : relates(wellOrderCollapseGraph(A, r), x2, y) bysimp147simp [wellOrderType, relates]148149-- The predecessor-collapse at every point of a well-order is a von Neumann150-- ordinal. This is the heart of the Mostowski collapse in the linear case.151theorem wellOrderCollapse.ordinal (A r : Set)152requires order : WellOrder(A, r)153shows∀ x ∈ A, wellOrderCollapse(A, r, x) ∈Ordinal154proof155induction x over A orderedby activeWellOrderRelation(A, r) certifiedby activeWellOrderRelation.well_founded at A, r156intros x hx ih157constructor158intros value valueInCollapse member memberInValue159have valueShape := wellOrderCollapse.membership at value, A, r, x with hx160have decodedValue : ∃ y ∈ A, relates(activeWellOrderRelation(A, r), y, x) ∧ value = wellOrderCollapse(A, r, y)161simp [valueShape]162obtain⟨y, hyA, hyx, valueEqual⟩:= decodedValue163have memberShape := wellOrderCollapse.membership at member, A, r, y with hyA164rw valueEqual at memberInValue165have decodedMember : ∃ w ∈ A, relates(activeWellOrderRelation(A, r), w, y) ∧ member = wellOrderCollapse(A, r, w)166simp [memberShape]167obtain⟨w, hwA, hwy, memberEqual⟩:= decodedMember168have relationTransitive := activeWellOrderRelation.transitive with order, w, hwA, y, hyA, x, hx, hwy, hyx169have targetShape := wellOrderCollapse.membership at member, A, r, x with hx170simp [targetShape]171 . intros value valueInCollapse172have valueShape := wellOrderCollapse.membership at value, A, r, x with hx173have decodedValue : ∃ y2 ∈ A, relates(activeWellOrderRelation(A, r), y2, x) ∧ value = wellOrderCollapse(A, r, y2)174simp [valueShape]175obtain⟨y2, hyA2, hyx2, valueEqual2⟩:= decodedValue176specialize ih with y2177have predecessor : y2 ∈ A ∧ relates(activeWellOrderRelation(A, r), y2, x) byrefine⟨hyA2, hyx2⟩178specialize ih with predecessor179have valueOrdinal := ih180have valueTransitive :=Ordinal.transitive with valueOrdinal181 rwa valueEqual2182183theorem wellOrderCollapse.injective (x y A r : Set)184requires order : WellOrder(A, r)185requires hx : x ∈ A186requires hy : y ∈ A187requires equalValues : wellOrderCollapse(A, r, x) = wellOrderCollapse(A, r, y)188shows x = y189proof190by_contra unequal191have linear := WellOrder.strict_linear with order192have connected := StrictLinearOrder.connected with linear, x, hx, y, hy, unequal193cases connected with xBeforeY | yBeforeX194 . have activeXY := activeWellOrderRelation.relates.backward at x, y, A, r195have active : relates(activeWellOrderRelation(A, r), x, y) bysimp196have memberRule := wellOrderCollapse.membership at wellOrderCollapse(A, r, x), A, r, y with hy197have member : wellOrderCollapse(A, r, x) ∈ wellOrderCollapse(A, r, y) bysimp [memberRule]198rw equalValues at member199have irreflexive := membership.irreflexive at wellOrderCollapse(A, r, y)200apply irreflexive201exact member202 . have activeYX := activeWellOrderRelation.relates.backward at y, x, A, r203have active2 : relates(activeWellOrderRelation(A, r), y, x) bysimp204have memberRule2 := wellOrderCollapse.membership at wellOrderCollapse(A, r, y), A, r, x with hx205have member2 : wellOrderCollapse(A, r, y) ∈ wellOrderCollapse(A, r, x) bysimp [memberRule2]206rw← equalValues at member2207have irreflexive2 := membership.irreflexive at wellOrderCollapse(A, r, x)208apply irreflexive2209exact member2210211theorem wellOrderCollapseGraph.function (A r : Set)212shows wellOrderCollapseGraph(A, r) : A → wellOrderType(A, r)213proof214constructor215intros p hp216obtain⟨x, hxA, pairEqual⟩:= wellOrderCollapseGraph.membership.forward with hp217rw← pairEqual218apply product.pair219 . exact hxA220 . apply wellOrderType.membership.backward at wellOrderCollapse(A, r, x), A, r221refine⟨x, hxA, rfl⟩222 . constructor223intros x2 y hxy z hxz224have yShape := wellOrderCollapseGraph.relates.forward with hxy225have zShape := wellOrderCollapseGraph.relates.forward with hxz226rcases yShape with⟨hxA2, yEqual⟩227rcases zShape with⟨hxA3, zEqual⟩228rw [yEqual, zEqual]229rfl230 . intros x3 hxA3231witness wellOrderCollapse(A, r, x3)232constructor233 . apply wellOrderType.membership.backward at wellOrderCollapse(A, r, x3), A, r234refine⟨x3, hxA3, rfl⟩235 . apply wellOrderCollapseGraph.relates.backward at x3, wellOrderCollapse(A, r, x3), A, r236refine⟨hxA3, rfl⟩237238theorem wellOrderCollapseGraph.injective (A r : Set)239requires order : WellOrder(A, r)240shows InjectiveBetween(wellOrderCollapseGraph(A, r), A, wellOrderType(A, r))241proof242constructor243 . exact wellOrderCollapseGraph.function at A, r244 . intros x hx y hy z hz hxz hyz245have xShape := wellOrderCollapseGraph.relates.forward with hxz246have yShape := wellOrderCollapseGraph.relates.forward with hyz247rcases xShape with⟨hxA, xValue⟩248rcases yShape with⟨hyA, yValue⟩249have equalValues : wellOrderCollapse(A, r, x) = wellOrderCollapse(A, r, y) bycc250exact wellOrderCollapse.injective with order, hx, hy, equalValues251252theorem wellOrderCollapseGraph.surjective (A r : Set)253shows SurjectiveBetween(wellOrderCollapseGraph(A, r), A, wellOrderType(A, r))254proof255constructor256 . exact wellOrderCollapseGraph.function at A, r257 . intros y hy258obtain⟨x, hxA, valueEqual⟩:= wellOrderType.membership.forward with hy259witness x260constructor261 . exact hxA262 . apply wellOrderCollapseGraph.relates.backward at x, y, A, r263refine⟨hxA, valueEqual⟩264265theorem wellOrderCollapseGraph.bijective (A r : Set)266requires order : WellOrder(A, r)267shows BijectiveBetween(wellOrderCollapseGraph(A, r), A, wellOrderType(A, r))268proof269simp [BijectiveBetween, wellOrderCollapseGraph.injective, wellOrderCollapseGraph.surjective]270271theorem wellOrderCollapseGraph.order_isomorphism (A r : Set)272requires order : WellOrder(A, r)273shows OrderIsomorphism(274 wellOrderCollapseGraph(A, r), A, activeWellOrderRelation(A, r),275 wellOrderType(A, r), membershipOn(wellOrderType(A, r)))276proof277constructor278 . have bijective := wellOrderCollapseGraph.bijective at A, r279exact bijective with order280 . intros x hx y hy u hu v hv hxu hyv281have uShape := wellOrderCollapseGraph.relates.forward with hxu282have vShape := wellOrderCollapseGraph.relates.forward with hyv283rcases uShape with⟨hxA, uEqual⟩284rcases vShape with⟨hyA, vEqual⟩285constructor286 . intro hxy287have collapseRule := wellOrderCollapse.membership at wellOrderCollapse(A, r, x), A, r, y with hy288have collapseMember : wellOrderCollapse(A, r, x) ∈ wellOrderCollapse(A, r, y) bysimp [collapseRule]289have uvMember : u ∈ v bysimp290have membershipRule := membershipOn.relates with hu, hv291simp292 . intro huv293have membershipRule := membershipOn.relates with hu, hv294have uvMember : u ∈ v bysimp [membershipRule]295rw [uEqual, vEqual] at uvMember296have collapseRule := wellOrderCollapse.membership at wellOrderCollapse(A, r, x), A, r, y with hy297have predecessorData : ∃ w ∈ A, relates(activeWellOrderRelation(A, r), w, y) ∧ wellOrderCollapse(A, r, x) = wellOrderCollapse(A, r, w)298simp [collapseRule]299obtain⟨w, hwA, hwy, equalValues⟩:= predecessorData300have injective := wellOrderCollapse.injective with order, hx, hwA, equalValues301 rwa injective302303theorem wellOrderType.ordinal (A r : Set)304requires order : WellOrder(A, r)305shows wellOrderType(A, r) ∈Ordinal306proof307constructor308intros value valueInType member memberInValue309obtain⟨x, hxA, valueEqual⟩:= wellOrderType.membership.forward with valueInType310rw valueEqual at memberInValue311have memberRule := wellOrderCollapse.membership at member, A, r, x with hxA312have memberShape : ∃ y ∈ A, relates(activeWellOrderRelation(A, r), y, x) ∧ member = wellOrderCollapse(A, r, y)313simp [memberRule]314obtain⟨y, hyA, hyx, memberEqual⟩:= memberShape315exact wellOrderType.membership.backward with⟨y, hyA, memberEqual⟩316 . intros value2 valueInType2317obtain⟨x2, hxA2, valueEqual2⟩:= wellOrderType.membership.forward with valueInType2318have collapseOrdinals := wellOrderCollapse.ordinal with order, x2, hxA2319have collapseTransitive :=Ordinal.transitive with collapseOrdinals320 rwa valueEqual2321322theorem wellOrderCodes.empty (A : Set)323shows (∅, membershipOn(∅)) ∈ wellOrderCodes(A)324proof325apply wellOrderCodes.membership.backward326have emptySubset := empty.subset at A327have emptyRelation := membershipOn.relation at empty328have relationOnA := RelationBetween.monotone with emptyRelation, emptySubset, emptySubset329constructor330 . apply product.pair at empty, membershipOn(∅), 𝒫(A), 𝒫(A × A)331 . applyset.powerset.backward at empty, A332exact emptySubset333 . applyset.powerset.backward at membershipOn(∅), A × A334have relationBound := relationOnA335unfold RelationBetween at relationBound336exact relationBound337 . witness empty338constructor339 . exact emptySubset340 . witness membershipOn(∅)341constructor342 . exact relationOnA343 . constructor344 . rfl345 . exactOrdinal.well_order at empty346347theorem wellOrderCodes.nonempty (A : Set)348shows Nonempty(wellOrderCodes(A))349proof350witness (∅, membershipOn(∅))351exact wellOrderCodes.empty352353-- Collapsing an ordinal with its membership order returns the ordinal itself.354-- This will identify order types after transporting an ordinal into a set.355theorem wellOrderCollapse.on_ordinal (α : Set)356requires ordinal : α ∈Ordinal357shows∀ x ∈ α, wellOrderCollapse(α, membershipOn(α), x) = x358proof359have order :=Ordinal.well_order with ordinal360have transitive :=Ordinal.transitive with ordinal361induction x over α orderedby membershipOn(α) certifiedby membershipOn.wellFounded at α362intros x hx ih363ext z364constructor365 . intro member366have shape := wellOrderCollapse.membership at z, α, membershipOn(α), x with hx367have decoded : ∃ y ∈ α, relates(activeWellOrderRelation(α, membershipOn(α)), y, x) ∧368 z = wellOrderCollapse(α, membershipOn(α), y)369exact shape.forward with member370obtain⟨y, hy, active, value⟩:= decoded371obtain⟨related, ordered⟩:= activeWellOrderRelation.relates.forward with active372have predecessor : y ∈ α ∧ relates(membershipOn(α), y, x) byrefine⟨hy, related⟩373have collapsed := ih with y, predecessor374have rule := membershipOn.relates with hy, hx375have inside := rule.forward with related376rw collapsed at value377 rwa value378 . intro insideZ379have xSubset := transitive with x, hx380have hz := xSubset with z, insideZ381have ruleZ := membershipOn.relates with hz, hx382have relatedZ := ruleZ.backward with insideZ383have predecessorZ : z ∈ α ∧ relates(membershipOn(α), z, x) byrefine⟨hz, relatedZ⟩384have collapsedZ := ih with z, predecessorZ385have activeZ : relates(activeWellOrderRelation(α, membershipOn(α)), z, x)386exact activeWellOrderRelation.relates.backward with⟨relatedZ, order⟩387have shapeZ := wellOrderCollapse.membership at z, α, membershipOn(α), x with hx388apply shapeZ.backward389witness z390constructor391 . exact hz392 . constructor393 . exact activeZ394 . symm395exact collapsedZ396397theorem wellOrderType.on_ordinal (α : Set)398requires ordinal : α ∈Ordinal399shows wellOrderType(α, membershipOn(α)) = α400proof401have collapse := wellOrderCollapse.on_ordinal with ordinal402ext x403constructor404 . intro member405obtain⟨y, hy, value⟩:= wellOrderType.membership.forward with member406have same := collapse with y, hy407rw same at value408 rwa value409 . intro hx410have sameX := collapse with x, hx411apply wellOrderType.membership.backward412witness x413constructor414 . exact hx415 . symm416exact sameX417418-- The same collapse identity survives transport along any injection.419theorem wellOrderCollapse.on_injected_ordinal (f α A : Set)420requires ordinal : α ∈Ordinal421requires injective : InjectiveBetween(f, α, A)422shows∀ x ∈ α,423 wellOrderCollapse(functionImage(f, α, A), transportedOrder(f, α, A, membershipOn(α)), f[x]) = x424proof425have function := Injective.function with injective426have originalOrder :=Ordinal.well_order with ordinal427have order := transportedOrder.well_order with*428have transitive :=Ordinal.transitive with ordinal429induction x over α orderedby membershipOn(α) certifiedby membershipOn.wellFounded at α430intros x hx ih431have fxMember := functionImage.value with*432ext z433constructor434 . intro member435have rule := wellOrderCollapse.membership at z, functionImage(f, α, A),436 transportedOrder(f, α, A, membershipOn(α)), f[x] with fxMember437obtain⟨v, vMember, active, value⟩:= rule.forward with member438obtain⟨edge, ordered⟩:= activeWellOrderRelation.relates.forward with active439obtain⟨bounded, y, hy, vValue⟩:= functionImage.membership.forward with vMember440rw vValue at edge441have original := transportedOrder.reflect with*442have predecessor : y ∈ α ∧ relates(membershipOn(α), y, x) byrefine⟨hy, original⟩443have collapsed := ih with y, predecessor444have membershipRule := membershipOn.relates with hy, hx445have inside := membershipRule.forward with original446rw [vValue, collapsed] at value447 rwa value448 . intro insideZ449have xSubset := transitive with x, hx450have hz := xSubset with z, insideZ451have membershipRuleZ := membershipOn.relates with hz, hx452have originalZ := membershipRuleZ.backward with insideZ453have predecessorZ : z ∈ α ∧ relates(membershipOn(α), z, x) byrefine⟨hz, originalZ⟩454have collapsedZ := ih with z, predecessorZ455have fzMember := functionImage.value with hz456have edgeZ := transportedOrder.edge with*457have activeZ : relates(activeWellOrderRelation(functionImage(f, α, A),458 transportedOrder(f, α, A, membershipOn(α))), f[z], f[x])459exact activeWellOrderRelation.relates.backward with⟨edgeZ, order⟩460have ruleZ := wellOrderCollapse.membership at z, functionImage(f, α, A),461 transportedOrder(f, α, A, membershipOn(α)), f[x] with fxMember462apply ruleZ.backward463witness f[z]464constructor465 . exact fzMember466 . constructor467 . exact activeZ468 . symm469exact collapsedZ470471theorem wellOrderType.on_injected_ordinal (f α A : Set)472requires ordinal : α ∈Ordinal473requires injective : InjectiveBetween(f, α, A)474shows wellOrderType(functionImage(f, α, A), transportedOrder(f, α, A, membershipOn(α))) = α475proof476have function := Injective.function with injective477have collapse := wellOrderCollapse.on_injected_ordinal with*478ext z479constructor480 . intro member481obtain⟨v, vMember, value⟩:= wellOrderType.membership.forward with member482obtain⟨bounded, x, hx, vValue⟩:= functionImage.membership.forward with vMember483have same := collapse with x, hx484rw [vValue, same] at value485 rwa value486 . intro hz487have fzMember := functionImage.value with*488have sameZ := collapse with z, hz489apply wellOrderType.membership.backward490witness f[z]491constructor492 . exact fzMember493 . symm494exact sameZ495496-- Collect the ordinal types in two bounded stages. This avoids selecting a497-- representative well-order for each type: Replacement takes all of them.498def wellOrdersOn (A B : Set) : Set:=499 {r ∈𝒫(A × A) | WellOrder(B, r)}500501def wellOrderTypesOn (A B : Set) : Set:=502 {wellOrderType(B, r) | r ∈ wellOrdersOn(A, B)}503504def wellOrderTypeRows (A : Set) : Set:=505 {wellOrderTypesOn(A, B) | B ∈𝒫(A)}506507def wellOrderTypes (A : Set) : Set:=⋃(wellOrderTypeRows(A))508509def wellOrderTypeSuccessors (A : Set) : Set:=510 {next(α) | α ∈ wellOrderTypes(A)}511512-- An ordinal strictly above every ordinal type represented on a subset of A.513-- The non-injection theorem additionally needs transport along an injection.514def hartogsBound (A : Set) : Set:=⋃(wellOrderTypeSuccessors(A))515516theorem wellOrderTypes.membership (α A : Set)517shows α ∈ wellOrderTypes(A) ↔518∃ B ∈𝒫(A), ∃ r ∈ wellOrdersOn(A, B), wellOrderType(B, r) = α519proof520constructor521 . intro member522unfold wellOrderTypes at member523obtain⟨row, rowMember, inRow⟩:=set.union.forward with member524obtain⟨B, subset, rowEqual⟩:= wellOrderTypeRows.membership.forward with rowMember525rw← rowEqual at inRow526have represented := wellOrderTypesOn.membership.forward with inRow527refine⟨B, subset, represented⟩528 . intro represented529obtain⟨C, subsetC, r, order, equal⟩:= represented530have rowInFamily : wellOrderTypesOn(A, C) ∈ wellOrderTypeRows(A)531exact wellOrderTypeRows.membership.backward with⟨C, subsetC, rfl⟩532have inSelectedRow : α ∈ wellOrderTypesOn(A, C) := wellOrderTypesOn.membership.backward with⟨r, order, equal⟩533unfold wellOrderTypes534exactset.union.backward with⟨wellOrderTypesOn(A, C), rowInFamily, inSelectedRow⟩535536theorem wellOrderTypes.contains (A B r : Set)537requires subset : B ⊆ A538requires order : WellOrder(B, r)539shows wellOrderType(B, r) ∈ wellOrderTypes(A)540proof541have strict := WellOrder.strict_linear with order542have relation := StrictLinearOrder.relation with strict543have bounded := RelationBetween.monotone with relation, subset, subset544unfold RelationBetween at bounded545unfold Subset at bounded546have relationMember :=set.powerset.backward with bounded547have orderMember : r ∈ wellOrdersOn(A, B) := wellOrdersOn.membership.backward with⟨relationMember, order⟩548have subsetLaw := subset549unfold Subset at subsetLaw550have carrierMember :=set.powerset.backward with subsetLaw551exact wellOrderTypes.membership.backward with⟨B, carrierMember, r, orderMember, rfl⟩552553-- The types grow with the carrier: a well-order on a subset of A is a554-- well-order on a subset of any larger set.555theorem wellOrderTypes.monotone (A C : Set)556requires hAC : A ⊆ C557shows wellOrderTypes(A) ⊆ wellOrderTypes(C)558proof559intros α hα560obtain⟨B, hB, r, hr, equal⟩:= wellOrderTypes.membership.forward with hα561have subsetA := powerset.membership_iff.forward with hB562have subsetC := Subset.transitive with subsetA, hAC563have parts := wellOrdersOn.membership.forward with hr564rw← equal565exact wellOrderTypes.contains with subsetC, parts.right566567theorem wellOrderTypes.ordinal (α A : Set)568requires member : α ∈ wellOrderTypes(A)569shows α ∈Ordinal570proof571simp [wellOrderTypes.membership, wellOrdersOn.membership, wellOrderType.ordinal]572573theorem hartogsBound.ordinal (A : Set)574shows hartogsBound(A) ∈Ordinal575proof576unfold hartogsBound577applyOrdinal.union578intros β member579obtain⟨α, represented, equal⟩:= wellOrderTypeSuccessors.membership.forward with member580have ordinal := wellOrderTypes.ordinal with represented581rw← equal582exactOrdinal.next with ordinal583584theorem hartogsBound.contains_type (α A : Set)585requires represented : α ∈ wellOrderTypes(A)586shows α ∈ hartogsBound(A)587proof588have successorMember : next(α) ∈ wellOrderTypeSuccessors(A)589exact wellOrderTypeSuccessors.membership.backward with⟨α, represented, rfl⟩590have inside := next.contains at α591unfold hartogsBound592exactset.union.backward with⟨next(α), successorMember, inside⟩593594-- The Hartogs bound grows with its argument.595theorem hartogsBound.monotone (A C : Set)596requires hAC : A ⊆ C597shows hartogsBound(A) ⊆ hartogsBound(C)598proof599intros β hβ600unfold hartogsBound at hβ601obtain⟨S, hS, hβS⟩:= union.membership.forward with hβ602obtain⟨α, hα, shape⟩:= wellOrderTypeSuccessors.membership.forward with603 hS604have typeC := wellOrderTypes.monotone with hAC, α, hα605have inC := hartogsBound.contains_type with typeC606rw← shape at hβS607havesplit:= next.membership.forward with hβS608casessplitwith less | same609 . have inside :=Ordinal.member_subset with (hartogsBound.ordinal at C), inC610exact inside with β, less611 . rw same612exact inC613614theorem hartogsBound.not_represented (A : Set)615shows¬hartogsBound(A) ∈ wellOrderTypes(A)616proof617simp [hartogsBound.contains_type, membership.irreflexive]618619theorem hartogsBound.above_well_order (A B r : Set)620requires subset : B ⊆ A621requires order : WellOrder(B, r)622shows wellOrderType(B, r) ∈ hartogsBound(A)623proof624simp [wellOrderTypes.contains, hartogsBound.contains_type]625626theorem hartogsBound.not_order_type (A B r : Set)627requires subset : B ⊆ A628requires order : WellOrder(B, r)629shows wellOrderType(B, r) ≠ hartogsBound(A)630proof631have represented := wellOrderTypes.contains with*632intro equal633rw equal at represented634exact hartogsBound.not_represented with represented635636theorem hartogsBound.above_ordinal_subset (α A : Set)637requires ordinal : α ∈Ordinal638requires subset : α ⊆ A639shows α ∈ hartogsBound(A)640proof641have order :=Ordinal.well_order with ordinal642have above := hartogsBound.above_well_order with*643have identity := wellOrderType.on_ordinal with ordinal644 rwa identity at above645646-- Hartogs' theorem: the constructed ordinal is too large to inject into A.647theorem hartogsBound.no_injection (A f : Set)648shows¬InjectiveBetween(f, hartogsBound(A), A)649proof650intro injective651have ordinal := hartogsBound.ordinal at A652have originalOrder :=Ordinal.well_order with ordinal653have order := transportedOrder.well_order at f, hartogsBound(A), A,654 membershipOn(hartogsBound(A)) with*655have subset := functionImage.subset at f, hartogsBound(A), A656have forbidden := hartogsBound.not_order_type at A, functionImage(f, hartogsBound(A), A),657 transportedOrder(f, hartogsBound(A), A, membershipOn(hartogsBound(A))) with*658have same := wellOrderType.on_injected_ordinal with*659exact forbidden with same660661theorem Hartogs.theorem (A : Set)662shows∃ α, α ∈Ordinal∧ (∀ f, ¬InjectiveBetween(f, α, A))663proof664witness hartogsBound(A)665intro f666exact hartogsBound.no_injection667