Rupert Counterexample

2. The Noperthedron🔗

2.1. Definition of the Noperthedron🔗

We define three points C_1,C_2,C_3\in \mathbb{Q}^3. C_1\coloneqq \frac{1}{259375205} \begin{pmatrix} {152024884} \\ 0 \\ {210152163} \end{pmatrix}, \qquad C_2\coloneqq \frac{1}{10^{10}} \begin{pmatrix} 6632738028 \\ 6106948881 \\ 3980949609 \end{pmatrix}, C_3\coloneqq \frac{1}{10^{10}} \begin{pmatrix} 8193990033 \\ 5298215096 \\ 1230614493 \end{pmatrix}.

Lean codedef C1 : Fin 3 := (1/259375205) * ![152024884, 0, 210152163] def C2 : Fin 3 := (1/10^10) * ![6632738028, 6106948881, 3980949609] def C3 : Fin 3 := (1/10^10) * ![8193990033, 5298215096, 1230614493] noncomputable def C1R : EuclideanSpace (Fin 3) := WithLp.toLp 2 (fun i => C1 i) noncomputable def C2R : EuclideanSpace (Fin 3) := WithLp.toLp 2 (fun i => C2 i) noncomputable def C3R : EuclideanSpace (Fin 3) := WithLp.toLp 2 (fun i => C3 i)
Lemma2.2
Group: Radius and norm control for noperthedron vertices. (2)
Hover another entry in this group to preview it.
Preview
Lemma 2.4
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

\| C_1 \| = 1, {98 \over 100} < \| C_2 \| < {99 \over 100}, and {98 \over 100} < \| C_3 \| < {99 \over 100}.

Lean code for Lemma2.23 theorems
  • complete
    theorem Noperthedron.c1_norm_oneNoperthedron.c1_norm_one : ‖C1R‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C1RNoperthedron.C1R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem Noperthedron.c1_norm_oneNoperthedron.c1_norm_one : ‖C1R‖ = 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C1RNoperthedron.C1R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
  • complete
    theorem Noperthedron.c2_norm_boundNoperthedron.c2_norm_bound : ‖C2R‖ ∈ Set.Ioo (98 / 100) (99 / 100) : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C2RNoperthedron.C2R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IooSet.Ioo.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Ioo a b` is the left-open right-open interval $(a, b)$.  (98 / 100) (99 / 100)
    theorem Noperthedron.c2_norm_boundNoperthedron.c2_norm_bound : ‖C2R‖ ∈ Set.Ioo (98 / 100) (99 / 100) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C2RNoperthedron.C2R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IooSet.Ioo.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Ioo a b` is the left-open right-open interval $(a, b)$.  (98 / 100) (99 / 100)
  • complete
    theorem Noperthedron.c3_norm_boundNoperthedron.c3_norm_bound : ‖C3R‖ ∈ Set.Ioo (98 / 100) (99 / 100) : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C3RNoperthedron.C3R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IooSet.Ioo.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Ioo a b` is the left-open right-open interval $(a, b)$.  (98 / 100) (99 / 100)
    theorem Noperthedron.c3_norm_boundNoperthedron.c3_norm_bound : ‖C3R‖ ∈ Set.Ioo (98 / 100) (99 / 100) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. C3RNoperthedron.C3R : Euc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  Membership.mem.{u, v} {α : outParam (Type u)} {γ : Type v} [self : Membership α γ] : γ → α → PropThe membership relation `a ∈ s : Prop` where `a : α`, `s : γ`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∈` in identifiers is `mem`. Set.IooSet.Ioo.{u_1} {α : Type u_1} [Preorder α] (a b : α) : Set α`Ioo a b` is the left-open right-open interval $(a, b)$.  (98 / 100) (99 / 100)
Proof

Trivial arithmetic.

