4. Preliminaries
TODO: This whole chapter needs organization, it's just a grab bag of miscellaneous results for now.
4.1. Rupert Sets
-
rupert_iff_rupert_set[complete]
The following are equivalent:
-
The convex polyhedron with vertex set
vis Rupert. -
The convex closure of
vis a Rupert set.
Lean code for Theorem4.1●1 theorem
Associated Lean declarations
-
rupert_iff_rupert_set[complete]
-
rupert_iff_rupert_set[complete]
-
theoremdefined in Noperthedron/Rupert/Equivalences/RupertEquivRupertSet.leancomplete
theorem rupert_iff_rupert_set
rupert_iff_rupert_set (v : Finset Euc(3)) : IsRupert v ↔ IsRupertSet ((convexHull ℝ) ↑v)(vFinset Euc(3): 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.) : IsRupertIsRupert (vertices : Finset Euc(3)) : PropThe Rupert Property for a convex polyhedron given as a finite set of vertices.vFinset Euc(3)↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).IsRupertSetIsRupertSet (S : Set Euc(3)) : PropThe Rupert Property for a subset S of ℝ³. S has the Rupert property if there are rotations and translations such that one 2-dimensional "shadow" of S can be made to fit entirely inside the interior of another such "shadow".((convexHullconvexHull.{u_1, u_2} (𝕜 : Type u_1) {E : Type u_2} [Semiring 𝕜] [PartialOrder 𝕜] [AddCommMonoid E] [Module 𝕜 E] : ClosureOperator (Set E)The convex hull of a set `s` is the minimal convex set that includes `s`.ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.) ↑vFinset Euc(3))theorem rupert_iff_rupert_set
rupert_iff_rupert_set (v : Finset Euc(3)) : IsRupert v ↔ IsRupertSet ((convexHull ℝ) ↑v)(vFinset Euc(3): 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.) : IsRupertIsRupert (vertices : Finset Euc(3)) : PropThe Rupert Property for a convex polyhedron given as a finite set of vertices.vFinset Euc(3)↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).IsRupertSetIsRupertSet (S : Set Euc(3)) : PropThe Rupert Property for a subset S of ℝ³. S has the Rupert property if there are rotations and translations such that one 2-dimensional "shadow" of S can be made to fit entirely inside the interior of another such "shadow".((convexHullconvexHull.{u_1, u_2} (𝕜 : Type u_1) {E : Type u_2} [Semiring 𝕜] [PartialOrder 𝕜] [AddCommMonoid E] [Module 𝕜 E] : ClosureOperator (Set E)The convex hull of a set `s` is the minimal convex set that includes `s`.ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.) ↑vFinset Euc(3))
TODO: import this from the other repo
4.2. Poses
TODO
-
pose_of_matrix_pose[complete] -
converted_pose_rupert_iff[complete]
Given a pose with zero offset, there exists a 5-parameter pose that is equivalent to it.
Lean code for Theorem4.2●2 theorems
Associated Lean declarations
-
pose_of_matrix_pose[complete]
-
converted_pose_rupert_iff[complete]
-
pose_of_matrix_pose[complete] -
converted_pose_rupert_iff[complete]
-
theoremdefined in Noperthedron/ConvertPose.leancomplete
theorem pose_of_matrix_pose
pose_of_matrix_pose (p : MatrixPose) : ∃ δ pp, pp.matrixPoseOfPose = p.zeroOffset.rotateBy δFor any MatrixPose p, after rotating by the right δ, there exists a Pose that equals the rotated zeroOffset.(pMatrixPose: MatrixPoseMatrixPose : Type) : ∃ δℝppPose ℝ, ppPose ℝ.matrixPoseOfPosePose.matrixPoseOfPose (p : Pose ℝ) : MatrixPoseConvert a Pose to a MatrixPose.=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`.pMatrixPose.zeroOffsetMatrixPose.zeroOffset (p : MatrixPose) : MatrixPose.rotateByMatrixPose.rotateBy (p : MatrixPose) (δ : ℝ) : MatrixPoseRotate a MatrixPose by applying Rz(δ) to both rotations and the offset.δℝtheorem pose_of_matrix_pose
pose_of_matrix_pose (p : MatrixPose) : ∃ δ pp, pp.matrixPoseOfPose = p.zeroOffset.rotateBy δFor any MatrixPose p, after rotating by the right δ, there exists a Pose that equals the rotated zeroOffset.(pMatrixPose: MatrixPoseMatrixPose : Type) : ∃ δℝppPose ℝ, ppPose ℝ.matrixPoseOfPosePose.matrixPoseOfPose (p : Pose ℝ) : MatrixPoseConvert a Pose to a MatrixPose.=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`.pMatrixPose.zeroOffsetMatrixPose.zeroOffset (p : MatrixPose) : MatrixPose.rotateByMatrixPose.rotateBy (p : MatrixPose) (δ : ℝ) : MatrixPoseRotate a MatrixPose by applying Rz(δ) to both rotations and the offset.δℝFor any MatrixPose p, after rotating by the right δ, there exists a Pose that equals the rotated zeroOffset.
-
theoremdefined in Noperthedron/ConvertPose.leancomplete
theorem converted_pose_rupert_iff
converted_pose_rupert_iff (v : Pose ℝ) (S : Set Euc(3)) : RupertPose v S ↔ RupertPose v.matrixPoseOfPose S(vPose ℝ: PosePose (R : Type) : TypeℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.) (SSet Euc(3): 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.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.) : 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`.vPose ℝSSet Euc(3)↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).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`.vPose ℝ.matrixPoseOfPosePose.matrixPoseOfPose (p : Pose ℝ) : MatrixPoseConvert a Pose to a MatrixPose.SSet Euc(3)theorem converted_pose_rupert_iff
converted_pose_rupert_iff (v : Pose ℝ) (S : Set Euc(3)) : RupertPose v S ↔ RupertPose v.matrixPoseOfPose S(vPose ℝ: PosePose (R : Type) : TypeℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.) (SSet Euc(3): 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.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.) : 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`.vPose ℝSSet Euc(3)↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).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`.vPose ℝ.matrixPoseOfPosePose.matrixPoseOfPose (p : Pose ℝ) : MatrixPoseConvert a Pose to a MatrixPose.SSet Euc(3)
By putting the pose into a canonical form as a Z rotation followed by a Y followed by a Z.
4.3. Pointsymmetry and Rupertness
-
rupert_implies_rot_rupert[complete]
If a set is point symmetric and convex, then it being Rupert implies it being purely rotationally Rupert.
Lean code for Theorem4.3●1 theorem
Associated Lean declarations
-
rupert_implies_rot_rupert[complete]
-
rupert_implies_rot_rupert[complete]
-
theoremdefined in Noperthedron/CommonCenter.leancomplete
theorem rupert_implies_rot_rupert
rupert_implies_rot_rupert {S : Set Euc(3)} (s_sym : PointSym S) (s_convex : Convex ℝ S) (p : MatrixPose) (r : RupertPose p S) : RupertPose p.zeroOffset SIf a set is point symmetric and convex, then it being rupert implies being purely rotationally rupert.{SSet Euc(3): 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.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.} (s_symPointSym S: PointSymPointSym {n : ℕ} (A : Set Euc(n)) : PropSSet Euc(3)) (s_convexConvex ℝ S: ConvexConvex.{u_1, u_2} (𝕜 : Type u_1) {E : Type u_2} [Semiring 𝕜] [PartialOrder 𝕜] [AddCommMonoid E] [SMul 𝕜 E] (s : Set E) : PropConvexity of sets.ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.SSet Euc(3)) (pMatrixPose: MatrixPoseMatrixPose : Type) (rRupertPose p S: 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`.pMatrixPoseSSet Euc(3)) : 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`.pMatrixPose.zeroOffsetMatrixPose.zeroOffset (p : MatrixPose) : MatrixPoseSSet Euc(3)theorem rupert_implies_rot_rupert
rupert_implies_rot_rupert {S : Set Euc(3)} (s_sym : PointSym S) (s_convex : Convex ℝ S) (p : MatrixPose) (r : RupertPose p S) : RupertPose p.zeroOffset SIf a set is point symmetric and convex, then it being rupert implies being purely rotationally rupert.{SSet Euc(3): 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.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.} (s_symPointSym S: PointSymPointSym {n : ℕ} (A : Set Euc(n)) : PropSSet Euc(3)) (s_convexConvex ℝ S: ConvexConvex.{u_1, u_2} (𝕜 : Type u_1) {E : Type u_2} [Semiring 𝕜] [PartialOrder 𝕜] [AddCommMonoid E] [SMul 𝕜 E] (s : Set E) : PropConvexity of sets.ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.SSet Euc(3)) (pMatrixPose: MatrixPoseMatrixPose : Type) (rRupertPose p S: 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`.pMatrixPoseSSet Euc(3)) : 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`.pMatrixPose.zeroOffsetMatrixPose.zeroOffset (p : MatrixPose) : MatrixPoseSSet Euc(3)If a set is point symmetric and convex, then it being rupert implies being purely rotationally rupert.
TODO: informalize proof
Suppose S is a finite set of points in \R^n.
The radius of the polyhedron S is r iff
-
there is a vector
v \in Swith\|v\| = r -
all vectors
v \in Shave\|v\| \le r
Lean code for Theorem4.4●1 theorem
Associated Lean declarations
-
Polyhedron.radius_iff[complete]
-
Polyhedron.radius_iff[complete]
-
theoremdefined in Noperthedron/Basic.leancomplete
theorem Polyhedron.radius_iff
Polyhedron.radius_iff {r : ℝ} {ι X : Type} [Fintype ι] [ne : Nonempty ι] [Norm X] (iv : Polyhedron ι X) : iv.radius = r ↔ (∃ i, ‖iv.v i‖ = r) ∧ ∀ (i : ι), ‖iv.v i‖ ≤ r{rℝ: ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.} {ιTypeXType: TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`.} [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only finitely many distinct elements of type `α`. The evidence of this is a finset `elems` (a list up to permutation without duplicates), together with a proof that everything of type `α` is in the list.ιType] [neNonempty ι: NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type, that is, there exists an element in the type. It differs from `Inhabited α` in that `Nonempty α` is a `Prop`, which means that it does not actually carry an element of `α`, only a proof that *there exists* such an element. Given `Nonempty α`, you can construct an element of `α` *nonconstructively* using `Classical.choice`.ιType] [NormNorm.{u_8} (E : Type u_8) : Type u_8Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This class is designed to be extended in more interesting classes specifying the properties of the norm.XType] (ivPolyhedron ι X: PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.ιTypeXType) : ivPolyhedron ι 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`.rℝ↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).(∃ iι, ‖Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.ivPolyhedron ι X.vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → Xiι‖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`.rℝ) ∧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`.∀ (iι: ιType), ‖Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.ivPolyhedron ι X.vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → Xiι‖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`.rℝtheorem Polyhedron.radius_iff
Polyhedron.radius_iff {r : ℝ} {ι X : Type} [Fintype ι] [ne : Nonempty ι] [Norm X] (iv : Polyhedron ι X) : iv.radius = r ↔ (∃ i, ‖iv.v i‖ = r) ∧ ∀ (i : ι), ‖iv.v i‖ ≤ r{rℝ: ℝReal : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational numbers.} {ιTypeXType: TypeA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`.} [FintypeFintype.{u_4} (α : Type u_4) : Type u_4`Fintype α` means that `α` is finite, i.e. there are only finitely many distinct elements of type `α`. The evidence of this is a finset `elems` (a list up to permutation without duplicates), together with a proof that everything of type `α` is in the list.ιType] [neNonempty ι: NonemptyNonempty.{u} (α : Sort u) : Prop`Nonempty α` is a typeclass that says that `α` is not an empty type, that is, there exists an element in the type. It differs from `Inhabited α` in that `Nonempty α` is a `Prop`, which means that it does not actually carry an element of `α`, only a proof that *there exists* such an element. Given `Nonempty α`, you can construct an element of `α` *nonconstructively* using `Classical.choice`.ιType] [NormNorm.{u_8} (E : Type u_8) : Type u_8Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This class is designed to be extended in more interesting classes specifying the properties of the norm.XType] (ivPolyhedron ι X: PolyhedronPolyhedron (ι X : Type) : TypeA convex polyhedron, given as a finite indexed set of vertices.ιTypeXType) : ivPolyhedron ι 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`.rℝ↔Iff (a b : Prop) : PropIf and only if, or logical bi-implication. `a ↔ b` means that `a` implies `b` and vice versa. By `propext`, this implies that `a` and `b` are equal and hence any expression involving `a` is equivalent to the corresponding expression with `b` instead. Conventions for notations in identifiers: * The recommended spelling of `↔` in identifiers is `iff`. * The recommended spelling of `<->` in identifiers is `iff` (prefer `↔` over `<->`).(∃ iι, ‖Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.ivPolyhedron ι X.vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → Xiι‖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`.rℝ) ∧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`.∀ (iι: ιType), ‖Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.ivPolyhedron ι X.vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → Xiι‖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`.rℝ
Immediate from definition.
Pointsymmetrization preserves radius.
Because the reflection of a point about the origin preserves its norm.