Documentation

LeanPool.Schoenflies.Graph.K33Land

lem:k33 and cor:k33-subdivision, with nothing assumed #

Schoenflies/Graph/K33Planar.lean proves the nonplanarity of K(3,3) from Graph.IsHexRealization; Schoenflies/Graph/K33Closed.lean reduces that to Graph.Bendable — "every polygonal drawing can be redrawn so that no two edges leave a vertex along one line". This module removes the hypothesis altogether. Nothing is bent.

Where the hypothesis came from, and why it is not needed #

Schoenflies.ClosedPolygon carries a corner field, and Schoenflies.ClosedPolygon.isCornerAt_vertex shows the field is not slack: every vertex of every ClosedPolygon presentation is a point at which the curve turns. So a crosscut interface phrased with ClosedPolygons — Schoenflies.IsPolygonalCrosscut, and hence Schoenflies.alternating_crosscuts — can only cut the curve at corners, and a drawn K(3,3) puts its branch points wherever it likes.

The blueprint's cor:alternating-crosscuts has no such condition: it is stated for a set-level simple closed polygonal curve and simple polygonal arcs with endpoints anywhere on it. The fix is to state the crosscut for Schoenflies.PrePolygon — ClosedPolygon without corner — whose vertices may sit anywhere on the curve. Schoenflies/PrePolygonSep.lean already supplies the two things Theorem 2.8 asks of such a curve: that its carrier separates the plane, and the two values of the crossing parity. Everything else in the chain is about edge lists, and edge lists do not know about corners.

The one construction this needed #

Three closed polygons enter Theorem 2.8 — the curve C and the two curves Jᵢ the crosscut forms with the two arcs — and their edge lists must agree: SameEdges Jᵢ.pieces (Aᵢ ++ K). Schoenflies/Graph/K33Closed.lean found three realizations independently and matched them with Schoenflies.ClosedPolygon.arcPieces_eq, whose proof is exactly where corner was consumed. For PrePolygon no such matching theorem can exist: two presentations of one arc need not agree.

So the two spliced curves are not found — they are built. Schoenflies.PrePolygon.exists_splice lays two chains with common ends end to end and returns a PrePolygon whose edge list is their concatenation, so the three lists agree by construction and nothing has to be matched. The chains themselves come from Schoenflies.exists_prePolygon_arcs_oriented, which needs Schoenflies.PrePolygon.insertLast of Schoenflies/PrePolygonArc.lean: a point of the curve that is not yet a vertex is interior to an edge, and an edge may be cut. That is the inverse of Schoenflies.PrePolygon.deleteLast, and it is what makes "a PrePolygon may be presented with vertices at any prescribed finite set of points of its carrier" a theorem (Schoenflies.PrePolygon.exists_prePolygon_vertices).

What this module rests on #

The Schoenflies.PrePolygon arc apparatus — chain, arcPieces, arc, arc_inter, isArcBetween_arc, parity_splitting, parity_ne_iff_mem_farRegion, insertLast, exists_prePolygon_vertices, Schoenflies.exists_prePolygon_split and the segment-cutting lemmas — is in Schoenflies/PrePolygonArc.lean, shared with Schoenflies/FaceCyclesLand.lean. Only what is peculiar to the crosscut wiring is left here.

Blueprint #

A note on names, for the integrator #

The direct statements use eliminator-style names because the realization-parametric lemmas are still in the import closure:

realization-parametric lemmadirect theorem
Graph.IsK33Config.not_isDrawing (K33Planar)Graph.IsK33Config.not_exists_isDrawing
Graph.IsK33Config.not_isDrawing_of_bendableGraph.IsK33Config.not_exists_isDrawing
Graph.IsArcK33.false_of_realization/_bendableGraph.IsArcK33.elim
Graph.IsK33Subdivision.false_of_realization/…Graph.IsK33Subdivision.elim
Graph.k33Graph_not_isDrawingGraph.k33Graph_not_exists_isDrawing

With this module in place Graph.IsHexRealization, Graph.IsHexCrosscut, Graph.IsHexGeneric and Graph.Bendable have no consumers left.