Lean code-- expose: {NopertInline.c1_norm_one, NopertInline.c2_norm_bound, NopertInline.c3_norm_bound, NopertInline.C15} theorem c1_norm_one : C1R = 1 := C1R = 1 (∑ i, C1R.ofLp i ^ 2) = 1 have lez : 0 i, C1R i ^ 2 := C1R = 1 i Finset.univ, 0 C1R.ofLp i ^ 2 intro i i:Fin 3a✝:i Finset.univ0 C1R.ofLp i ^ 2 All goals completed! 🐙 lez:0 i, C1R.ofLp i ^ 2((∑ i, C1R.ofLp i ^ 2) ^ 2) = 1 lez:0 i, C1R.ofLp i ^ 2((∑ x, C1R.ofLp x ^ 2) ^ 2) = 1 lez:0 i, C1R.ofLp i ^ 2((∑ x, (WithLp.toLp 2 fun i ((1 / 259375205 * ![152024884, 0, 210152163]) i)).ofLp x ^ 2) ^ 2) = 1 lez:0 i, C1R.ofLp i ^ 2((((1 / 259375205) 0 * 152024884) ^ 2 + ((1 / 259375205) 1 * 0) ^ 2 + ((1 / 259375205) 2 * 210152163) ^ 2) ^ 2) = 1 All goals completed! 🐙 theorem c2_norm_bound : C2R Set.Ioo (98/100) (99/100) := C2R Set.Ioo (98 / 100) (99 / 100) (∑ i, C2R.ofLp i ^ 2) Set.Ioo (98 / 100) (99 / 100) 98 / 100 < (∑ i, C2R.ofLp i ^ 2)(∑ i, C2R.ofLp i ^ 2) < 99 / 100 98 / 100 < (∑ i, C2R.ofLp i ^ 2) (98 / 100) ^ 2 < i, C2R.ofLp i ^ 2 (98 / 100) ^ 2 < x, C2R.ofLp x ^ 2 (98 / 100) ^ 2 < x, (WithLp.toLp 2 fun i ((1 / 10 ^ 10 * ![6632738028, 6106948881, 3980949609]) i)).ofLp x ^ 2 (98 / 100) ^ 2 < ((1 / 10 ^ 10) 0 * 6632738028) ^ 2 + ((1 / 10 ^ 10) 1 * 6106948881) ^ 2 + ((1 / 10 ^ 10) 2 * 3980949609) ^ 2 All goals completed! 🐙 (∑ i, C2R.ofLp i ^ 2) < 99 / 100 refine (sqrt_lt' (0 < 99 / 100 All goals completed! 🐙)).mpr ?_ x, C2R.ofLp x ^ 2 < (99 / 100) ^ 2 x, (WithLp.toLp 2 fun i ((1 / 10 ^ 10 * ![6632738028, 6106948881, 3980949609]) i)).ofLp x ^ 2 < (99 / 100) ^ 2 ((1 / 10 ^ 10) 0 * 6632738028) ^ 2 + ((1 / 10 ^ 10) 1 * 6106948881) ^ 2 + ((1 / 10 ^ 10) 2 * 3980949609) ^ 2 < (99 / 100) ^ 2 All goals completed! 🐙 theorem c2_norm_le_one : C2R 1 := C2R 1 grw [c2_norm_bound.299 / 100 1 All goals completed! 🐙 theorem declaration uses `sorry`c3_norm_bound : C3R Set.Ioo (98/100) (99/100) := C3R Set.Ioo (98 / 100) (99 / 100) (∑ i, C3R.ofLp i ^ 2) Set.Ioo (98 / 100) (99 / 100) 98 / 100 < (∑ i, C3R.ofLp i ^ 2)(∑ i, C3R.ofLp i ^ 2) < 99 / 100 98 / 100 < (∑ i, C3R.ofLp i ^ 2) All goals completed! 🐙 (∑ i, C3R.ofLp i ^ 2) < 99 / 100 refine (sqrt_lt' (0 < 99 / 100 All goals completed! 🐙)).mpr ?_ x, C3R.ofLp x ^ 2 < (99 / 100) ^ 2 x, (WithLp.toLp 2 fun i ((1 / 10 ^ 10 * ![8193990033, 5298215096, 1230614493]) i)).ofLp x ^ 2 < (99 / 100) ^ 2 ((1 / 10 ^ 10) 0 * 8193990033) ^ 2 + ((1 / 10 ^ 10) 1 * 5298215096) ^ 2 + ((1 / 10 ^ 10) 2 * 1230614493) ^ 2 < (99 / 100) ^ 2 All goals completed! 🐙 -- deps for c3_norm_bound: -- { EuclideanSpace.norm_eq, lt_sqrt_of_sq_lt, Real.norm_eq_abs, C3R, C3, } -- deps we know: { } theorem c3_norm_le_one : C3R 1 := C3R 1 grw [c3_norm_bound.299 / 100 1 All goals completed! 🐙 /-- This is half of the C30 defined in \[SY25\]. In order to see that this is pointsymmetric, it's convenient to do explicit pointsymmetrization later. -/ noncomputable def C15 (pt : ℝ³) : Finset ℝ³ := Finset.range 15 |> .image fun (k : ) => RzL (2 * π * (k : ) / 15) pt lemma C15_nonempty (pt : ℝ³) : (C15 pt).Nonempty := pt:Euc(3)(C15 pt).Nonempty pt:Euc(3)(RzL 0) pt C15 pt pt:Euc(3)z:0 Finset.range 15(RzL 0) pt C15 pt pt:Euc(3)z:0 Finset.range 15 a < 15, (RzL (2 * π * a / 15)) pt = (RzL 0) pt pt:Euc(3)z:0 Finset.range 150 < 15 (RzL (2 * π * 0 / 15)) pt = (RzL 0) pt All goals completed! 🐙 lemma C15_pres_norm (pt v : ℝ³) (hv : v C15 pt) : v = pt := pt:Euc(3)v:Euc(3)hv:v C15 ptv = pt pt:Euc(3)v:Euc(3)hv: a < 15, (RzL (2 * π * a / 15)) pt = vv = pt pt:Euc(3)v:Euc(3)a:ha:a < 15ha':(RzL (2 * π * a / 15)) pt = vv = pt All goals completed! 🐙 end NopertInline
Lemma2.4
Group: Radius and norm control for noperthedron vertices. (2)
Hover another entry in this group to preview it.
Preview
Lemma 2.2
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

The radius of the Noperthedron is one.

Lean code for Lemma2.41 theorem
  • complete
    theorem Noperthedron.exactVertex_radius_oneNoperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1The radius of the noperthedron is 1.
     : {Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X vVertexIndex → Euc(3) :=Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3) }Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X.radiusPolyhedron.radius {ι X : Type} [Fintype ι] [ne : Nonempty ι] [Norm X] (p : Polyhedron ι X) : ℝ =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem Noperthedron.exactVertex_radius_oneNoperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1The radius of the noperthedron is 1.
     :
      {Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X vVertexIndex → Euc(3) :=Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3) }Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι X.radiusPolyhedron.radius {ι X : Type} [Fintype ι] [ne : Nonempty ι] [Norm X] (p : Polyhedron ι X) : ℝ =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    The radius of the noperthedron is 1.
    
