Adapting Families of Maps to Open Covers

7. Every Polytope Admits a Subdivision🔗

Theorem 7.1🔗

Theorem 7.1. For every finite S \subseteq \mathbb R^k, the polytope \operatorname{conv}(S) admits a subdivision (a finite simplicial complex with underlying space \operatorname{conv}(S)).

The proof is by strong induction on |S|, with four cases.

open Set Geometry open scoped Topology open _root_.FamiliesOfMapsB01 namespace Submission namespace FamiliesOfMapsB01 variable {k : ℕ}

Case 1🔗

Case 1: S affinely independent. Take the full simplex on S: the faces are all nonempty subsets of S. Affine independence passes to subsets; downward closure is clear; and the gluing condition \operatorname{conv}(\sigma) \cap \operatorname{conv}(\tau) \subseteq \operatorname{conv}(\sigma\cap\tau) holds for subsets of an affinely independent set (faces of a simplex meet along faces, by uniqueness of barycentric coordinates). The space is \operatorname{conv}(S) (the top face). The face set is finite.

/-- The full simplex on an affinely independent vertex set `S`: its faces are all nonempty subsets of `S`. -/ noncomputable def simplexComplex (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : SimplicialComplex ℝ (Fin k → ℝ) := SimplicialComplex.ofErase {t : Finset (Fin k → ℝ) | t ⊆ S} (k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ ∀ s ∈ {t | t ⊆ S}, AffineIndependent ℝ Subtype.val intro t k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valt:Finset (Fin k → ℝ)ht:t ∈ {t | t ⊆ S}⊢ AffineIndependent ℝ Subtype.val exact hS.mono (k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valt:Finset (Fin k → ℝ)ht:t ∈ {t | t ⊆ S}⊢ ↑t ⊆ ↑S All goals completed! 🐙)) (k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ IsLowerSet {t | t ⊆ S} intro a k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vala:Finset (Fin k → ℝ)b:Finset (Fin k → ℝ)⊢ b ≤ a → a ∈ {t | t ⊆ S} → b ∈ {t | t ⊆ S} k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vala:Finset (Fin k → ℝ)b:Finset (Fin k → ℝ)hab:b ≤ a⊢ a ∈ {t | t ⊆ S} → b ∈ {t | t ⊆ S} k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vala:Finset (Fin k → ℝ)b:Finset (Fin k → ℝ)hab:b ≤ ahb:a ∈ {t | t ⊆ S}⊢ b ∈ {t | t ⊆ S} All goals completed! 🐙) (k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ ∀ s ∈ {t | t ⊆ S}, ∀ t ∈ {t | t ⊆ S}, (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t ⊆ (convexHull ℝ) (↑s ∩ ↑t) intro s k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vals:Finset (Fin k → ℝ)hs:s ∈ {t | t ⊆ S}⊢ ∀ t ∈ {t | t ⊆ S}, (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t ⊆ (convexHull ℝ) (↑s ∩ ↑t) k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vals:Finset (Fin k → ℝ)hs:s ∈ {t | t ⊆ S}t:Finset (Fin k → ℝ)⊢ t ∈ {t | t ⊆ S} → (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t ⊆ (convexHull ℝ) (↑s ∩ ↑t) k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vals:Finset (Fin k → ℝ)hs:s ∈ {t | t ⊆ S}t:Finset (Fin k → ℝ)ht:t ∈ {t | t ⊆ S}⊢ (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t ⊆ (convexHull ℝ) (↑s ∩ ↑t) k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.vals:Finset (Fin k → ℝ)hs:s ∈ {t | t ⊆ S}t:Finset (Fin k → ℝ)ht:t ∈ {t | t ⊆ S}this:(convexHull ℝ) (↑s ∩ ↑t) = (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t⊢ (convexHull ℝ) ↑s ∩ (convexHull ℝ) ↑t ⊆ (convexHull ℝ) (↑s ∩ ↑t) All goals completed! 🐙) lemma simplexComplex_faces (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : (simplexComplex S hS).faces = {t : Finset (Fin k → ℝ) | t ⊆ S} \ {∅} := k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ (simplexComplex S hS).faces = {t | t ⊆ S} \ {∅} All goals completed! 🐙 lemma simplexComplex_faces_finite (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : (simplexComplex S hS).faces.Finite := k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ (simplexComplex S hS).faces.Finite All goals completed! 🐙 lemma simplexComplex_space (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : (simplexComplex S hS).space = convexHull ℝ (S : Set (Fin k → ℝ)) := k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.val⊢ (simplexComplex S hS).space = (convexHull ℝ) ↑S k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ x ∈ (simplexComplex S hS).space ↔ x ∈ (convexHull ℝ) ↑S k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ (∃ i, (i ⊆ S ∧ ¬i = ∅) ∧ x ∈ (convexHull ℝ) ↑i) ↔ x ∈ (convexHull ℝ) ↑S; k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ (∃ i, (i ⊆ S ∧ ¬i = ∅) ∧ x ∈ (convexHull ℝ) ↑i) → x ∈ (convexHull ℝ) ↑Sk:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ x ∈ (convexHull ℝ) ↑S → ∃ i, (i ⊆ S ∧ ¬i = ∅) ∧ x ∈ (convexHull ℝ) ↑i; k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ (∃ i, (i ⊆ S ∧ ¬i = ∅) ∧ x ∈ (convexHull ℝ) ↑i) → x ∈ (convexHull ℝ) ↑S k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝi:Finset (Fin k → ℝ)hi:i ⊆ S ∧ ¬i = ∅hx:x ∈ (convexHull ℝ) ↑i⊢ x ∈ (convexHull ℝ) ↑S ; All goals completed! 🐙; k:ℕS:Finset (Fin k → ℝ)hS:AffineIndependent ℝ Subtype.valx:Fin k → ℝ⊢ x ∈ (convexHull ℝ) ↑S → ∃ i, (i ⊆ S ∧ ¬i = ∅) ∧ x ∈ (convexHull ℝ) ↑i All goals completed! 🐙 /-- If `P` is the convex hull of an affinely independent finite set, it admits a polyhedral subdivision (namely, the full simplex on its vertices). -/ noncomputable def simplexSubdivision (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : Subdivision (convexHull ℝ (S : Set (Fin k → ℝ))) where complex := simplexComplex S hS faces_finite := simplexComplex_faces_finite S hS space_eq := simplexComplex_space S hS lemma simplex_has_subdivision (S : Finset (Fin k → ℝ)) (hS : AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) : Nonempty (Subdivision (convexHull ℝ (S : Set (Fin k → ℝ)))) := ⟨simplexSubdivision S hS⟩

Case 2🔗

Case 2: some v \in S is redundant, i.e. v \in \operatorname{conv}(S \smallsetminus \{v\}). Then \operatorname{conv}(S) = \operatorname{conv}(S \smallsetminus \{v\}), and the inductive hypothesis applies to S \smallsetminus \{v\}.

/- Removing a point that already lies in the convex hull of the remaining points does not change the convex hull. This lets us reduce triangulation existence for an arbitrary finite point set to the case of an *irredundant* set (one where every point is a genuine vertex of the polytope). -/ lemma convexHull_erase_of_mem {S : Finset (Fin k → ℝ)} {v : Fin k → ℝ} (hmem : v ∈ convexHull ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ))) : convexHull ℝ (S : Set (Fin k → ℝ)) = convexHull ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ)) := k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ (convexHull ℝ) ↑S = (convexHull ℝ) ↑(S.erase v) k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ (convexHull ℝ) ↑S ≤ (convexHull ℝ) ↑(S.erase v)k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ (convexHull ℝ) ↑(S.erase v) ≤ (convexHull ℝ) ↑S; k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ (convexHull ℝ) ↑S ≤ (convexHull ℝ) ↑(S.erase v) k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ ↑S ⊆ (convexHull ℝ) ↑(S.erase v)k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Convex ℝ ((convexHull ℝ) ↑(S.erase v)); k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ ↑S ⊆ (convexHull ℝ) ↑(S.erase v) exact fun x hx => if hxv : x = v then hxv.symm ▸ hmem else subset_convexHull ℝ _ ( k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)x:Fin k → ℝhx:x ∈ ↑Shxv:¬x = v⊢ x ∈ ↑(S.erase v) All goals completed! 🐙 ); k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Convex ℝ ((convexHull ℝ) ↑(S.erase v)) All goals completed! 🐙; k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ (convexHull ℝ) ↑(S.erase v) ≤ (convexHull ℝ) ↑S All goals completed! 🐙

Case 3🔗

Case 3: not Case 1 or 2, and some v \in S is an apex: S \smallsetminus \{v\} \ne \emptyset and v is not in the affine span of S \smallsetminus \{v\}. Let K be a subdivision of P' := \operatorname{conv}(S \smallsetminus \{v\}) (inductive hypothesis) and form the cone on K with apex v: its faces are the faces \sigma of K, the sets \{v\} \cup \sigma for \sigma a face of K, and \{v\}. We check this is a simplicial complex:

The cone construction and its verification (affine independence, downward closure, gluing via the unique apex height) are developed in the cone subdivisions chapter; here it is packaged as a subdivision:

/-- **Apex / dimension-raising reduction.** If `P` is a nonempty subdivided polytope and `v` lies off `affineSpan ℝ P`, then the cone `convexJoin ℝ {v} P` (a one-higher-dimensional polytope) is itself subdivided, by coning the given subdivision of `P` along the cone API of `Submission/Cone.lean`. -/ noncomputable def coneSubdivision {P : Set (Fin k → ℝ)} (v : Fin k → ℝ) (hv : v ∉ affineSpan ℝ P) (hne : P.Nonempty) (K : Subdivision P) : Subdivision (convexJoin ℝ {v} P) where complex := coneComplex v K.complex (k:ℕP:Set (Fin k → ℝ)v:Fin k → ℝhv:v ∉ affineSpan ℝ Phne:P.NonemptyK:Subdivision P⊢ v ∉ affineSpan ℝ K.complex.space k:ℕP:Set (Fin k → ℝ)v:Fin k → ℝhv:v ∉ affineSpan ℝ Phne:P.NonemptyK:Subdivision P⊢ v ∉ affineSpan ℝ P; All goals completed! 🐙) faces_finite := coneComplex_faces_finite v K.complex _ K.faces_finite space_eq := k:ℕP:Set (Fin k → ℝ)v:Fin k → ℝhv:v ∉ affineSpan ℝ Phne:P.NonemptyK:Subdivision P⊢ (coneComplex v K.complex ⋯).space = convexJoin ℝ {v} P All goals completed! 🐙 /-- The convex hull of `insert v S'` is the cone (convex join) of `v` over the convex hull of a nonempty `S'`. -/ lemma convexHull_insert_eq_join (v : Fin k → ℝ) (S' : Finset (Fin k → ℝ)) (hS' : S'.Nonempty) : convexHull ℝ ((insert v S' : Finset (Fin k → ℝ)) : Set (Fin k → ℝ)) = convexJoin ℝ {v} (convexHull ℝ (S' : Set (Fin k → ℝ))) := k:ℕv:Fin k → ℝS':Finset (Fin k → ℝ)hS':S'.Nonempty⊢ (convexHull ℝ) ↑(insert v S') = convexJoin ℝ {v} ((convexHull ℝ) ↑S') k:ℕv:Fin k → ℝS':Finset (Fin k → ℝ)hS':S'.Nonempty⊢ (convexHull ℝ) (insert v ↑S') = convexJoin ℝ {v} ((convexHull ℝ) ↑S') All goals completed! 🐙

The space of the cone is the join \{(1-a)v + a\,b : a \in [0,1],\ b \in P'\}, which equals \operatorname{conv}(\{v\} \cup (S\smallsetminus\{v\})) = \operatorname{conv}(S). Finiteness is clear.

(An auxiliary separating-functional lemma sits alongside the cone reduction in the original development:)

/-- At an irredundant vertex `v` of `S` there is a linear functional strictly separating `v` from all other vertices (`geometric_hahn_banach` on the closed convex `convexHull (S.erase v)`). This is the supporting functional that the slice/cone decomposition pulls `v` along: every other vertex, hence the whole opposite face, lies strictly below `φ v`. -/ lemma exists_separating_functional_of_vertex (S : Finset (Fin k → ℝ)) (v : Fin k → ℝ) (hirr : v ∉ convexHull ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ))) : ∃ (φ : (Fin k → ℝ) →ₗ[ℝ] ℝ), ∀ w ∈ S.erase v, φ w < φ v := k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhirr:v ∉ (convexHull ℝ) ↑(S.erase v)⊢ ∃ φ, ∀ w ∈ S.erase v, φ w < φ v k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhirr:v ∉ (convexHull ℝ) ↑(S.erase v)f:StrongDual ℝ (Fin k → ℝ)u:ℝhf:∀ a ∈ (convexHull ℝ) ↑(S.erase v), f a < uhu:u < f v⊢ ∃ φ, ∀ w ∈ S.erase v, φ w < φ v k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhirr:v ∉ (convexHull ℝ) ↑(S.erase v)f:StrongDual ℝ (Fin k → ℝ)u:ℝhf:∀ a ∈ (convexHull ℝ) ↑(S.erase v), f a < uhu:u < f v⊢ ∀ w ∈ S.erase v, ↑f w < ↑f v intro w k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhirr:v ∉ (convexHull ℝ) ↑(S.erase v)f:StrongDual ℝ (Fin k → ℝ)u:ℝhf:∀ a ∈ (convexHull ℝ) ↑(S.erase v), f a < uhu:u < f vw:Fin k → ℝhw:w ∈ S.erase v⊢ ↑f w < ↑f v k:ℕS:Finset (Fin k → ℝ)v:Fin k → ℝhirr:v ∉ (convexHull ℝ) ↑(S.erase v)f:StrongDual ℝ (Fin k → ℝ)u:ℝhf:∀ a ∈ (convexHull ℝ) ↑(S.erase v), f a < uhu:u < f vw:Fin k → ℝhw:w ∈ S.erase vthis:f w < u⊢ ↑f w < ↑f v All goals completed! 🐙

Case 4🔗

Case 4: none of the above — S is affinely dependent, irredundant (no vertex in the hull of the others), and flat: every v \in S lies in the affine span of S \smallsetminus \{v\}. (The simplest example: the four corners of a square.) Here one uses the regular (lower-envelope) triangulation, which we now construct. (The regular triangulation in fact works for arbitrary finite S, making Cases 1–3 logically dispensable; we retain the induction because the earlier cases are elementary, and invoke the regular triangulation only in this residual case.)

The regular triangulation is constructed in the regular triangulation chapter; the flat case invokes it:

/-- **The genuine residual triangulation problem (flat case).** An *irredundant* finite vertex set `S` (every point is a real vertex of the polytope) that is **not** affinely independent and is moreover *flat*: every vertex lies in the affine span of the others (so no vertex is an apex that the cone reduction `coneSubdivision` could strip off). The simplest example is the four corners of a square. Triangulating such a polytope without introducing Steiner points is the classical *pulling/placing* triangulation, which requires a visible-facet / boundary-complex API that Mathlib does not provide. This isolated statement is the precise remaining geometric blocker for general triangulation existence (and hence for conjunct 2 of Morrison–Walker B.0.1). -/ theorem polytope_flat_has_subdivision (S : Finset (Fin k → ℝ)) (_hirr : ∀ v ∈ S, v ∉ convexHull ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ))) (_hdep : ¬ AffineIndependent ℝ ((↑) : S → (Fin k → ℝ))) (_hflat : ∀ v ∈ S, v ∈ affineSpan ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ))) : Nonempty (Subdivision (convexHull ℝ (S : Set (Fin k → ℝ)))) := Submission.FamiliesOfMapsB01Regular.regular_subdivision_exists S

The strong induction assembling the four cases, and the form of the result used throughout the main text:

/-- **General triangulation existence.** Every polytope `convexHull ℝ S` (the convex hull of a finite point set in `ℝᵏ`) admits a polyhedral subdivision. The proof reduces (by strong induction on `S.card`): discard redundant points via `convexHull_erase_of_mem`; use `simplex_has_subdivision` for the affinely independent base case; strip off an *apex* vertex `v ∉ affineSpan` of the rest via `coneSubdivision`; leaving only the irredundant, affinely dependent, *flat* case handled by `polytope_flat_has_subdivision` — the one genuinely missing piece (the pulling triangulation). -/ theorem polytope_has_subdivision (S : Finset (Fin k → ℝ)) : Nonempty (Subdivision (convexHull ℝ (S : Set (Fin k → ℝ)))) := k:ℕS:Finset (Fin k → ℝ)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) classical induction hc : S.card using Nat.strong_induction_on generalizing S with k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = n⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:AffineIndependent ℝ Subtype.val⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S))k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.val⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:AffineIndependent ℝ Subtype.val⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.val⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∃ v ∈ S, v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S))k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:¬∃ v ∈ S, v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∃ v ∈ S, v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valv:Fin k → ℝhvS:v ∈ Shvmem:v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valv:Fin k → ℝhvS:v ∈ Shvmem:v ∈ (convexHull ℝ) ↑(S.erase v)hpos:0 < S.card⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) have hlt : (S.erase v).card < n := k:ℕS:Finset (Fin k → ℝ)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valv:Fin k → ℝhvS:v ∈ Shvmem:v ∈ (convexHull ℝ) ↑(S.erase v)hpos:0 < S.card⊢ S.card - 1 < n; All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valv:Fin k → ℝhvS:v ∈ Shvmem:v ∈ (convexHull ℝ) ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nhsub:Nonempty (Subdivision ((convexHull ℝ) ↑(S.erase v)))⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) rwa [convexHull_erase_of_mem hvmemk:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valv:Fin k → ℝhvS:v ∈ Shvmem:v ∈ (convexHull ℝ) ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nhsub:Nonempty (Subdivision ((convexHull ℝ) ↑(S.erase v)))⊢ Nonempty (Subdivision ((convexHull ℝ) ↑(S.erase v))) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:¬∃ v ∈ S, v ∈ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∃ v ∈ S, (S.erase v).Nonempty ∧ v ∉ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S))k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:¬∃ v ∈ S, (S.erase v).Nonempty ∧ v ∉ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∃ v ∈ S, (S.erase v).Nonempty ∧ v ∉ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.card⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) have hlt : (S.erase v).card < n := k:ℕS:Finset (Fin k → ℝ)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.card⊢ S.card - 1 < n; All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nK:Subdivision ((convexHull ℝ) ↑(S.erase v))⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nK:Subdivision ((convexHull ℝ) ↑(S.erase v))hPne:((convexHull ℝ) ↑(S.erase v)).Nonempty⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) have hv' : v ∉ affineSpan ℝ (convexHull ℝ ((S.erase v : Finset (Fin k → ℝ)) : Set (Fin k → ℝ))) := k:ℕS:Finset (Fin k → ℝ)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) rwa [affineSpan_convexHullk:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nK:Subdivision ((convexHull ℝ) ↑(S.erase v))hPne:((convexHull ℝ) ↑(S.erase v)).Nonempty⊢ v ∉ affineSpan ℝ ↑(S.erase v) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nK:Subdivision ((convexHull ℝ) ↑(S.erase v))hPne:((convexHull ℝ) ↑(S.erase v)).Nonemptyhv':v ∉ affineSpan ℝ ((convexHull ℝ) ↑(S.erase v))⊢ Subdivision ((convexHull ℝ) ↑S) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonemptyhv:v ∉ affineSpan ℝ ↑(S.erase v)hpos:0 < S.cardhlt:(S.erase v).card < nK:Subdivision ((convexHull ℝ) ↑(S.erase v))hPne:((convexHull ℝ) ↑(S.erase v)).Nonemptyhv':v ∉ affineSpan ℝ ((convexHull ℝ) ↑(S.erase v))⊢ Subdivision (convexJoin ℝ {v} ((convexHull ℝ) ↑(S.erase v))) All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:¬∃ v ∈ S, (S.erase v).Nonempty ∧ v ∉ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) `push_neg` has been deprecated. Prefer using `push Not` instead. If you'd rather continue using `push_neg` in your project, you can implement it as follows: ``` open Lean.Parser.Tactic in macro "push_neg" cfg:optConfig loc:(location)? : tactic => `(tactic| push $cfg:optConfig Not $[$loc]?) ``` k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)⊢ ∀ v ∈ S, v ∈ affineSpan ℝ ↑(S.erase v) intro v k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ S⊢ v ∈ affineSpan ℝ ↑(S.erase v) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonempty⊢ v ∈ affineSpan ℝ ↑(S.erase v)k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:¬(S.erase v).Nonempty⊢ v ∈ affineSpan ℝ ↑(S.erase v) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:(S.erase v).Nonempty⊢ v ∈ affineSpan ℝ ↑(S.erase v) All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:¬(S.erase v).Nonempty⊢ v ∈ affineSpan ℝ ↑(S.erase v) k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:¬(S.erase v).Nonempty⊢ False k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Shne:S = ∅ ∨ S = {v}⊢ False k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Sh:S = ∅⊢ Falsek:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Sh:S = {v}⊢ False k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Sh:S = ∅⊢ False k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))v:Fin k → ℝhc:∅.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ ∅, v ∉ (convexHull ℝ) ↑(∅.erase v)hapex:∀ v ∈ ∅, (∅.erase v).Nonempty → v ∈ affineSpan ℝ ↑(∅.erase v)hvS:v ∈ ∅⊢ False; All goals completed! 🐙 k:ℕn:ℕIH:∀ m < n, ∀ (S : Finset (Fin k → ℝ)), S.card = m → Nonempty (Subdivision ((convexHull ℝ) ↑S))S:Finset (Fin k → ℝ)hc:S.card = nhai:¬AffineIndependent ℝ Subtype.valhred:∀ v ∈ S, v ∉ (convexHull ℝ) ↑(S.erase v)hapex:∀ v ∈ S, (S.erase v).Nonempty → v ∈ affineSpan ℝ ↑(S.erase v)v:Fin k → ℝhvS:v ∈ Sh:S = {v}⊢ False All goals completed! 🐙 /-- Equivalently, every `IsPolyhedron P` admits a subdivision. -/ theorem isPolyhedron_has_subdivision {P : Set (Fin k → ℝ)} (hP : IsPolyhedron P) : Nonempty (Subdivision P) := k:ℕP:Set (Fin k → ℝ)hP:IsPolyhedron P⊢ Nonempty (Subdivision P) k:ℕS:Finset (Fin k → ℝ)⊢ Nonempty (Subdivision ((convexHull ℝ) ↑S)) All goals completed! 🐙 end FamiliesOfMapsB01 end Submission