1-- Bundled topological spaces: a space as one structure of its carrier and2-- its open sets, the open and closed sets, neighborhoods, interior,3-- closure, density, and convergent sequences under their standard names,4-- the closure instances, and the topology rewrite set5-- Part of Cumulus, the Grace17 mathematics library.6-- Copyright (c) 2026 Grant Passmore.7-- Released under the Apache License 2.0. See LICENSE in the repository root.8-- Authors: Grant Passmore910module Grace.Cumulus.Topology.Structure11import Maps12import Basis13import Connected1415-- A topological space is a structure of its carrier and its family of open16-- sets, built by TopologicalSpace.mk(A, T) and read back by the projections17-- X.carrier and X.opens. TopologicalSpace(X) says that X is such a18-- structure whose open sets are subsets of the carrier containing the19-- carrier and closed under arbitrary unions and binary intersections; the20-- empty set is the union of the empty family. IsTopology(A, T) remains the21-- form over separate pieces, bridged below.22structure TopologicalSpace23| carrier : Set24| opens : Set25where26 opens_subsets : opens ⊆𝒫(carrier)27 carrier_open : carrier ∈ opens28 union_open : ∀ S, S ⊆ opens →⋃(S) ∈ opens29 inter_open : ∀ U V ∈ opens, U ∩ V ∈ opens3031-- The projection laws of a constructed space as one rewrite set.32tactic topology_projections :=simp [TopologicalSpace.mk.carrier, TopologicalSpace.mk.opens]3334-- Bridges between the structure and the form over separate pieces. The35-- bundled-to-unbundled direction is an instance, so `with *` reads the36-- topology off a space hypothesis.37instance TopologicalSpace.parts (X : Set)38requires space : TopologicalSpace(X)39shows IsTopology(X.carrier, X.opens)40proof41obtain⟨shape, subsets, whole, unions, intersections⟩:= space42unfold IsTopology43exact⟨subsets, whole, unions, intersections⟩4445theorem TopologicalSpace.of_parts (A T : Set)46requires topology : IsTopology(A, T)47shows TopologicalSpace(TopologicalSpace.mk(A, T))48proof49obtain⟨subsets, whole, unions, intersections⟩:= topology50apply TopologicalSpace.intro51 . exact subsets52 . exact whole53 . exact unions54 . exact intersections5556theorem TopologicalSpace.of_projections (X : Set)57requires shape : TopologicalSpace.Data(X)58requires topology : IsTopology(X.carrier, X.opens)59shows TopologicalSpace(X)60proof61obtain⟨subsets, whole, unions, intersections⟩:= topology62unfold TopologicalSpace63exact⟨shape, subsets, whole, unions, intersections⟩6465-- A space is the constructor applied to its projections.66theorem TopologicalSpace.eta_of_space (X : Set)67requires space : TopologicalSpace(X)68shows X = TopologicalSpace.mk(X.carrier, X.opens)69proof70obtain⟨shape, rest⟩:= space71exact TopologicalSpace.eta with shape7273-- Under a hypothesis TopologicalSpace(X): Open(X, U) says U is open, that74-- is, U ∈ X.opens; Closed(X, C) that C is a subset of the carrier whose75-- complement is open; Neighborhood(X, N, x) that N contains an open set76-- around x; Dense(X, A) that A meets every nonempty open set; Compact(X, A)77-- that every open cover of A has a finite subcover; ConnectedSubset(X, A)78-- that A has no separation by open sets; and Converges(X, u, x), written79-- u ⇝ x, that the sequence u in X is eventually inside every open set80-- around x. IsClosed(A, T, C), IsDense(A, T, C), IsCompact(A, T, C), and81-- IsConnectedSubset(A, T, C) remain the forms over separate pieces.82section Definitions83variable (X : Set)84hypothesis space : TopologicalSpace(X)8586predicate Open (U : Set) := U ∈ X.opens87predicate Closed (C : Set) := IsClosed(X.carrier, X.opens, C)88predicate Neighborhood (N x : Set) :=89 N ⊆ X.carrier ∧ (∃ U ∈ X.opens, x ∈ U ∧ U ⊆ N)90predicate Dense (A : Set) := IsDense(X.carrier, X.opens, A)91predicate Compact (A : Set) := IsCompact(X.carrier, X.opens, A)92predicate ConnectedSubset (A : Set) := IsConnectedSubset(X.carrier, X.opens, A)93predicate Converges (u x : Set) :=94 (u : ℕ → X.carrier) ∧ x ∈ X.carrier ∧95 (∀ U ∈ X.opens, x ∈ U →96∃ N ∈ ℕ, ∀ n ∈ ℕ, N ≤ n → u(n) ∈ U)9798end Definitions99100-- The properties of the space itself: Compact(X) says the carrier is a101-- compact subset, the one-place form beside Compact(X, A) resolved by its102-- arity, Hausdorff(X) that distinct points have disjoint open103-- neighborhoods, T1Space(X) that each point is closed, and Connected(X)104-- that the carrier is not the union of two disjoint nonempty open sets.105-- IsCompact(A, T, A), IsHausdorff(A, T), IsT1Space(A, T), and IsConnected(A, T)106-- remain the forms over separate pieces.107predicate Compact (X : Set) :=108 IsCompact(TopologicalSpace.carrier(X), TopologicalSpace.opens(X),109 TopologicalSpace.carrier(X))110predicate Hausdorff (X : Set) :=111 IsHausdorff(TopologicalSpace.carrier(X), TopologicalSpace.opens(X))112predicate T1Space (X : Set) :=113 IsT1Space(TopologicalSpace.carrier(X), TopologicalSpace.opens(X))114predicate Connected (X : Set) :=115 IsConnected(TopologicalSpace.carrier(X), TopologicalSpace.opens(X))116117-- A sequence converging to a point is written u ⇝ x wherever a hypothesis118-- in scope supplies the space. Under the same hypothesis a binder (x : X)119-- is a set variable with x ∈ X.carrier, and x ∈ X, U ⊆ X, and ∀ x ∈ X120-- are read at the carrier.121notationinfix50"⇝"=> Converges(X, _, _) viahypothesis TopologicalSpace(X) for X.carrier122123-- The interior of A is the largest open set inside A, its closure the124-- smallest closed set around it, and its boundary the closure minus the125-- interior. interiorIn(T, A), closure(A, T, S), and boundary(A, T, S)126-- remain the forms over separate pieces.127def interior (X A : Set) : Set:= interiorIn(TopologicalSpace.opens(X), A)128def closure (X A : Set) : Set:=129 closure(TopologicalSpace.carrier(X), TopologicalSpace.opens(X), A)130def boundary (X A : Set) : Set:=131 boundary(TopologicalSpace.carrier(X), TopologicalSpace.opens(X), A)132133theorem interior.parts (X A : Set)134shows interior(X, A) = interiorIn(TopologicalSpace.opens(X), A)135proof136simp [interior]137138theorem closure.parts (X A : Set)139shows closure(X, A) =140 closure(TopologicalSpace.carrier(X), TopologicalSpace.opens(X), A)141proof142simp [closure]143144theorem boundary.parts (X A : Set)145shows boundary(X, A) =146 boundary(TopologicalSpace.carrier(X), TopologicalSpace.opens(X), A)147proof148simp [boundary]149150section OpenLaws151variable (X : Set)152hypothesis space : TopologicalSpace(X)153154-- Open(X, U) and U ∈ X.opens are the same fact; the forward direction is155-- an instance, so an engine requirement U ∈ X.opens is read off Open(X, U).156instance Open.mem (U : Set)157requiresopen : Open(X, U)158shows U ∈ X.opens159proof160unfold Open atopen161exactopen162163theorem Open.of_mem (U : Set)164requires member : U ∈ X.opens165shows Open(X, U)166proof167unfold Open168exact member169170theorem Open.subset (U : Set)171requiresopen : Open(X, U)172shows U ⊆ X173proof174have member := Open.mem withopen175exact IsTopology.subset with*176177theorem Open.point (U x : Set)178requiresopen : Open(X, U)179requires hx : x ∈ U180shows x ∈ X181proof182have inside := Open.subset withopen183exact inside with x, hx184185-- Closure: the carrier, the empty set, binary intersections, and unions of186-- open sets are open. These are instances, so openness of a compound set is187-- synthesized.188instance Open.carrier189shows Open(X, X.carrier)190proof191have parts := TopologicalSpace.parts with space192unfold Open193exact IsTopology.whole with*194195instance Open.empty_set196shows Open(X, ∅)197proof198have parts := TopologicalSpace.parts with space199unfold Open200exact IsTopology.empty with*201202instance Open.inter (U V : Set)203requires openU : Open(X, U)204requires openV : Open(X, V)205shows Open(X, U ∩ V)206proof207have parts := TopologicalSpace.parts with space208have memberU := Open.mem with openU209have memberV := Open.mem with openV210unfold Open211exact IsTopology.intersection2 with*212213instance Open.union (U V : Set)214requires openU : Open(X, U)215requires openV : Open(X, V)216shows Open(X, U ∪ V)217proof218have parts := TopologicalSpace.parts with space219have memberU := Open.mem with openU220have memberV := Open.mem with openV221unfold Open222exact IsTopology.union2 with*223224theorem Open.family_union (S : Set)225requires opens : ∀ U ∈ S, Open(X, U)226shows Open(X, ⋃(S))227proof228have parts := TopologicalSpace.parts with space229have inside : S ⊆ X.opens230intros U hU231exact Open.mem with (opens with U, hU)232unfold Open233exact IsTopology.union with*234235theorem Open.finite_inter (S : Set)236requires finite : Finite(S)237requires nonempty : Nonempty(S)238requires opens : ∀ U ∈ S, Open(X, U)239shows Open(X, ⋂(S))240proof241have parts := TopologicalSpace.parts with space242have inside : S ⊆ X.opens243intros U hU244exact Open.mem with (opens with U, hU)245unfold Open246exact IsTopology.finite_intersection with*247248-- Closed sets.249instance Closed.parts (C : Set)250requires closed : Closed(X, C)251shows IsClosed(X.carrier, X.opens, C)252proof253unfold Closed at closed254exact closed255256theorem Closed.of_parts (C : Set)257requires closed : IsClosed(X.carrier, X.opens, C)258shows Closed(X, C)259proof260unfold Closed261exact closed262263theorem Closed.subset (C : Set)264requires closed : Closed(X, C)265shows C ⊆ X266proof267have parts := Closed.parts with closed268exact parts.left269270theorem Closed.compl_open (C : Set)271requires closed : Closed(X, C)272shows Open(X, complement(X.carrier, C))273proof274have parts := Closed.parts with closed275unfold Open276exact parts.right277278theorem Open.compl_closed (U : Set)279requiresopen : Open(X, U)280shows Closed(X, complement(X.carrier, U))281proof282have member := Open.mem withopen283unfold Closed284exact Space.Open.complement_closed with*285286instance Closed.carrier287shows Closed(X, X.carrier)288proof289unfold Closed290exact Space.IsClosed.whole with*291292instance Closed.empty_set293shows Closed(X, ∅)294proof295unfold Closed296exact Space.IsClosed.empty with*297298instance Closed.union (C D : Set)299requires closedC : Closed(X, C)300requires closedD : Closed(X, D)301shows Closed(X, C ∪ D)302proof303have partsC := Closed.parts with closedC304have partsD := Closed.parts with closedD305unfold Closed306exact IsClosed.union2 with*307308instance Closed.inter (C D : Set)309requires closedC : Closed(X, C)310requires closedD : Closed(X, D)311shows Closed(X, C ∩ D)312proof313have partsC := Closed.parts with closedC314have partsD := Closed.parts with closedD315unfold Closed316exact IsClosed.intersection2 with*317318theorem Closed.family_inter (S : Set)319requires nonempty : Nonempty(S)320requires closed : ∀ C ∈ S, Closed(X, C)321shows Closed(X, ⋂(S))322proof323have pieces : ∀ C ∈ S, IsClosed(X.carrier, X.opens, C)324intros C hC325exact Closed.parts with (closed with C, hC)326unfold Closed327exact IsClosed.family_intersection with*328329-- The textbook law: a set is open exactly when it is a neighborhood of each330-- of its points.331theorem Neighborhood.of_open (U x : Set)332requiresopen : Open(X, U)333requires hx : x ∈ U334shows Neighborhood(X, U, x)335proof336have member := Open.mem withopen337have inside := Open.subset withopen338unfold Neighborhood339exact⟨inside, U, member, hx, (Subset.reflexive at U)⟩340341theorem Neighborhood.point (N x : Set)342requires neighborhood : Neighborhood(X, N, x)343shows x ∈ N344proof345obtain⟨inside, U, hU, hxU, hUN⟩:= neighborhood346exact hUN with x, hxU347348theorem Neighborhood.superset (N M x : Set)349requires neighborhood : Neighborhood(X, N, x)350requires hNM : N⊆ M351requires hM : M ⊆ X352shows Neighborhood(X, M, x)353proof354obtain⟨inside, U, hU, hxU, hUN⟩:= neighborhood355unfold Neighborhood356exact⟨hM, U, hU, hxU, (Subset.transitive with hUN, hNM)⟩357358theorem Neighborhood.inter (N M x : Set)359requires first : Neighborhood(X, N, x)360requires second : Neighborhood(X, M, x)361shows Neighborhood(X, N ∩ M, x)362proof363have parts := TopologicalSpace.parts with space364obtain⟨insideN, U, hU, hxU, hUN⟩:= first365obtain⟨insideM, V, hV, hxV, hVM⟩:= second366have both : U ∩ V ∈ X.opens := IsTopology.intersection2 with*367have point : x ∈ U ∩ V368exact intersection.membership.backward with⟨hxU, hxV⟩369have below := intersection.subset_left at N, M370have inside : N∩ M ⊆ X.carrier := Subset.transitive with below, insideN371unfold Neighborhood372refine⟨inside, U ∩ V, both, point, ?_⟩373exact intersection.monotone with hUN, hVM374375theorem Open.iff_neighborhoods (U : Set)376requires hU : U ⊆ X377shows Open(X, U) ↔∀ x ∈ U, Neighborhood(X, U, x)378proof379have parts := TopologicalSpace.parts with space380constructor381 . introsopen x hx382exact Neighborhood.of_open with*383 . intro around384have cover : U =⋃(openSubsets(X.opens, U))385apply Subset.antisymmetric386 . intros x hx387obtain⟨inside, V, hV, hxV, hVU⟩:= around with x, hx388have member : V ∈ openSubsets(X.opens, U)389exact openSubsets.membership.backward with⟨hV, hVU⟩390exact union.contains with member, hxV391 . apply union.subset392intros V hV393have pieces := openSubsets.membership.forward with hV394exact pieces.right395have inside : openSubsets(X.opens, U) ⊆ X.opens396intros V hV397have pieces := openSubsets.membership.forward with hV398exact pieces.left399rw cover400exact Open.of_mem with (IsTopology.union with*)401402end OpenLaws403404section InteriorClosureLaws405variable (X : Set)406hypothesis space : TopologicalSpace(X)407408-- The interior laws, under their standard names.409instance interior_open (A : Set)410shows Open(X, interior(X, A))411proof412have parts := TopologicalSpace.parts with space413unfold Open414rw interior.parts415exact interiorIn.open with*416417theorem interior_subset (A : Set)418shows interior(X, A) ⊆ A419proof420rw interior.parts421exact interiorIn.subset at X.opens, A422423theorem interior_maximal (A U : Set)424requiresopen : Open(X, U)425requires inside : U ⊆ A426shows U ⊆ interior(X, A)427proof428have member := Open.mem withopen429rw interior.parts430exact interiorIn.greatest with*431432theorem interior_eq_of_open (U : Set)433requiresopen : Open(X, U)434shows interior(X, U) = U435proof436have member := Open.mem withopen437rw interior.parts438exact interiorIn.of_open with*439440theorem interior_eq_iff_open (U : Set)441shows interior(X, U) = U ↔ Open(X, U)442proof443constructor444 . intro equal445rw← equal446exact interior_open with*447 . introopen448exact interior_eq_of_open with*449450theorem mem_interior (A x : Set)451shows x ∈ interior(X, A) ↔∃ U, Open(X, U) ∧ x ∈ U ∧ U ⊆ A452proof453rw interior.parts454have characterization := interiorIn.membership at X.opens, A, x455constructor456 . intro hx457obtain⟨U, hU, hxU, hUA⟩:= characterization.forward with hx458exact⟨U, (Open.of_mem with hU), hxU, hUA⟩459 . intro inside460obtain⟨U, open, hxU, hUA⟩:= inside461have member := Open.mem withopen462exact characterization.backward with⟨U, member, hxU, hUA⟩463464theorem interior_mono (A B : Set)465requires hAB : A ⊆ B466shows interior(X, A) ⊆ interior(X, B)467proof468have parts := TopologicalSpace.parts with space469rw [interior.parts, interior.parts]470exact interiorIn.monotone with*471472theorem interior_interior (A : Set)473shows interior(X, interior(X, A)) = interior(X, A)474proof475have parts := TopologicalSpace.parts with space476rw [interior.parts, interior.parts]477exact interiorIn.idempotent with*478479theorem interior_inter (A B : Set)480shows interior(X, A ∩ B) = interior(X, A) ∩ interior(X, B)481proof482have parts := TopologicalSpace.parts with space483rw [interior.parts, interior.parts, interior.parts]484exact interiorIn.intersection2 with*485486theorem interior_whole487shows interior(X, X.carrier) = X.carrier488proof489have parts := TopologicalSpace.parts with space490rw interior.parts491exact interiorIn.whole with*492493theorem interior_empty494shows interior(X, ∅) =∅495proof496have parts := TopologicalSpace.parts with space497rw interior.parts498exact interiorIn.empty with*499500-- The closure laws.501instance closure_closed (A : Set)502requires hA : A ⊆ X503shows Closed(X, closure(X, A))504proof505have parts := TopologicalSpace.parts with space506unfold Closed507rw closure.parts508exact Space.closure.closed with*509510theorem subset_closure (A : Set)511requires hA : A ⊆ X512shows A ⊆ closure(X, A)513proof514have parts := TopologicalSpace.parts with space515rw closure.parts516exact Space.closure.contains with*517518theorem closure_minimal (A C : Set)519requires closed : Closed(X, C)520requires hAC : A ⊆ C521shows closure(X, A) ⊆ C522proof523have parts := TopologicalSpace.parts with space524have pieces := Closed.parts with closed525rw closure.parts526exact closure.least with*527528theorem closure_subset (A : Set)529requires hA : A ⊆ X530shows closure(X, A) ⊆ X531proof532have parts := TopologicalSpace.parts with space533rw closure.parts534exact Space.closure.subset with*535536theorem closure_eq_of_closed (C : Set)537requires closed : Closed(X, C)538shows closure(X, C) = C539proof540have parts := TopologicalSpace.parts with space541have pieces := Closed.parts with closed542rw closure.parts543exact closure.of_closed with*544545theorem closure_eq_iff_closed (C : Set)546requires hC : C ⊆ X547shows closure(X, C) = C ↔ Closed(X, C)548proof549constructor550 . intro equal551rw← equal552exact closure_closed with*553 . intro closed554exact closure_eq_of_closed with*555556theorem closure_mono (A B : Set)557requires hB : B ⊆ X558requires hAB : A ⊆ B559shows closure(X, A) ⊆ closure(X, B)560proof561have parts := TopologicalSpace.parts with space562rw [closure.parts, closure.parts]563exact closure.monotone with*564565theorem closure_closure (A : Set)566requires hA : A ⊆ X567shows closure(X, closure(X, A)) = closure(X, A)568proof569have parts := TopologicalSpace.parts with space570rw [closure.parts, closure.parts]571exact closure.idempotent with*572573theorem closure_union (A B : Set)574requires hA : A ⊆ X575requires hB : B ⊆ X576shows closure(X, A ∪ B) = closure(X, A) ∪ closure(X, B)577proof578have parts := TopologicalSpace.parts with space579rw [closure.parts, closure.parts, closure.parts]580exact closure.union2 with*581582theorem closure_whole583shows closure(X, X.carrier) = X.carrier584proof585have parts := TopologicalSpace.parts with space586rw closure.parts587exact closure.whole with*588589theorem closure_empty590shows closure(X, ∅) =∅591proof592have parts := TopologicalSpace.parts with space593rw closure.parts594exact closure.empty with*595596-- A point lies in the closure of A exactly when every open set around it597-- meets A.598theorem mem_closure (A x : Set)599requires hA : A ⊆ X600shows x ∈ closure(X, A) ↔601 x ∈ X ∧ (∀ U, Open(X, U) → x ∈ U → Nonempty(U ∩ A))602proof603have parts := TopologicalSpace.parts with space604rw closure.parts605have criterion := closure.membership at X.carrier, X.opens, A, x with parts, hA606constructor607 . intro hx608obtain⟨inX, meets⟩:= criterion.forward with hx609refine⟨inX, ?_⟩610intros U open hxU611have member := Open.mem withopen612exact meets with U, member, hxU613 . intro meets614obtain⟨inX, touches⟩:= meets615apply criterion.backward616refine⟨inX, ?_⟩617intros U hU hxU618exact touches with U, (Open.of_mem with hU), hxU619620theorem interior_subset_closure (A : Set)621requires hA : A ⊆ X622shows interior(X, A) ⊆ closure(X, A)623proof624have parts := TopologicalSpace.parts with space625rw [interior.parts, closure.parts]626exact interiorIn.subset_closure with*627628theorem closure_complement (A : Set)629requires hA : A ⊆ X630shows closure(X, complement(X.carrier, A)) =631 complement(X.carrier, interior(X, A))632proof633have parts := TopologicalSpace.parts with space634rw [interior.parts, closure.parts]635exact closure.complement with*636637theorem interior_complement (A : Set)638requires hA : A ⊆ X639shows interior(X, complement(X.carrier, A)) =640 complement(X.carrier, closure(X, A))641proof642have parts := TopologicalSpace.parts with space643rw [interior.parts, closure.parts]644exact interiorIn.complement with*645646-- The boundary.647theorem mem_boundary (A x : Set)648shows x ∈ boundary(X, A) ↔ x ∈ closure(X, A) ∧¬x ∈ interior(X, A)649proof650rw [boundary.parts, closure.parts, interior.parts]651exact boundary.membership at X.carrier, X.opens, A, x652653instance boundary_closed (A : Set)654requires hA : A ⊆ X655shows Closed(X, boundary(X, A))656proof657have parts := TopologicalSpace.parts with space658unfold Closed659rw boundary.parts660exact ClosureLaws.boundary.closed with*661662-- Dense sets.663instance Dense.parts (A : Set)664requires dense : Dense(X, A)665shows IsDense(X.carrier, X.opens, A)666proof667unfold Dense at dense668exact dense669670theorem Dense.of_parts (A : Set)671requires dense : IsDense(X.carrier, X.opens, A)672shows Dense(X, A)673proof674unfold Dense675exact dense676677theorem Dense.closure (A : Set)678requires dense : Dense(X, A)679shows closure(X, A) = X.carrier680proof681have parts := Dense.parts with dense682rw closure.parts683unfold IsDense at parts684exact parts685686theorem Dense.carrier687shows Dense(X, X.carrier)688proof689have parts := TopologicalSpace.parts with space690unfold Dense691exact ClosureLaws.IsDense.whole with*692693theorem Dense.iff_meets (A : Set)694requires hA : A ⊆ X695shows Dense(X, A) ↔∀ U, Open(X, U) → Nonempty(U) → Nonempty(U ∩ A)696proof697have parts := TopologicalSpace.parts with space698have characterization := ClosureLaws.IsDense.iff_meets_open with*699constructor700 . intros dense U open inhabited701have pieces := Dense.parts with dense702have member := Open.mem withopen703exact characterization.forward with pieces, U, member, inhabited704 . intro meets705have pieces : ∀ U ∈ X.opens, Nonempty(U) → Nonempty(U ∩ A)706intros U hU inhabited707exact meets with U, (Open.of_mem with hU), inhabited708exact Dense.of_parts with (characterization.backward with pieces)709710end InteriorClosureLaws711712-- The topology rewrite set: the idempotent and distributive laws of713-- interior and closure, their values on the carrier and the empty set, and714-- their values on open and closed sets.715tactic topology_simp :=simp [interior_interior, closure_closure, interior_inter, closure_union, interior_whole, interior_empty, closure_whole, closure_empty, interior_eq_of_open, closure_eq_of_closed]716717section ConvergenceLaws718variable (X : Set)719hypothesis space : TopologicalSpace(X)720721theorem Converges.sequence (u x : Set)722requires converges : u ⇝ x723shows u : ℕ → X.carrier724proof725obtain⟨sequence, point, eventually⟩:= converges726exact sequence727728theorem Converges.limit_mem (u x : Set)729requires converges : u ⇝ x730shows x ∈ X731proof732obtain⟨sequence, point, eventually⟩:= converges733exact point734735theorem Converges.eventually (u x U : Set)736requires converges : u ⇝ x737requiresopen : Open(X, U)738requires hx : x ∈ U739shows∃ N ∈ ℕ, ∀ n ∈ ℕ, N ≤ n → u(n) ∈ U740proof741obtain⟨sequence, point, eventually⟩:= converges742have member := Open.mem withopen743exact eventually with U, member, hx744745theorem Converges.of_eventually (u x : Set)746requires sequence : u : ℕ → X.carrier747requires point : x ∈ X748requires eventually : ∀ U, Open(X, U) → x ∈ U →749∃ N ∈ ℕ, ∀ n ∈ ℕ, N ≤ n → u(n) ∈ U750shows u ⇝ x751proof752unfold Converges753refine⟨sequence, point, ?_⟩754intros U hU hxU755exact eventually with U, (Open.of_mem with hU), hxU756757-- A constant sequence converges to its value.758theorem Converges.constant (x : Set)759requires point : x ∈ X760shows constantFunction(ℕ, X.carrier, x) ⇝ x761proof762have sequence := constantFunction.function at ℕ, X.carrier, x with point763have eventually : ∀ U, Open(X, U) → x ∈ U →764∃ N ∈ ℕ, ∀ n ∈ ℕ, N ≤ n →765apply(constantFunction(ℕ, X.carrier, x), n) ∈ U766intros U open hxU767have zeroIn : (0:N) ∈ ℕ bytypecheck768witness (0:N)769refine⟨zeroIn, ?_⟩770intros n hn order771have value := constantFunction.apply at ℕ, X.carrier, n, x with hn, point772rw value773exact hxU774exact Converges.of_eventually with*775776end ConvergenceLaws777778-- Bridges for the remaining properties: each bundled-to-unbundled779-- direction is an instance, so `with *` reads the form over separate pieces780-- off the bundled hypothesis.781section PropertyBridges782variable (X : Set)783hypothesis space : TopologicalSpace(X)784785instance Compact.parts (A : Set)786requires compact : Compact(X, A)787shows IsCompact(X.carrier, X.opens, A)788proof789unfold Compact at compact790exact compact791792theorem Compact.of_parts (A : Set)793requires compact : IsCompact(X.carrier, X.opens, A)794shows Compact(X, A)795proof796unfold Compact797exact compact798799instance ConnectedSubset.parts (A : Set)800requires connected : ConnectedSubset(X, A)801shows IsConnectedSubset(X.carrier, X.opens, A)802proof803unfold ConnectedSubset at connected804exact connected805806theorem ConnectedSubset.of_parts (A : Set)807requires connected : IsConnectedSubset(X.carrier, X.opens, A)808shows ConnectedSubset(X, A)809proof810unfold ConnectedSubset811exact connected812813end PropertyBridges814815instance Compact.space_parts (X : Set)816requires compact : Compact(X)817shows IsCompact(X.carrier, X.opens, X.carrier)818proof819unfold Compact at compact820exact compact821822theorem Compact.of_space_parts (X : Set)823requires compact : IsCompact(X.carrier, X.opens, X.carrier)824shows Compact(X)825proof826unfold Compact827exact compact828829instance Hausdorff.parts (X : Set)830requires hausdorff : Hausdorff(X)831shows IsHausdorff(X.carrier, X.opens)832proof833unfold Hausdorff at hausdorff834exact hausdorff835836theorem Hausdorff.of_parts (X : Set)837requires hausdorff : IsHausdorff(X.carrier, X.opens)838shows Hausdorff(X)839proof840unfold Hausdorff841exact hausdorff842843instance T1Space.parts (X : Set)844requires t1 : T1Space(X)845shows IsT1Space(X.carrier, X.opens)846proof847unfold T1Space at t1848exact t1849850theorem T1Space.of_parts (X : Set)851requires t1 : IsT1Space(X.carrier, X.opens)852shows T1Space(X)853proof854unfold T1Space855exact t1856857instance Connected.parts (X : Set)858requires connected : Connected(X)859shows IsConnected(X.carrier, X.opens)860proof861unfold Connected at connected862exact connected863864theorem Connected.of_parts (X : Set)865requires connected : IsConnected(X.carrier, X.opens)866shows Connected(X)867proof868unfold Connected869exact connected870871-- The same bridges for a constructed space: a fact over the pieces (A, T)872-- is the bundled fact at TopologicalSpace.mk(A, T).873theorem Open.of_mk (A T U : Set)874requires topology : IsTopology(A, T)875requires member : U ∈ T876shows Open(TopologicalSpace.mk(A, T), U)877proof878have space := TopologicalSpace.of_parts with topology879have shifted : U ∈ TopologicalSpace.opens(TopologicalSpace.mk(A, T))880 topology_projections881exact Open.of_mem with space, shifted882883theorem Closed.of_mk (A T C : Set)884requires topology : IsTopology(A, T)885requires closed : IsClosed(A, T, C)886shows Closed(TopologicalSpace.mk(A, T), C)887proof888have space := TopologicalSpace.of_parts with topology889have shifted : IsClosed(TopologicalSpace.carrier(TopologicalSpace.mk(A, T)),890 TopologicalSpace.opens(TopologicalSpace.mk(A, T)), C)891 topology_projections892exact Closed.of_parts with space, shifted893894theorem Compact.of_mk (A T S : Set)895requires topology : IsTopology(A, T)896requires compact : IsCompact(A, T, S)897shows Compact(TopologicalSpace.mk(A, T), S)898proof899have space := TopologicalSpace.of_parts with topology900have shifted : IsCompact(TopologicalSpace.carrier(TopologicalSpace.mk(A, T)),901 TopologicalSpace.opens(TopologicalSpace.mk(A, T)), S)902 topology_projections903exact Compact.of_parts with space, shifted904905theorem ConnectedSubset.of_mk (A T S : Set)906requires topology : IsTopology(A, T)907requires connected : IsConnectedSubset(A, T, S)908shows ConnectedSubset(TopologicalSpace.mk(A, T), S)909proof910have space := TopologicalSpace.of_parts with topology911have shifted : IsConnectedSubset(912 TopologicalSpace.carrier(TopologicalSpace.mk(A, T)),913 TopologicalSpace.opens(TopologicalSpace.mk(A, T)), S)914 topology_projections915exact ConnectedSubset.of_parts with space, shifted916917theorem Hausdorff.of_mk (A T : Set)918requires hausdorff : IsHausdorff(A, T)919shows Hausdorff(TopologicalSpace.mk(A, T))920proof921unfold Hausdorff922 topology_projections923924theorem T1Space.of_mk (A T : Set)925requires t1 : IsT1Space(A, T)926shows T1Space(TopologicalSpace.mk(A, T))927proof928unfold T1Space929 topology_projections930931theorem Connected.of_mk (A T : Set)932requires connected : IsConnected(A, T)933shows Connected(TopologicalSpace.mk(A, T))934proof935unfold Connected936 topology_projections937938theorem Compact.of_space_mk (A T : Set)939requires compact : IsCompact(A, T, A)940shows Compact(TopologicalSpace.mk(A, T))941proof942unfold Compact943 topology_projections944