Documentation

LeanPool.Schoenflies.InitialGenerated

Stage 0: the initial pair as a GeneratedPair #

Schoenflies/FiniteTransfer.lean defines Schoenflies.GeneratedPair, the object every stage of the Schönflies recursion is and that thm:finite-transfer consumes and produces. Nothing built one. This module builds the first: the initial matched pair of prop:initial-pair, which is generated from itself by the empty sequence of elementary operations.

What has to be shown #

The two realizations, the skeleton homeomorphism and weak admissibility are all in Schoenflies/InitialPair.lean and Schoenflies/InitialPairFixed.lean already, or one step from what is there. The work is the two IsCellDecomposition fields — assertion (i) of lem:cellulation-invariants — and they are the same work twice, because both realizations have the same shape: a HexData whose six outer arcs form a Jordan curve and whose chord is a crosscut of it. So assertion (i) is proved once, for an arbitrary HexData carrying that crosscut configuration (Schoenflies.HexData.isCellDecomposition), and instantiated on each side. The same is true of weak admissibility (Schoenflies.HexData.isWeaklyAdmissible).

The four clauses go as follows.

The input is InitialData, not AnchoredInitialData #

AnchoredInitialData adds exactly two fields, a ∈ 𝒜 and b ∈ 𝒜. Nothing in GeneratedPair mentions the anchor set: the anchoring is what lets a later stage run a fresh crosscut into a or b, and it is read off AnchoredInitialData.stronglyAccessible_a at that point. So the pair is built from InitialData — the weaker input — and Schoenflies.AnchoredInitialData.generatedPair is the one-line specialisation for a consumer holding the anchored form.

Blueprint #

The cells of the initial structure, and ≼_abs #

initialStructure declares every one of InitialCell's four named constructors a cell. The fifth, InitialCell.aux, is the spare supply of fresh names that def:generated-structure needs and that thm:finite-transfer asks for as [Infinite γ]; no aux name is a cell.

recOnCells is the shape every clause of assertion (i) below uses: case analysis on a cell, with the spare names ruled out by the membership hypothesis the clause already carries.

The spare names are not cells: cells is vertices ∪ edges ∪ faces, and each of those is a range of one of the four named constructors.

The four named constructors are cell names.

Every cell of a 2-cell's boundary walk is a cell.

def Schoenflies.recOnCells {motive : InitialCell → Sort u_1} {c : InitialCell} (hc : c ∈ initialStructure.cells) (hv : (i : Fin 6) → motive (InitialCell.vert i)) (he : (i : Fin 6) → motive (InitialCell.edge i)) (hch : motive InitialCell.chord) (hf : (k : Bool) → motive (InitialCell.face k)) :
motive c

Case analysis on a cell of the initial structure. The four named constructors exhaust the cells; the spare aux names are excluded by the membership hypothesis.