Lean codeNoperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1#check exactVertex_radius_one Noperthedron.exactVertex_norm_le_one (j : VertexIndex) : exactVertex j 1#check exactVertex_norm_le_one Noperthedron.exactPoly_point_symmetric : PointSym exactPoly.hull#check exactPoly_point_symmetric

Rotations about the x, y, z axes R_x,R_y,R_z: \mathbb{R}\to \mathbb{R}^{3\times 3} are defined in the usual way: R_x(\alpha)\coloneqq \begin{pmatrix} 1 & 0 & 0\\ 0 & \cos\alpha & -\sin\alpha\\ 0 & \sin\alpha & \cos\alpha \end{pmatrix}, \hspace{1cm} R_y(\alpha)\coloneqq \begin{pmatrix} \cos\alpha & 0 & -\sin\alpha\\ 0 & 1 & 0\\ \sin\alpha & 0 & \cos\alpha \end{pmatrix}, R_z(\alpha)\coloneqq \begin{pmatrix} \cos\alpha & -\sin\alpha &0\\ \sin\alpha & \cos\alpha &0\\ 0 & 0 & 1 \end{pmatrix}.

Where Steininger and Yurkevich define a 30-element set C_{30}: \mathcal{C}_{30} \coloneqq \left\{(-1)^\ell R_z\left(\frac{2\pi k}{15}\right) \colon k=0,\dots,14; \ell=0,1\right\}. of rotations, we instead define

Definition2.6
Group: Noperthedron construction and core definitions. (3)
Hover another entry in this group to preview it.
Preview
Definition 2.7
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

