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 code
Associated Lean declarations
-
NopertInline.C1[complete]
-
NopertInline.C2[complete]
-
NopertInline.C3[complete]
-
NopertInline.C1R[complete]
-
NopertInline.C2R[complete]
-
NopertInline.C3R[complete]
-
NopertInline.C1[complete] -
NopertInline.C2[complete] -
NopertInline.C3[complete] -
NopertInline.C1R[complete] -
NopertInline.C2R[complete] -
NopertInline.C3R[complete]
def 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)
-
c1_norm_one[complete] -
c2_norm_bound[complete] -
c3_norm_bound[complete]
\| C_1 \| = 1,
{98 \over 100} < \| C_2 \| < {99 \over 100}, and
{98 \over 100} < \| C_3 \| < {99 \over 100}.
Lean code for Lemma2.2●3 theorems
Associated Lean declarations
-
c1_norm_one[complete]
-
c2_norm_bound[complete]
-
c3_norm_bound[complete]
-
c1_norm_one[complete] -
c2_norm_bound[complete] -
c3_norm_bound[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c1_norm_one
Noperthedron.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`.1theorem Noperthedron.c1_norm_one
Noperthedron.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 -
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c2_norm_bound
Noperthedron.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_bound
Noperthedron.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) -
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.c3_norm_bound
Noperthedron.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_bound
Noperthedron.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)
Trivial arithmetic.
Lean code
Associated Lean declarations
-
NopertInline.C15[complete]
-
NopertInline.c1_norm_one[complete]
-
NopertInline.c2_norm_bound[complete]
-
NopertInline.c2_norm_le_one[complete]
-
NopertInline.c3_norm_bound[sorry in proof]
-
NopertInline.c3_norm_le_one[complete]
-
NopertInline.C15_nonempty[complete]
-
NopertInline.C15_pres_norm[complete]
-
NopertInline.C15[complete] -
NopertInline.c1_norm_one[complete] -
NopertInline.c2_norm_bound[complete] -
NopertInline.c2_norm_le_one[complete] -
NopertInline.c3_norm_bound[sorry in proof] -
NopertInline.c3_norm_le_one[complete] -
NopertInline.C15_nonempty[complete] -
NopertInline.C15_pres_norm[complete]
-- 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.univ⊢ 0 ≤ ‖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.2⊢ 99 / 100 ≤ 1
All goals completed! 🐙
theorem 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.2⊢ 99 / 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 15⊢ 0 < 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 pt⊢ ‖v‖ = ‖pt‖
pt:Euc(3)v:Euc(3)hv:∃ a < 15, (RzL (2 * π * ↑a / 15)) pt = v⊢ ‖v‖ = ‖pt‖
pt:Euc(3)v:Euc(3)a:ℕha:a < 15ha':(RzL (2 * π * ↑a / 15)) pt = v⊢ ‖v‖ = ‖pt‖
All goals completed! 🐙
end NopertInline
-
exactVertex_radius_one[complete]
The radius of the Noperthedron is one.
Lean code for Lemma2.4●1 theorem
Associated Lean declarations
-
exactVertex_radius_one[complete]
-
exactVertex_radius_one[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactVertex_radius_one
Noperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1The radius of the noperthedron is 1.: {Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι XvVertexIndex → Euc(3):=Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι XexactVertexNoperthedron.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`.1theorem Noperthedron.exactVertex_radius_one
Noperthedron.exactVertex_radius_one : { v := exactVertex }.radius = 1The radius of the noperthedron is 1.: {Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι XvVertexIndex → Euc(3):=Polyhedron.mk {ι X : Type} (v : ι → X) : Polyhedron ι XexactVertexNoperthedron.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`.1The radius of the noperthedron is 1.
Lemma 2.2 Theorem 4.5 [??] Lemma 2.10
By Lemma 2.2, Theorem 4.5, [??], and Lemma 2.10.
Lean code
#check exactVertex_radius_one
#check exactVertex_norm_le_one
#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
-
NopertInline.C15[complete]
\mathcal{C}_{15} \coloneqq \left\{ R_z\left(\frac{2\pi k}{15}\right) \colon k=0,\dots,14 \right\}.
Lean code for Definition2.6●1 definition
Associated Lean declarations
-
NopertInline.C15[complete]
-
NopertInline.C15[complete]
-
defdefined in Chapters/Noperthedron.leancomplete
def NopertInline.C15
NopertInline.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.C15
NopertInline.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.
A set S \subseteq \R^3 is point-symmetric if x \in S implies -x \in S.
Lean code for Definition2.7●1 definition
Associated Lean declarations
-
PointSym[complete]
-
PointSym[complete]
-
defdefined in Noperthedron/PointSym.leancomplete
def PointSym
PointSym {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 PointSym
PointSym {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`.
- No associated Lean code or declarations.
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}.
-
exactVertex[complete] -
exactPolyhedron[complete]
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.9●2 definitions
Associated Lean declarations
-
exactVertex[complete]
-
exactPolyhedron[complete]
-
exactVertex[complete] -
exactPolyhedron[complete]
-
defdefined in Noperthedron/Vertices/Exact.leancomplete
def Noperthedron.exactVertex
Noperthedron.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.exactVertex
Noperthedron.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. -
defdefined in Noperthedron/Vertices/Exact.leancomplete
def Noperthedron.exactPolyhedron
Noperthedron.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.exactPolyhedron
Noperthedron.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.
The norm of any vertex in the prepointsymmetrized version of the Noperthedron is no more than 1.
Lean code for Lemma2.10●1 theorem
Associated Lean declarations
-
exactVertex_norm_le_one[complete]
-
exactVertex_norm_le_one[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactVertex_norm_le_one
Noperthedron.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)jVertexIndex‖Norm.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`.1theorem Noperthedron.exactVertex_norm_le_one
Noperthedron.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)jVertexIndex‖Norm.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
Evident from definitions.
The pointsymmetrization of any set is point-symmetric.
Evident from definitions.
The noperthedron is point-symmetric.
Lean code for Lemma2.12●1 theorem
Associated Lean declarations
-
exactPoly_point_symmetric[complete]
-
exactPoly_point_symmetric[complete]
-
theoremdefined in Noperthedron/Vertices/Exact.leancomplete
theorem Noperthedron.exactPoly_point_symmetric
Noperthedron.exactPoly_point_symmetric : PointSym exactPoly.hullThe noperthedron is pointsymmetric.: PointSymPointSym {n : ℕ} (A : Set Euc(n)) : PropexactPolyNoperthedron.exactPoly : GoodPoly VertexIndex.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)theorem Noperthedron.exactPoly_point_symmetric
Noperthedron.exactPoly_point_symmetric : PointSym exactPoly.hullThe noperthedron is pointsymmetric.: PointSymPointSym {n : ℕ} (A : Set Euc(n)) : PropexactPolyNoperthedron.exactPoly : GoodPoly VertexIndex.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)The noperthedron is pointsymmetric.
Follows from Lemma 2.11
2.2. Refined Rupert's property for the Noperthedron
-
Tightening.lemma7_1[complete] -
Tightening.lemma7_2[complete] -
Tightening.lemma7_3[complete]
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.13●3 theorems
Associated Lean declarations
-
Tightening.lemma7_1[complete]
-
Tightening.lemma7_2[complete]
-
Tightening.lemma7_3[complete]
-
Tightening.lemma7_1[complete] -
Tightening.lemma7_2[complete] -
Tightening.lemma7_3[complete]
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.lemma7_1
Noperthedron.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_1
Noperthedron.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.leancomplete
theorem Noperthedron.Tightening.lemma7_2
Noperthedron.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_2
Noperthedron.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.leancomplete
theorem Noperthedron.Tightening.lemma7_3
Noperthedron.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_3
Noperthedron.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)
See polyhedron.without.rupert, Lemma 7.
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.14●1 theorem
Associated Lean declarations
-
Tightening.rupert_tightening[complete]
-
Tightening.rupert_tightening[complete]
-
theoremdefined in Noperthedron/Tightening.leancomplete
theorem Noperthedron.Tightening.rupert_tightening
Noperthedron.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_tightening
Noperthedron.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)
Using Lemma 2.13.
See polyhedron.without.rupert, Lemma 8.