Equations
Instances For

    A face name is never a 0-cell or a 1-cell.

    The subcells of a 0-cell are itself alone.

    The subcells of an outer 1-cell are itself and its two ends.

    The subcells of the crosscut are itself and its two ends.

    The subcells of a 2-cell are itself together with the cells of its boundary walk.

    The combinatorial invariants at the base #

    Schoenflies.GeneratedStructure.combInvariants propagates lem:cellulation-invariants (iii), (v), (vi) and abstract (viii) along the two elementary operations given the base case. This is the base case. Assertion (vi) is Schoenflies.outerEdgeUniqueFace_initialStructure, already on main; the other seven clauses are read off initSub.

    The combinatorial invariants hold for the initial structure. The base case of Schoenflies.GeneratedStructure.combInvariants, hence of GeneratedPair.combInvariants.

    The open cells of a HexData #

    Everything assertion (i) needs about the fifteen realized open cells, stated for an arbitrary HexData so that the source and the target realization are served by one proof. Nothing in this section mentions the crosscut configuration; that enters only for the two 2-cells.

    The 1-cells are nonempty: an arc has more points than its two endpoints.

    A closed 1-cell is the drawn edge: an arc is the closure of its interior.

    A 0-cell never lies on an open 1-cell. A vertex on a drawn outer edge is one of its two ends (HexData.mem_outer_iff), and the open edge is exactly the drawn edge without them.

    Two distinct open outer 1-cells are disjoint. The two edges meet only at points that are ends of both, and those are removed.

    The open crosscut misses every open outer 1-cell.

    theorem Schoenflies.HexData.mem_cellSet_edge_or (H : HexData) {i : Fin 6} {z : Plane} (hz : z ∈ H.outer i '' unitInterval) :
    z ∈ H.cellSet (InitialCell.edge i) ∨ z = H.pos i ∨ z = H.pos (i + 1)

    A point of a drawn outer edge is on the open edge or is one of its two ends.

    A point of the crosscut is on the open crosscut or is one of its two ends.

    The 0-cells and the open 1-cells reassemble the skeleton C ∪ P.

    theorem Schoenflies.HexData.biUnion_of_three_edges (H : HexData) (F : Set InitialCell) {i j l : Fin 6} (hij : i + 1 = j) (hjl : j + 1 = l) (hmem : ∀ c ∈ F, c = InitialCell.vert i ∨ c = InitialCell.vert j ∨ c = InitialCell.vert l ∨ c = InitialCell.vert (l + 1) ∨ c = InitialCell.edge i ∨ c = InitialCell.edge j ∨ c = InitialCell.edge l ∨ c = InitialCell.chord) (hvi : InitialCell.vert i ∈ F) (hvj : InitialCell.vert j ∈ F) (hvl : InitialCell.vert l ∈ F) (hvl1 : InitialCell.vert (l + 1) ∈ F) (hei : InitialCell.edge i ∈ F) (hej : InitialCell.edge j ∈ F) (hel : InitialCell.edge l ∈ F) (hch : InitialCell.chord ∈ F) (hv1 : InitialCell.vert 1 ∈ F) (hv4 : InitialCell.vert 4 ∈ F) :

    Three consecutive outer edges and the crosscut reassemble their union. The two 2-cells of the initial structure differ only in which three outer edges bound them, so the union over the cells of a boundary walk is computed once, for an arbitrary set F of cells presented as the four vertices, the three edges and the crosscut.

    The cells of a 2-cell's boundary walk reassemble Aₖ ∪ P. The blueprint declares faceCells k to be the subcells of Rₖ; geometrically that union is exactly the boundary curve of Rₖ, which is what closure_eq has to match at a 2-cell.

    Assertion (i) and def:admissible-graph, for either realization #

    Both realizations of prop:initial-pair are a HexData whose six outer arcs form a Jordan curve and whose chord is a crosscut of it. Everything that distinguishes assertion (i) from bookkeeping is thm:general-crosscut, in the packaged form Schoenflies.crosscut_cell_partition: the two 2-cells are open, nonempty, disjoint from each other and from the open crosscut, they exhaust D ∖ P together with it, and the closure of each is itself together with its own boundary curve.

    lem:cellulation-invariants(i) for a realization of the initial structure. The open cells are nonempty and pairwise disjoint, they cover C ∪ D, and every closed cell is the union of its open subcells for the base value of ≼_abs the blueprint fixes.

    The three hypotheses are exactly thm:general-crosscut's: the chord is a crosscut of the outer cycle, the two boundary arcs are the two arcs it cuts the outer cycle into, and the crosscut has collars. On the source side they are InitialData.isCrosscut, .isCutPair and .hasArcCollarsSource; on the target side .isCrosscutTarget, .isCutPairTarget and .hasArcCollarsTarget.

    theorem Schoenflies.HexData.isOpen_cellSet_face (H : HexData) (hcross : IsCrosscut H.outerArcs H.chordSet (H.pos 1) (H.pos 4)) (hcut : IsCutPair H.outerArcs (H.pos 1) (H.pos 4) (H.arcOf false) (H.arcOf true)) (hcollars : HasArcCollars (inside H.outerArcs) H.chordSet) (k : Bool) :

    The two 2-cells are open. IsCellDecomposition does not record this, but IsCellDecomposition.face_eq — assertion (viii) — takes it as a hypothesis, and thm:general-crosscut hands it to the producer for free. Exported here so that no consumer has to rederive it at stage 0.

    Assertion (vii) for the initial hexagonal cellulation. Each of its two faces was defined as the inside of the curve obtained by joining one boundary arc to the crosscut; the crosscut theorem says that curve is Jordan.

    def:admissible-graph minus the connectedness clause, for a realization of the initial structure. The 2-connectivity is HexData.isTwoConnected_graph; the outer cycle is the union of the six outer arcs by construction; the one nonboundary edge is the crosscut, which is polygonal and has its interior in the open domain because it is a crosscut.

    rem:intermediate-disconnection waives connectedness of the open nonboundary part at intermediate stages only. The initial pair does satisfy it — HexData.isConnected_nonboundary — and InitialData.generatedPair_isAdmissible records the strong form.

    The closed square, as a domain #

    GeneratedPair asks for the closed target domain. Schoenflies.inside_modelCurve identifies the Jordan domain of S with the open square, so the closed domain S ∪ Int(S) is literally Q = [-1,1]².

    The initial pair is a GeneratedPair #

    Both realizations are instances of the two HexData theorems above; all that is left is to present the hypotheses in the shape they take, which on the source side means rewriting d.src.outerArcs to C and on the target side d.tgt.outerArcs to S.

    The crosscut configuration on the source side, with the outer cycle named as the HexData sees it.

    The crosscut configuration on the target side.

    Assertion (i) on the source side: the fifteen open cells of Γ decompose C ∪ D.

    Assertion (i) on the target side: the fifteen open cells of Γ' decompose Q.

    def:admissible-graph (weak form) on the source side.

    def:admissible-graph (weak form) on the target side.

    The two source 2-cells are open — the hypothesis IsCellDecomposition.face_eq takes and IsCellDecomposition does not record.

    Stage 0 of the Schönflies recursion. The initial matched pair of prop:initial-pair is a generated matched cellulation: it is generated from Schoenflies.initialStructure by the empty sequence of elementary operations (GeneratedStructure.base), its two realizations are the two realizations of prop:initial-pair, and the two cell decompositions are lem:cellulation-invariants(i) on each side.

    This is the base case of the whole construction: thm:finite-transfer consumes a GeneratedPair and produces one, and this is the first.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For

      The combinatorial invariants at stage 0, read off the bundle: this is what GeneratedPair.combInvariants needs supplied at the base, and what every later stage inherits.

      The initial pair is admissible in the strong sense, on both sides. rem:intermediate-disconnection waives connectedness of the open nonboundary part at intermediate stages; at stage 0 it holds, the open nonboundary part being the open crosscut.

      Stage 0 from the anchored initial pair. AnchoredInitialData adds only the clause a, b ∈ 𝒜, which no field of GeneratedPair mentions; it is what lets a later stage run a fresh crosscut into a or b (AnchoredInitialData.stronglyAccessible_a). So the pair is built from the underlying InitialData, and this is the specialisation for a consumer holding the anchored form.

      Equations
      Instances For

        The base case meets the recursion #

        Schoenflies.finite_transfer_toward_square and Schoenflies.EarStep carry [Infinite γ], and FiniteTransfer.lean argues that without it EarStep is false: an ear insertion consumes fresh cell names for the ear's interior vertices, its edges and the two 2-cells the split creates, so a naming type that the current stage has exhausted refutes it.

        The initial structure names fifteen cells. InitialCell therefore carries a fifth constructor, InitialCell.aux : ℕ → InitialCell, which is the spare supply and nothing else: no aux name is a cell, every aux name has empty open cell, and initSub relates none of them — the reflexive clause of ≼_abs is restricted to Schoenflies.cellNames precisely so that CombInvariants.sub_mem_left and .sub_mem_right, which say that ≼_abs relates cells to cells, stay true.

        The alternative was a relabelling of a CellStructure and both of its realizations along an injection InitialCell ↪ γ into an infinite naming type. That is several hundred lines and buys nothing the spare constructor does not, since the base of GeneratedStructure is a parameter and stage 0 uses only the base constructor — no inductive derivation has to be transported.

        The naming type of the initial structure is infinite, so the base case really can be fed to thm:finite-transfer, whose [Infinite γ] is not decoration: an ear insertion consumes fresh cell names, and on a finite naming type Schoenflies.EarStep is false. The supply is InitialCell.aux, and no aux name is a cell of initialStructure.

        The interface, exercised #

        A machine-checked statement that stage 0 delivers exactly what thm:finite-transfer reads off a GeneratedPair: the abstract structure carries the combinatorial invariants, the source and target realizations are cell decompositions of the two closed domains, and both are admissible in the strong sense. Nothing below mentions how the pair was built.