Splicing two chains into a closed polygon #

The crosscut of Theorem 2.8 asks for three closed polygons whose edge lists fit together, and independent realizations of three curves do not. The way out is to realize only the curve C, and to build the two spliced curves out of one arc of C and one presentation of the crosscut — so that the three edge lists agree by construction. This is that construction: two chains with the same pair of ends, meeting only there, laid end to end.

theorem Schoenflies.PrePolygon.exists_splice {m m' : ℕ} (P : PrePolygon m) (P' : PrePolygon m') {a : ZMod (m + 3)} {k : ℕ} {b : ZMod (m' + 3)} {l : ℕ} (hk1 : 1 ≤ k) (hk2 : k ≤ m + 2) (hl1 : 1 ≤ l) (hl2 : l ≤ m' + 2) (hstart : P'.vertex b = P.vertex (a + ↑k)) (hend : P'.vertex (b + ↑l) = P.vertex a) (hinter : P.arc a k ∩ P'.arc b l = {P.vertex a, P.vertex (a + ↑k)}) :
∃ (n : ℕ) (Q : PrePolygon n), Q.pieces = P.arcPieces a k ++ P'.arcPieces b l

Two arcs with common ends splice into a closed polygon whose edge list is their concatenation. P.arcPieces a k runs from p to q and P'.arcPieces b l runs from q back to p; the two meet only at p and q.

The polygon read backwards #

Needed only to pin the direction in which a realization traverses a prescribed arc; the Schoenflies.ClosedPolygon version is in Schoenflies/Graph/K33Closed.lean, and this is the same construction with the corner field dropped.

The same closed polygon, traversed the other way.