\mathcal{C}_{15} \coloneqq \left\{ R_z\left(\frac{2\pi k}{15}\right) \colon k=0,\dots,14 \right\}.

Lean code for Definition2.61 definition
  • defdefined in Chapters/Noperthedron.lean
    complete
    def NopertInline.C15NopertInline.C15 (pt : Euc(3)) : Finset Euc(3)This is half of the C30 defined in \[SY25\]\. In order
    to see that this is pointsymmetric, it's convenient to
    do explicit pointsymmetrization later\.  (ptEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) : FinsetFinset.{u_4} (α : Type u_4) : Type u_4`Finset α` is the type of finite sets of elements of `α`. It is implemented
    as a multiset (a list up to permutation) which has no duplicate elements.  Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
    def NopertInline.C15NopertInline.C15 (pt : Euc(3)) : Finset Euc(3)This is half of the C30 defined in \[SY25\]\. In order
    to see that this is pointsymmetric, it's convenient to
    do explicit pointsymmetrization later\.  (ptEuc(3) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) :
      FinsetFinset.{u_4} (α : Type u_4) : Type u_4`Finset α` is the type of finite sets of elements of `α`. It is implemented
    as a multiset (a list up to permutation) which has no duplicate elements.  Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
    This is half of the C30 defined in \[SY25\]\. In order
    to see that this is pointsymmetric, it's convenient to
    do explicit pointsymmetrization later\. 

without point-symmetricness "baked in" as it is in C_{30}. It's more convenient for the formalization to apply C_{15} to the points C_1, C_2, C_3, and then point-symmetrize that set afterwards.

Definition2.7
Group: Noperthedron construction and core definitions. (3)
Hover another entry in this group to preview it.
Preview
Definition 2.6
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

A set S \subseteq \R^3 is point-symmetric if x \in S implies -x \in S.

Lean code for Definition2.71 definition
  • complete
    def PointSymPointSym {n : ℕ} (A : Set Euc(n)) : Prop {n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } (ASet Euc(n) : SetSet.{u} (α : Type u) : Type uA set is a collection of elements of some type `α`.
    
    Although `Set` is defined as `α → Prop`, this is an implementation detail which should not be
    relied on. Instead, `setOf` and membership of a set (`∈`) should be used to convert between sets
    and predicates.
     Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. n)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    def PointSymPointSym {n : ℕ} (A : Set Euc(n)) : Prop {n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } (ASet Euc(n) : SetSet.{u} (α : Type u) : Type uA set is a collection of elements of some type `α`.
    
    Although `Set` is defined as `α → Prop`, this is an implementation detail which should not be
    relied on. Instead, `setOf` and membership of a set (`∈`) should be used to convert between sets
    and predicates.
     Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. n)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
Definition2.8
Group: Noperthedron construction and core definitions. (3)
Hover another entry in this group to preview it.
Preview
Definition 2.6
Loading preview
Hover a group entry to preview it.
XL∃∀Nused by 1

The pointsymmetrization of a collection of vertices v_1, \ldots, v_n \in \R^3 is v_1, \ldots, v_n, -v_1, \ldots, -v_n.

We write \mathcal{C}_{15} \cdot P = \{c P \,\text{ for } \, c \in \mathcal{C}_{15}\} for the orbit of P under the action of \mathcal{C}_{15}.

Definition2.9
Group: Noperthedron construction and core definitions. (3)
Hover another entry in this group to preview it.
Preview
Definition 2.6
Loading preview
Hover a group entry to preview it.
L∃∀N

Using Definition 2.8 and Definition 2.6.

The Noperthedron is the polyhedron given by the vertex set that is the pointsymmetrization of \mathcal{C}_{15} \cdot C_1 \cup \mathcal{C}_{15} \cdot C_2 \cup \mathcal{C}_{15} \cdot C_3

Lean code for Definition2.92 definitions
  • complete
    def Noperthedron.exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3) (idxVertexIndex : VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
    ) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
    def Noperthedron.exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3)
      (idxVertexIndex : VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
    ) : Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
  • complete
    def Noperthedron.exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3) : PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
     Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
    def Noperthedron.exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3) :
      PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.  VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
     Euc(EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 3)EuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation. 
