Scaffolding for the arc-complement theorem #
thm:arc-complement — a simple arc does not separate the plane — is proved by covering the
arc with a chain of small axis-parallel squares, overlaying their boundaries into one plane
graph G, and showing that the two given points lie in the outer face of G, which is then
disjoint from the arc. This module builds everything in that proof that does not need the
outer-chain lemma (lem:outer-chain), so that the theorem itself becomes a short assembly.
What is here #
The square boundary as a polygon.
Schoenflies.squarePolygon c hr : ClosedPolygon 1is the axis-parallel square ofℓ^∞-radiusraboutc, presented the way the parity and overlay machinery consume a polygon — as aClosedPolygon, not as a set. Its carrier isfrontier (Plane.closedSquare c r)(carrier_squarePolygon), and the polygonal Jordan curve theorem then hands over that this frontier is a Jordan curve, is polygonal, and is separating, withinsidethe open square andoutsidethe complement of the closed one.Schoenflies.modelCurveis the casec = 0,r = 1as a set; nothing there is aClosedPolygon, so nothing there could be fed to the overlay.Two nearby congruent squares meet twice. The route taken is the coordinate one, not the blueprint's topological one, because the meeting points can be written down: a vertical side of one square crosses a horizontal side of the other, transversally, in a single point. That "single point" is exactly what
Schoenflies.MeetsAreCutneeds to turn a meeting point into a vertex of the overlay graph, which is whatGraph.IsTwoConnected.unionconsumes. Seeexists_two_common_verticesand the discussion before it.The uniform-continuity partition.
Schoenflies.sample n i = i / nis the even partition of[0,1];exists_meshsays that fornlarge enough — andnmay be asked to be a multiple of any prescribedk, which is what makes the fine partition refine the coarse one — every point ofα '' [t i, t (i+1)]is withinεofα (t i).Nonadjacent subarcs are at positive distance.
exists_pos_dist_nonadjacent.The covering clause.
image_subset_iUnion_closedSquare: the closed squares of radiusεabout the samples cover the arc.
Blueprint #
squarePolygon,carrier_squarePolygon— the square boundary of the proof ofthm:arc-complement("around every sample draw the boundary of the axis-parallel square ofℓ^∞-radiusδ/4"), as a polygon.isJordanCurve_frontier_closedSquare,isPolygonal_frontier_closedSquare,isSeparating_frontier_closedSquare,inside_frontier_closedSquare,outside_frontier_closedSquare—thm:polygonal-jordanspecialised to the square.exists_two_meets,exists_two_frontier_inter— "their boundary cycles therefore meet in at least two points",thm:arc-complement;exists_two_meetsis the sharp form, in which each meeting point is a transversal crossing of two sides.exists_two_common_vertices,exists_two_cut_points,exists_overlayPiece_end_subset— the bridge from "two common points" to the two common vertices thatlem:union-two-connected(Graph.IsTwoConnected.union) consumes.sample,exists_mesh— "By uniform continuity, choose a partition …", used twice inthm:arc-complementand again inprop:anchored-square-mesh.exists_pos_dist_nonadjacent— "Nonadjacent compact subarcs are disjoint, hence at positive distance bylem:compact-separation(b)".image_subset_iUnion_closedSquare— "Every point ofAlies in or on one of the small squares".
Part 1: the boundary of a square, as a polygon #
Everything is done in coordinates. The four corners are named, the four sides are the four
segments between consecutive corners, and the two lemmas Plane.mem_seg_horiz and
Plane.mem_seg_vert of Schoenflies/ModelCurve.lean reduce membership of a side to a pair of
scalar conditions.
The boundary of a square is the union of its four sides.
The square as a ClosedPolygon #
Four corners in counterclockwise order. edges_meet splits into the four adjacent pairs,
where segment_inter_shared applies because consecutive sides are perpendicular, and the two
opposite pairs, which are disjoint because opposite sides are pinned to different values of
one coordinate.
**The boundary of the axis-parallel square of ℓ^∞-radius r about c, as a closed
polygon.**This is the presentation the overlay and parity machinery consume;
Schoenflies.modelCurve is the case c = 0, r = 1 but only as a set.
Equations
Instances For
The polygon carries the boundary of the square. This is the identification that lets
the polygonal Jordan curve theorem be read as a statement about frontier (closedSquare c r),
and it is what the overlay consumes.
What the polygonal Jordan curve theorem says about a square #
All four clauses come from main; only the identification of the two regions is new, and it
is Plane.connectedComponentIn_eq_of_frontier_disjoint twice: once for the open square and
once for its complement.
A closed square is bounded — the statement for an arbitrary centre.
Graph.isBounded_closedSquare is the same fact for the centre 0 only.
The outside of a square about c contains the outside of a large square about the
origin, hence is unbounded.
Membership in the outside of a square, as membership in a translate of beyondSquare.
The plane outside a closed square is connected: a translate of beyondSquare.
The complement of the boundary is the open square together with the outside.
The frontier of the open square lies in the frontier of the closed one. That inclusion
is all lem:recognizing-a-component needs.
The inside of a square boundary is the open square.
The outside of a square boundary is the complement of the closed square.
Part 2: two nearby congruent squares meet twice #
The blueprint (thm:arc-complement) argues topologically: neither congruent square contains
the other, so each boundary has nonempty relatively open parts inside the other open square and
outside the other closed square, and a single intersection point could not disconnect a
connected boundary curve.
The route taken here is the coordinate one, and it proves more than the blueprint asks.
Write the two centres as c₁ and c₂ = c₁ + (a, b) with |a|, |b| < r. Then
- the vertical side of
S₁on the side ofc₂crosses the horizontal side ofS₂away fromc₁, in the single point(c₁₀ ± r, c₂₁ ∓ r); - the horizontal side of
S₁away fromc₂crosses the vertical side ofS₂on the side ofc₁, in the single point(c₂₀ ∓ r, c₁₁ ± r);
and the two points differ because their first coordinates differ by 2r - |a| ≠ 0. Each is a
transversal crossing — the meet of the two sides is a singleton, not a segment — which is
exactly what MeetsAreCut turns into a cut point and hence into a vertex of the overlay
graph. Two common points would not be enough for Graph.IsTwoConnected.union, which wants two
common vertices; see exists_two_common_vertices.
The four sides of the square of ℓ^∞-radius r about c, as Pieces, in the same cyclic
order as squarePolygon.
Equations
Instances For
A vertical side crosses a horizontal side in one point #
Two congruent axis-parallel squares whose centres are less than one radius apart have boundaries meeting in at least two points, and each meeting point is a transversal crossing: the two sides that produce it meet in a singleton.
The two centres are not required to be distinct — for equal centres the two squares coincide and the two points produced are two of the four corners, which is what the blueprint's "or coincide" allows.
From a meeting point to a vertex of the overlay #
Graph.IsTwoConnected.union needs two common vertices, not two common points. The
overlay's cut-point condition MeetsAreCut says that both ends of the meet of two source
pieces are cut points; when the meet is a singleton both ends are that one point, so the
crossing point is a cut point, and overlayGraph_mem_vertexSet_of_mem_cover promotes a cut
point on the union to a vertex. This is the whole bridge, and it is why exists_two_meets is
stated with singleton meets rather than with mere common points.
A transversal crossing of two source pieces is a cut point of any overlay built on them, hence a vertex of the overlay graph.
The crossing point lies on both square boundaries.
The blueprint's statement: the two boundaries meet in at least two points.
Two nearby squares contribute two common vertices to any overlay containing both.
This is the form Graph.IsTwoConnected.union consumes: a ≠ b, with both a and b vertices
of the graphs being joined. What is not proved here — because it depends on how the next
wave splits one overlay into the pieces it unions — is that p and q are vertices of the two
subgraphs Γ and Γ' separately. The extra fact needed for that is recorded by
exists_two_cut_points below: p and q are cut points lying on each of the two boundaries,
so overlayGraph_mem_vertexSet_of_mem_cover places them in the vertex set of whichever
sub-overlay covers the boundary in question.
Localizing a cut point to one source piece #
overlayGraph_mem_vertexSet_of_mem_cover says a cut point on the union is a vertex, but it
says nothing about which edge it is an end of. The next wave has to place the two common
points of two neighbouring squares in the vertex sets of the two graphs being unioned, and for
that the edge must be pinned inside the boundary it came from. The three lemmas below do that;
the first two are general facts about subdivide whose home is Schoenflies/Subdivide.lean.
A cut point on a source piece is an end of an overlay edge inside that source piece.
This is overlayGraph_mem_vertexSet_of_mem_cover with the witnessing edge named and pinned:
the edge lies inside the prescribed source segment, so a subgraph spanned by the edges inside
that segment has the point among its vertices.
The localizable form: two distinct cut points, each lying on both square boundaries.
Feed a cut point together with "it lies on the union carried by Γ" to
overlayGraph_mem_vertexSet_of_mem_cover to get a vertex of Γ.
Part 3: the uniform-continuity partition #
The blueprint asks for "a partition 0 = t₀ < t₁ < ⋯ < t_k = 1, with k ≥ 3, such that every
point of α([t_{i-1}, t_i]) is at distance less than ε from α(t_{i-1})", and separately for
a refinement of it inside each piece. Both are served by the even partition: nothing in
the proof uses anything about the partition beyond the mesh bound, and taking t_i = i/n
makes "the fine partition refines the coarse one" the arithmetic identity sample (k*m) (i*m) = sample k i rather than a bookkeeping argument. The number of pieces can be forced to be a
multiple of any prescribed k and hence as large as one likes, which covers the k ≥ 3
clause.
The i-th point of the even partition of [0,1] into n pieces.
Equations
- Schoenflies.sample n i = ↑i / ↑n
Instances For
The uniform-continuity partition. For every ε > 0 and every prescribed k > 0 there
is a multiple k * m of k such that on each cell of the even partition into k * m pieces
the map moves by less than ε. Taking k = 1 gives the plain statement; taking k to be the
size of a coarser partition makes this one a refinement of it, by sample_mul.
Part 4: nonadjacent subarcs are at positive distance #
The i-th subarc of the even partition of an arc into n pieces.
Equations
- Schoenflies.subarcCell α n i = α '' Set.Icc (Schoenflies.sample n i) (Schoenflies.sample n (i + 1))
Instances For
Nonadjacent cells of an injective parametrisation are disjoint: their parameter intervals are, and injectivity carries that to the images.
Nonadjacent subarcs are at positive distance — the blueprint's δ'. A finite family
of positive separations, merged by exists_pos_forall_of_finite.
Part 5: the covering clause #
Every point of the arc lies in or on one of the small squares. This is what makes the outer face of the assembled graph disjoint from the arc: a point of the arc is either inside one of the squares — and then separated from the outer face by that square's boundary cycle — or on one, and then it is a point of the graph.
The shape of lem:outer-chain this module expects to be handed #
This is a note to the integrator, not a declaration. thm:arc-complement consumes the
outer-chain lemma exactly once, and the form that makes the assembly short is the following.
Γ : ℕ → Graph Plane Piece are the chain graphs, all subgraphs of one overlay graph G
built from the concatenation of the squarePieces of every sample — so that "after subdividing
common points into vertices" is discharged by construction rather than assumed, and so that all
the Γ i are Graph.Compatible with each other for free (they share edge names because they
share the ambient edge type Piece).
theorem outer_chain {k : ℕ} (hk : 3 ≤ k) (Γ : ℕ → Graph Plane Piece)
(drawing : Piece → ℝ → Plane)
(hfin : ∀ i < k, (Γ i).Finite)
(hdraw : ∀ i < k, Graph.IsDrawing (Γ i) drawing)
(h2c : ∀ i < k, (Γ i).IsTwoConnected)
(hshare : ∀ i, i + 1 < k → ∃ a b : Plane, a ≠ b ∧
a ∈ V(Γ i) ∧ a ∈ V(Γ (i+1)) ∧ b ∈ V(Γ i) ∧ b ∈ V(Γ (i+1)))
(hfar : ∀ i j, i < k → j < k → i + 2 ≤ j →
Disjoint (Graph.pointSet (Γ i) drawing) (Graph.pointSet (Γ j) drawing))
{x : Plane}
(houter : ∀ i, i + 1 < k → ¬ Bornology.IsBounded
(Graph.face ((Γ i).union (Γ (i+1))) drawing x)) :
¬ Bornology.IsBounded (Graph.face (chainUnion Γ k) drawing x)
with chainUnion Γ k the fold of Graph.union over i < k, exported as a def with
vertexSet / edgeSet / IsLink lemmas. Three things matter for the join:
- "outer face" must be stated as
¬ IsBounded (face …), not asface … = face … basefor some chosen base point.Graph.exists_unbounded_faceandGraph.unbounded_face_uniquemake the two equivalent, but the arc-complement proof gets its hypothesis fromGraph.beyondSquare_subset_faceapplied to a containing square, which is naturally an unboundedness statement aboutx's own face. hsharemust be about vertices, which is whatexists_two_common_verticesandexists_two_cut_points+exists_overlayPiece_end_subsetabove deliver. Two common points would not compose withGraph.IsTwoConnected.union.hfaris about point sets, not vertex sets. The arc-complement proof gets it fromexists_pos_dist_nonadjacent: nonadjacent samples are at distance≥ δwhile the squares have radiusδ/4, so the two point sets areδ/2apart.