Equations
Instances For
    @[simp]
    theorem Schoenflies.PrePolygon.reverse_vertex {m : ℕ} (P : PrePolygon m) (j : ZMod (m + 3)) :
    theorem Schoenflies.PrePolygon.reverse_edge {m : ℕ} (P : PrePolygon m) (j : ZMod (m + 3)) :
    P.reverse.edge j = P.edge (-j - 1)
    theorem Schoenflies.PrePolygon.reverse_arc {m : ℕ} (P : PrePolygon m) (a : ZMod (m + 3)) (k : ℕ) :
    P.reverse.arc (-a - ↑k) k = P.arc a k

    Reversing does not move an arc, it only starts it at the other end.

    theorem Schoenflies.PrePolygon.sameEdges_reverse_arcPieces {m : ℕ} (P : PrePolygon m) (a : ZMod (m + 3)) (k : ℕ) :
    SameEdges (P.reverse.arcPieces (-a - ↑k) k) (P.arcPieces a k)

    Reversing does not change the edge list either, up to the order and the naming of each edge's two ends — which is exactly what Schoenflies.SameEdges forgives.

    The realization theorem, tracking a prescribed splitting #

    Schoenflies.exists_prePolygon_split of Schoenflies/PrePolygonArc.lean presents the curve with the two cut points among its vertices, with no corner condition on them. What remains is to say which arc of that presentation is which of two prescribed arcs, and in which direction the first is traversed.

    theorem Schoenflies.exists_prePolygon_arcs {C A₁ A₂ : Set Plane} (hJ : IsJordanCurve C) (hP : IsPolygonal C) {p q : Plane} (hp : p ∈ C) (hq : q ∈ C) (hpq : p ≠ q) (hA1 : IsArcBetween A₁ p q) (hA2 : IsArcBetween A₂ p q) (hunion : A₁ ∪ A₂ = C) (hinter : A₁ ∩ A₂ = {p, q}) :
    ∃ (m : ℕ) (P : PrePolygon m) (a : ZMod (m + 3)) (k : ℕ), P.carrier = C ∧ 1 ≤ k ∧ k ≤ m + 2 ∧ P.vertex a = p ∧ P.vertex (a + ↑k) = q ∧ (P.arc a k = A₁ ∧ P.arc (a + ↑k) (m + 3 - k) = A₂ ∨ P.arc a k = A₂ ∧ P.arc (a + ↑k) (m + 3 - k) = A₁)

    The realization theorem, tracking a splitting into two named arcs.

    theorem Schoenflies.exists_prePolygon_arcs_oriented {C A₁ A₂ : Set Plane} (hJ : IsJordanCurve C) (hP : IsPolygonal C) {p q : Plane} (hp : p ∈ C) (hq : q ∈ C) (hpq : p ≠ q) (hA1 : IsArcBetween A₁ p q) (hA2 : IsArcBetween A₂ p q) (hunion : A₁ ∪ A₂ = C) (hinter : A₁ ∩ A₂ = {p, q}) :
    ∃ (m : ℕ) (P : PrePolygon m) (a : ZMod (m + 3)) (k : ℕ), P.carrier = C ∧ 1 ≤ k ∧ k ≤ m + 2 ∧ P.vertex a = p ∧ P.vertex (a + ↑k) = q ∧ P.arc a k = A₁ ∧ P.arc (a + ↑k) (m + 3 - k) = A₂

    The realization of a splitting, with both the arcs and the direction fixed. The two arcs come out in the order they were given and the first is traversed from p to q; reading the polygon backwards when it is not is what pins the direction.

    This is the shape the crosscut wiring consumes, and — unlike Schoenflies.exists_closedPolygon_arcs_oriented — it asks nothing of p and q beyond lying on the curve.

    Theorem 2.8 and Corollary 2.9 for a polygon presented with redundant vertices #

    Schoenflies.IsPolygonalCrosscut is stated for ClosedPolygons, and by Schoenflies.ClosedPolygon.isCornerAt_vertex that pins the two cut points to be corners of the curve. Nothing in the proof of Theorem 2.8 needs the corner field: what it uses of C, J₁, J₂ is that their carriers separate the plane and that their crossing counts are the ones the edge lists compute. Schoenflies/PrePolygonSep.lean supplies both for a PrePolygon, so the whole chain goes through with the cut points anywhere on the curve.

    structure Schoenflies.IsPrePolygonalCrosscut {m m₁ m₂ : ℕ} (C : PrePolygon m) (J₁ : PrePolygon m₁) (J₂ : PrePolygon m₂) (K : List Piece) (a : ZMod (m + 3)) (k : ℕ) (y : Plane) :

    The setting of Theorem 2.8, with the cut points unrestricted. Word for word Schoenflies.IsPolygonalCrosscut, with PrePolygon for ClosedPolygon.

    • le : k ≤ m + 3

      The first arc runs forward through at most a full turn.

    • edges₁ : SameEdges J₁.pieces (C.arcPieces a k ++ K)

      J₁ carries the edges of the first arc together with those of the crosscut.

    • edges₂ : SameEdges J₂.pieces (C.arcPieces (a + ↑k) (m + 3 - k) ++ K)

      J₂ carries the edges of the second arc together with those of the crosscut.

    • meets₁ : cover K ∩ C.carrier ⊆ C.arc a k

      The crosscut meets the polygon only in points of the first arc …

    • meets₂ : cover K ∩ C.carrier ⊆ C.arc (a + ↑k) (m + 3 - k)

      … and only in points of the second arc.

    • notMem : y ∉ C.carrier

      The reference point lies off the polygon …

    • … and the crosscut does not enter its region.

    Instances For
      theorem Schoenflies.IsPrePolygonalCrosscut.of_endpoints {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (hk1 : 1 ≤ k) (hk2 : k ≤ m + 2) (edges₁ : SameEdges J₁.pieces (C.arcPieces a k ++ K)) (edges₂ : SameEdges J₂.pieces (C.arcPieces (a + ↑k) (m + 3 - k) ++ K)) (meets : cover K ∩ C.carrier ⊆ {C.vertex a, C.vertex (a + ↑k)}) (notMem : y ∉ C.carrier) (avoids : Disjoint (cover K) (connectedComponentIn C.carrierᶜ y)) :
      IsPrePolygonalCrosscut C J₁ J₂ K a k y

      The front door. A crosscut is normally presented by saying that it meets C exactly in its two endpoints, and that those endpoints are the two cut vertices.

      theorem Schoenflies.IsPrePolygonalCrosscut.symm {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      IsPrePolygonalCrosscut C J₂ J₁ K (a + ↑k) (m + 3 - k) y

      The two arcs may be swapped.

      The elementary consequences #

      theorem Schoenflies.IsPrePolygonalCrosscut.notMem_cover {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      y ∉ cover K
      theorem Schoenflies.IsPrePolygonalCrosscut.carrier₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      J₁.carrier = C.arc a k ∪ cover K
      theorem Schoenflies.IsPrePolygonalCrosscut.notMem_carrier₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      y ∉ J₁.carrier
      theorem Schoenflies.IsPrePolygonalCrosscut.cover_subset_carrier₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      cover K ⊆ J₁.carrier
      theorem Schoenflies.IsPrePolygonalCrosscut.carrier₁_subset {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      J₁.carrier ⊆ C.carrier ∪ cover K
      theorem Schoenflies.IsPrePolygonalCrosscut.nondeg {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) (Q : Piece) :
      Q ∈ K → Q.Nondeg

      The edges of the crosscut are nondegenerate, because they are edges of J₁.

      theorem Schoenflies.IsPrePolygonalCrosscut.exists_direction {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      ∃ (u : Plane), u.IsDirection ∧ (∀ Q ∈ C.pieces, hgt u Q.1 ≠ hgt u Q.2) ∧ ∀ Q ∈ K, hgt u Q.1 ≠ hgt u Q.2

      A ray direction transverse to every edge of C and of the crosscut at once.

      The two cells #

      theorem Schoenflies.IsPrePolygonalCrosscut.regionPairC {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      theorem Schoenflies.IsPrePolygonalCrosscut.regionPair₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      theorem Schoenflies.IsPrePolygonalCrosscut.near_subset₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :

      The untouched region of ℝ² ∖ C lies in one region of ℝ² ∖ J₁, namely the one of y.

      theorem Schoenflies.IsPrePolygonalCrosscut.cell_subset₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :

      Lemma 2.6(a), first half: the cell lies in Ω ∖ P.

      theorem Schoenflies.IsPrePolygonalCrosscut.cell_subset₂ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      theorem Schoenflies.IsPrePolygonalCrosscut.cell_isComponent₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) (z : Plane) :

      Lemma 2.6(a): the cell is a connected component of Ω ∖ P.

      theorem Schoenflies.IsPrePolygonalCrosscut.cell_isComponent₂ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) (z : Plane) :
      theorem Schoenflies.IsPrePolygonalCrosscut.closure_cell_inter₁ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :

      Lemma 2.6(c): the closure of the cell meets the polygon exactly in its arc.

      theorem Schoenflies.IsPrePolygonalCrosscut.closure_cell_inter₂ {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :
      closure (farRegion J₂.carrier y) ∩ C.carrier = C.arc (a + ↑k) (m + 3 - k)

      Exhaustion: the crossing counts add up #

      theorem Schoenflies.IsPrePolygonalCrosscut.separates_xor {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {x : Plane} (hxC : x ∉ C.carrier) (hxK : x ∉ cover K) :

      A point off C ∪ P is separated from y by C exactly when it is separated from y by exactly one of J₁, J₂.

      theorem Schoenflies.IsPrePolygonalCrosscut.region_eq {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) :

      Theorem 2.8, the two cells.

      Corollary 2.9 #

      theorem Schoenflies.IsPrePolygonalCrosscut.connectedComponentIn_cover_eq {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {z : Plane} (hz : z ∈ cover K) (hzC : z ∉ C.carrier) :

      The region the crosscut enters is the component of any of its points off C.

      theorem Schoenflies.IsPrePolygonalCrosscut.inter_cover_nonempty {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {Q : Set Plane} {w₁ w₂ : Plane} (hconn : IsPreconnected Q) (hside : Q ⊆ farRegion C.carrier y) (hw₁ : w₁ ∈ closure Q) (hw₂ : w₂ ∈ closure Q) (hw₁A : w₁ ∈ C.arc a k) (hw₁B : w₁ ∉ C.arc (a + ↑k) (m + 3 - k)) (hw₂B : w₂ ∈ C.arc (a + ↑k) (m + 3 - k)) (hw₂A : w₂ ∉ C.arc a k) :

      Corollary 2.9, core form.

      theorem Schoenflies.IsPrePolygonalCrosscut.arc_inter_cover_nonempty {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {Q : Set Plane} {w₁ w₂ : Plane} (hQ : IsArcBetween Q w₁ w₂) (hside : Q \ {w₁, w₂} ⊆ farRegion C.carrier y) (hw₁A : w₁ ∈ C.arc a k) (hw₁B : w₁ ∉ C.arc (a + ↑k) (m + 3 - k)) (hw₂B : w₂ ∈ C.arc (a + ↑k) (m + 3 - k)) (hw₂A : w₂ ∉ C.arc a k) :

      Corollary 2.9 for a second crosscut presented as a simple arc.

      theorem Schoenflies.IsPrePolygonalCrosscut.alternating_inter_nonempty {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {A B Q : Set Plane} {p q w₁ w₂ : Plane} (hA : C.arc a k = A) (hB : C.arc (a + ↑k) (m + 3 - k) = B) (hAB : A ∩ B = {p, q}) (hQ : IsArcBetween Q w₁ w₂) (hside : Q \ {w₁, w₂} ⊆ farRegion C.carrier y) (hw₁ : w₁ ∈ A \ {p, q}) (hw₂ : w₂ ∈ B \ {p, q}) :

      Corollary 2.9 in the shape a plane-graph argument produces it.

      theorem Schoenflies.IsPrePolygonalCrosscut.alternating_inter_nonempty_of_same_side {m m₁ m₂ : ℕ} {C : PrePolygon m} {J₁ : PrePolygon m₁} {J₂ : PrePolygon m₂} {K : List Piece} {a : ZMod (m + 3)} {k : ℕ} {y : Plane} (h : IsPrePolygonalCrosscut C J₁ J₂ K a k y) {A B Q : Set Plane} {p q w₁ w₂ z : Plane} (hz : z ∈ cover K) (hzC : z ∉ C.carrier) (hA : C.arc a k = A) (hB : C.arc (a + ↑k) (m + 3 - k) = B) (hAB : A ∩ B = {p, q}) (hQ : IsArcBetween Q w₁ w₂) (hside : Q \ {w₁, w₂} ⊆ connectedComponentIn C.carrierᶜ z) (hw₁ : w₁ ∈ A \ {p, q}) (hw₂ : w₂ ∈ B \ {p, q}) :

      Corollary 2.9 with "the same side" read as "the same connected component".

      The six-cycle and one remaining edge, as a crosscut #

      Graph.IsHexCrosscut of Schoenflies/Graph/K33Planar.lean is the same statement with Schoenflies.ClosedPolygon for Schoenflies.PrePolygon; the change is what removes the corner condition on the two cut points, which is the whole of the remaining gap.

      def Graph.IsPreHexCrosscut {β : Type u_1} (drawing : β → ℝ → Schoenflies.Plane) (e : Fin 3 → Fin 3 → β) (s : Fin 3) :

      The six-cycle and one remaining edge, realized as a polygonal crosscut, with the two cut points wherever the drawing put them.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        theorem Graph.IsK33Config.isPreHexCrosscut {β : Type u_1} {G : Graph Schoenflies.Plane β} {x y : Fin 3 → Schoenflies.Plane} {e : Fin 3 → Fin 3 → β} {drawing : β → ℝ → Schoenflies.Plane} (h : G.IsK33Config x y e) (hd : G.IsDrawing drawing) (hpoly : ∀ f ∈ G.edgeSet, Schoenflies.IsPolygonal (edgeArc drawing f)) (s : Fin 3) :
        IsPreHexCrosscut drawing e s

        The crosscut exists for any polygonal drawing. The six-cycle is realized as a Schoenflies.PrePolygon cut at the two ends of the remaining edge — possible because a PrePolygon may have a vertex wherever one likes — and the two closed curves the remaining edge forms with the two halves are then built from that realization and from one presentation of the remaining edge, rather than found independently. That is what makes the three edge lists agree, and it is why no matching lemma, and hence no general position, is needed.

        The contradiction #

        theorem Graph.IsK33Config.false_of_isPreHexCrosscut {β : Type u_1} {G : Graph Schoenflies.Plane β} {x y : Fin 3 → Schoenflies.Plane} {e : Fin 3 → Fin 3 → β} {drawing : β → ℝ → Schoenflies.Plane} {s : Fin 3} {R : Set Schoenflies.Plane} (h : G.IsK33Config x y e) (hd : G.IsDrawing drawing) (hcross : IsPreHexCrosscut drawing e s) (hsep : Schoenflies.IsSeparating (hexSet drawing e)) (hR : Schoenflies.IsRegionOf (hexSet drawing e) R) (h1 : Schoenflies.openArc (drawing (e s (s + 1))) ⊆ R) (h2 : Schoenflies.openArc (drawing (e (s + 1) (s + 1 + 1))) ⊆ R) :

        The two remaining edges indexed by s and s + 1 cannot lie in one region. Their four ends alternate around the six-cycle, so cor:alternating-crosscuts makes them meet; but distinct edges of a plane graph meet only at shared vertices, and these two share none.

        theorem Graph.IsK33Config.false_of_polygonal {β : Type u_1} {G : Graph Schoenflies.Plane β} {x y : Fin 3 → Schoenflies.Plane} {e : Fin 3 → Fin 3 → β} {drawing : β → ℝ → Schoenflies.Plane} (h : G.IsK33Config x y e) (hd : G.IsDrawing drawing) (hpoly : ∀ f ∈ G.edgeSet, Schoenflies.IsPolygonal (edgeArc drawing f)) :

        lem:k33 for a drawing that is already polygonal, with nothing assumed.

        theorem Graph.IsK33Config.not_exists_isDrawing {β : Type u_1} {G : Graph Schoenflies.Plane β} {x y : Fin 3 → Schoenflies.Plane} {e : Fin 3 → Fin 3 → β} [G.Finite] (h : G.IsK33Config x y e) :
        ¬∃ (dr : β → ℝ → Schoenflies.Plane), G.IsDrawing dr

        Lemma 3.10 (nonplanarity of K(3,3)), with no hypothesis left. A finite graph carrying a copy of K(3,3) has no plane drawing.

        lem:polygonal-redrawing replaces an arbitrary drawing by a polygonal one on the same graph and the same vertices; the contradiction is then false_of_polygonal. This is Graph.IsK33Config.not_isDrawing of Schoenflies/Graph/K33Planar.lean with its realization hypothesis discharged, and Graph.IsK33Config.not_isDrawing_of_bendable of Schoenflies/Graph/K33Closed.lean with Graph.Bendable discharged: no drawing has to be bent, because the crosscut no longer needs the six vertices to be corners.

        theorem Graph.IsArcK33.elim {x y : Fin 3 → Schoenflies.Plane} {P : Fin 3 → Fin 3 → Set Schoenflies.Plane} (h : IsArcK33 x y P) :

        lem:k33 for nine arcs: no nine arcs in the plane meet only where a K(3,3) forces them to.

        theorem Graph.IsK33Subdivision.elim {β : Type u_1} {x y : Fin 3 → Schoenflies.Plane} {drawing : β → ℝ → Schoenflies.Plane} {H : Graph Schoenflies.Plane β} {W : Fin 3 → Fin 3 → List β} (hd : H.IsDrawing drawing) (h : H.IsK33Subdivision x y W) :

        Corollary 3.11 (subdivisions of K(3,3)). No subdivision of K(3,3) has a plane drawing.

        theorem Graph.k33Graph_not_exists_isDrawing (x y : Fin 3 → Schoenflies.Plane) (hx : Function.Injective x) (hy : Function.Injective y) (hxy : ∀ (i j : Fin 3), x i ≠ y j) :
        ¬∃ (dr : Fin 3 × Fin 3 → ℝ → Schoenflies.Plane), (k33Graph x y).IsDrawing dr

        The headline: K(3,3) has no plane drawing. Stated for the concrete graph Graph.k33Graph x y, whose nine edges are the index pairs, with nothing assumed beyond the six points being six distinct points of the plane.