Lemma2.10
Group: Radius and norm control for noperthedron vertices. (2)
Hover another entry in this group to preview it.
Preview
Lemma 2.2
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

The norm of any vertex in the prepointsymmetrized version of the Noperthedron is no more than 1.

Lean code for Lemma2.101 theorem
  • complete
    theorem Noperthedron.exactVertex_norm_le_oneNoperthedron.exactVertex_norm_le_one (j : VertexIndex) : ‖exactVertex j‖ ≤ 1 (jVertexIndex : VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
    ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3) jVertexIndexNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1
    theorem Noperthedron.exactVertex_norm_le_oneNoperthedron.exactVertex_norm_le_one (j : VertexIndex) : ‖exactVertex j‖ ≤ 1
      (jVertexIndex : VertexIndexNoperthedron.VertexIndex : TypeIdentifier for a Noperthedron vertex.
    Corresponds to the point at `(-1)^ℓ • Rz(2π k / 15) (C i)`
    ) : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. exactVertexNoperthedron.exactVertex (idx : VertexIndex) : Euc(3) jVertexIndexNorm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  LE.le.{u} {α : Type u} [self : LE α] : α → α → PropThe less-equal relation: `x ≤ y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≤` in identifiers is `le`. 1
Proof

Evident from definitions.

Lemma2.11
groupXL∃∀Nused by 1

The pointsymmetrization of any set is point-symmetric.

Proof

Evident from definitions.

Lemma2.12
groupL∃∀Nused by 1

Definition 2.7 Definition 2.9

The noperthedron is point-symmetric.

Lean code for Lemma2.121 theorem
  • complete
    theorem Noperthedron.exactPoly_point_symmetricNoperthedron.exactPoly_point_symmetric : PointSym exactPoly.hullThe noperthedron is pointsymmetric.
     : PointSymPointSym {n : ℕ} (A : Set Euc(n)) : Prop exactPolyNoperthedron.exactPoly : GoodPoly VertexIndex.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    theorem Noperthedron.exactPoly_point_symmetricNoperthedron.exactPoly_point_symmetric : PointSym exactPoly.hullThe noperthedron is pointsymmetric.
     :
      PointSymPointSym {n : ℕ} (A : Set Euc(n)) : Prop exactPolyNoperthedron.exactPoly : GoodPoly VertexIndex.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    The noperthedron is pointsymmetric.
    
Proof

Follows from Lemma 2.11

2.2. Refined Rupert's property for the Noperthedron🔗

Lemma2.13
groupL∃∀Nused by 1

Let \PPP = \NOP, then for all \theta, \varphi, \alpha \in \R, the following three identities hold (as sets):

\begin{align*} M({\theta+2\pi/15,\varphi})\cdot \PPP &=M(\theta, \phi) \cdot \PPP,\\ R(\alpha+\pi)M(\theta, \phi) \cdot \PPP &=R(\alpha)M(\theta, \phi) \cdot \PPP,\\ \begin{pmatrix} 1&0\\ 0&-1 \end{pmatrix} M(\theta, \phi) \cdot \PPP&= M({\theta+\pi/15,\pi-\varphi}) \cdot \PPP. \end{align*}

Lean code for Lemma2.133 theorems
  • theoremdefined in Noperthedron/Tightening.lean
    complete
    theorem Noperthedron.Tightening.lemma7_1Noperthedron.Tightening.lemma7_1 (θ φ : ℝ) :
      ⇑(rotM (θ + 2 / 15 * Real.pi) φ) '' exactPolyhedron.hull = ⇑(rotM θ φ) '' exactPolyhedron.hull (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.θ +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. 2 / 15 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
    theorem Noperthedron.Tightening.lemma7_1Noperthedron.Tightening.lemma7_1 (θ φ : ℝ) :
      ⇑(rotM (θ + 2 / 15 * Real.pi) φ) '' exactPolyhedron.hull = ⇑(rotM θ φ) '' exactPolyhedron.hull
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.θ +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. 2 / 15 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`. 
          exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
  • theoremdefined in Noperthedron/Tightening.lean
    complete
    theorem Noperthedron.Tightening.lemma7_2Noperthedron.Tightening.lemma7_2 (θ φ α : ℝ) :
      ⇑(rotR (α + Real.pi)) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull = ⇑(rotR α) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull (θ φ α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.α +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.) Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α) Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
    theorem Noperthedron.Tightening.lemma7_2Noperthedron.Tightening.lemma7_2 (θ φ α : ℝ) :
      ⇑(rotR (α + Real.pi)) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull = ⇑(rotR α) ∘ ⇑(rotM θ φ) '' exactPolyhedron.hull
      (θ φ α : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.α +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.) Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`. 
          exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α) Function.comp.{u, v, w} {α : Sort u} {β : Sort v} {δ : Sort w} (f : β → δ) (g : α → β) : α → δFunction composition, usually written with the infix operator `∘`. A new function is created from
    two existing functions, where one function's output is used as input to the other.
    
    Examples:
     * `Function.comp List.reverse (List.drop 2) [3, 2, 4, 1] = [1, 4]`
     * `(List.reverse ∘ List.drop 2) [3, 2, 4, 1] = [1, 4]`
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∘` in identifiers is `comp`. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`. 
          exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
  • theoremdefined in Noperthedron/Tightening.lean
    complete
    theorem Noperthedron.Tightening.lemma7_3Noperthedron.Tightening.lemma7_3 (θ φ : ℝ) :
      ⇑(flip_y.comp (rotM θ φ)) '' exactPolyhedron.hull = ⇑(rotM (θ + Real.pi / 15) (Real.pi - φ)) '' exactPolyhedron.hull (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (flip_yflip_y : Euc(2) →L[ℝ] Euc(2).compContinuousLinearMap.comp.{u_1, u_2, u_3, u_4, u_6, u_7} {R₁ : Type u_1} {R₂ : Type u_2} {R₃ : Type u_3} [Semiring R₁]
      [Semiring R₂] [Semiring R₃] {σ₁₂ : R₁ →+* R₂} {σ₂₃ : R₂ →+* R₃} {σ₁₃ : R₁ →+* R₃} {M₁ : Type u_4}
      [TopologicalSpace M₁] [AddCommMonoid M₁] {M₂ : Type u_6} [TopologicalSpace M₂] [AddCommMonoid M₂] {M₃ : Type u_7}
      [TopologicalSpace M₃] [AddCommMonoid M₃] [Module R₁ M₁] [Module R₂ M₂] [Module R₃ M₃] [RingHomCompTriple σ₁₂ σ₂₃ σ₁₃]
      (g : M₂ →SL[σ₂₃] M₃) (f : M₁ →SL[σ₁₂] M₂) : M₁ →SL[σ₁₃] M₃Composition of bounded linear maps.  (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ)) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.θ +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 15)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). φ)HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`.  exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
    theorem Noperthedron.Tightening.lemma7_3Noperthedron.Tightening.lemma7_3 (θ φ : ℝ) :
      ⇑(flip_y.comp (rotM θ φ)) '' exactPolyhedron.hull = ⇑(rotM (θ + Real.pi / 15) (Real.pi - φ)) '' exactPolyhedron.hull
      (θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) :
      (flip_yflip_y : Euc(2) →L[ℝ] Euc(2).compContinuousLinearMap.comp.{u_1, u_2, u_3, u_4, u_6, u_7} {R₁ : Type u_1} {R₂ : Type u_2} {R₃ : Type u_3} [Semiring R₁]
      [Semiring R₂] [Semiring R₃] {σ₁₂ : R₁ →+* R₂} {σ₂₃ : R₂ →+* R₃} {σ₁₃ : R₁ →+* R₃} {M₁ : Type u_4}
      [TopologicalSpace M₁] [AddCommMonoid M₁] {M₂ : Type u_6} [TopologicalSpace M₂] [AddCommMonoid M₂] {M₃ : Type u_7}
      [TopologicalSpace M₃] [AddCommMonoid M₃] [Module R₁ M₁] [Module R₂ M₂] [Module R₃ M₃] [RingHomCompTriple σ₁₂ σ₂₃ σ₁₃]
      (g : M₂ →SL[σ₂₃] M₃) (f : M₁ →SL[σ₁₂] M₂) : M₁ →SL[σ₁₃] M₃Composition of bounded linear maps.  (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ)) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`. 
          exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.θ +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. 15)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.
              (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). φ)HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).) ''Set.image.{u, v} {α : Type u} {β : Type v} (f : α → β) (s : Set α) : Set βThe image of `s : Set α` by `f : α → β`, written `f '' s`, is the set of `b : β` such that
    `f a = b` for some `a ∈ s`. 
          exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
Proof

See polyhedron.without.rupert, Lemma 7.

Corollary2.14
groupL∃∀Nused by 1

If the noperthedron is Rupert, then there exists a solution with

\begin{align*} \theta_1,\theta_2&\in[0,2\pi/15] \subset [0,0.42], \\ \varphi_1&\in [0,\pi] \subset [0,3.15],\\ \varphi_2&\in [0,\pi/2] \subset [0,1.58],\\ \alpha &\in [-\pi/2,\pi/2] \subset [-1.58,1.58]. \end{align*}

Lean code for Corollary2.141 theorem
  • theoremdefined in Noperthedron/Tightening.lean
    complete
    theorem Noperthedron.Tightening.rupert_tighteningNoperthedron.Tightening.rupert_tightening (p : Pose ℝ) (r : RupertPose p exactPolyhedron.hull) :
      ∃ p', tightInterval.contains p' ∧ RupertPose p' exactPolyhedron.hull (pPose ℝ : PosePose (R : Type) : Type Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (rRupertPose p exactPolyhedron.hull : RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     pPose ℝ exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)) :
       p'Pose ℝ, tightIntervaltightInterval : PoseInterval ℝThe 5d box in parameter space that represents what constraints we can
    impose on angles taking advantage of the particular symmetries of the
    Noperthedron.
    .containsPoseInterval.contains {R : Type} [PartialOrder R] (iv : PoseInterval R) (vp : Pose R) : Prop`iv.contains p` ↔ `p ∈ Set.Icc iv.min iv.max` ↔ `p ∈ iv`. Provided as a
    named alias for legibility at call sites; `iv.contains p` and `p ∈ iv` are
    definitionally equal.  p'Pose ℝ And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`. RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     p'Pose ℝ exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
    theorem Noperthedron.Tightening.rupert_tighteningNoperthedron.Tightening.rupert_tightening (p : Pose ℝ) (r : RupertPose p exactPolyhedron.hull) :
      ∃ p', tightInterval.contains p' ∧ RupertPose p' exactPolyhedron.hull
      (pPose ℝ : PosePose (R : Type) : Type Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (rRupertPose p exactPolyhedron.hull :
        RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     pPose ℝ exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)) :
       p'Pose ℝ,
        tightIntervaltightInterval : PoseInterval ℝThe 5d box in parameter space that represents what constraints we can
    impose on angles taking advantage of the particular symmetries of the
    Noperthedron.
    .containsPoseInterval.contains {R : Type} [PartialOrder R] (iv : PoseInterval R) (vp : Pose R) : Prop`iv.contains p` ↔ `p ∈ Set.Icc iv.min iv.max` ↔ `p ∈ iv`. Provided as a
    named alias for legibility at call sites; `iv.contains p` and `p ∈ iv` are
    definitionally equal.  p'Pose ℝ And (a b : Prop) : Prop`And a b`, or `a ∧ b`, is the conjunction of propositions. It can be
    constructed and destructed like a pair: if `ha : a` and `hb : b` then
    `⟨ha, hb⟩ : a ∧ b`, and if `h : a ∧ b` then `h.left : a` and `h.right : b`.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∧` in identifiers is `and`.
          RupertPoseRupertPose {P : Type} [PoseLike P] (p : P) (s : Set Euc(3)) : PropA pose `p` demonstrates that a set `s` is rupert if the closure of the
    `p`-inner-shadow of `s` is a subset of the interior of the
    `p`-outer-shadow of `s`.
     p'Pose ℝ exactPolyhedronNoperthedron.exactPolyhedron : Polyhedron VertexIndex Euc(3).hullPolyhedron.hull {ι : Type} [Fintype ι] (poly : Polyhedron ι Euc(3)) : Set Euc(3)
Proof

Using Lemma 2.13.

See polyhedron.without.rupert, Lemma 8.