Rupert Counterexample

6. The Local Theorem🔗

Lemma6.1
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

For any P \in \mathbb{R}^3 one has \|M(\theta, \phi) P\|^2=\|P\|^2-\langle X(\theta,\varphi),P\rangle^2.

Lean code for Lemma6.11 theorem
  • complete
    theorem Local.pythagorasLocal.pythagoras {θ φ : ℝ} (P : Euc(3)) : ‖(rotM θ φ) P‖ ^ 2 = ‖P‖ ^ 2 - inner ℝ (vecX θ φ) P ^ 2[SY25] Lemma 21  {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (PEuc(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. ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 =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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 -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). innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ φ) PEuc(3) ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2
    theorem Local.pythagorasLocal.pythagoras {θ φ : ℝ} (P : Euc(3)) : ‖(rotM θ φ) P‖ ^ 2 = ‖P‖ ^ 2 - inner ℝ (vecX θ φ) P ^ 2[SY25] Lemma 21  {θ φ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (PEuc(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. ) :
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 =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`.
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2 -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). innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ φ) PEuc(3) ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. 2
    [SY25] Lemma 21 
Proof

See polyhedron.without.rupert, Lemma 21.

Definition6.2
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Given v_1, \dots, v_n \in \R^n write \mathrm{span}^+(v_1,\dots,v_n) for the set (simplicial cone) in \R^n defined by

\mathrm{span}^+(v_1,\dots,v_n) = \Big\{ w \in \R^n \colon \exists \lambda_1,\dots,\lambda_n > 0 \text{ s.t. } w = \sum_{i=1}^n \lambda_i v_i \Big\}, $$

which is the natural restriction of \mathrm{span}(v_1,\dots,v_n) to positive weights.

Lean code for Definition6.21 definition
  • complete
    def Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  {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.
    } (vFin n → Euc(n) : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n  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. ) : 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. 
    def Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  {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.
    } (vFin n → Euc(n) : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     n  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. ) :
      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. 
    The positive cone of a finite collection of vectors 
Lemma6.3
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let V_1,V_2,V_3,Y,Z \in \mathbb{R}^3 with \|Y \|=\| Z \| and Y,Z \in \mathrm{span}^+(V_1,V_2,V_3). Then at least one of the following inequalities fails:

  • \langle V_1, Y \rangle > \langle V_1, Z \rangle

  • \langle V_2, Y \rangle > \langle V_2, Z \rangle

  • \langle V_3, Y \rangle > \langle V_3, Z \rangle

Lean code for Lemma6.31 theorem
  • complete
    theorem Local.langlesLocal.langles {Y Z : Euc(3)} {V : Local.Vec3} (hYZ : ‖Y‖ = ‖Z‖) (hY : Y ∈ Local.Spanp V) (hZ : Z ∈ Local.Spanp V) :
      inner ℝ (V 0) Y ≤ inner ℝ (V 0) Z ∨ inner ℝ (V 1) Y ≤ inner ℝ (V 1) Z ∨ inner ℝ (V 2) Y ≤ inner ℝ (V 2) Z[SY25] Lemma 23  {YEuc(3) ZEuc(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. } {VLocal.Vec3 : Local.Vec3Local.Vec3 : TypeThree ℝ³ vectors
    -} (hYZ‖Y‖ = ‖Z‖ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. YEuc(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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. ZEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )
      (hYY ∈ Local.Spanp V : YEuc(3) 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  VLocal.Vec3) (hZZ ∈ Local.Spanp V : ZEuc(3) 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  VLocal.Vec3) :
      innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 0) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 0) ZEuc(3) Or (a b : Prop) : Prop`Or a b`, or `a ∨ b`, is the disjunction of propositions. There are two
    constructors for `Or`, called `Or.inl : a → a ∨ b` and `Or.inr : b → a ∨ b`,
    and you can use `match` or `cases` to destruct an `Or` assumption into the
    two cases.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∨` in identifiers is `or`.
        innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 1) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 1) ZEuc(3) Or (a b : Prop) : Prop`Or a b`, or `a ∨ b`, is the disjunction of propositions. There are two
    constructors for `Or`, called `Or.inl : a → a ∨ b` and `Or.inr : b → a ∨ b`,
    and you can use `match` or `cases` to destruct an `Or` assumption into the
    two cases.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∨` in identifiers is `or`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 2) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 2) ZEuc(3)
    theorem Local.langlesLocal.langles {Y Z : Euc(3)} {V : Local.Vec3} (hYZ : ‖Y‖ = ‖Z‖) (hY : Y ∈ Local.Spanp V) (hZ : Z ∈ Local.Spanp V) :
      inner ℝ (V 0) Y ≤ inner ℝ (V 0) Z ∨ inner ℝ (V 1) Y ≤ inner ℝ (V 1) Z ∨ inner ℝ (V 2) Y ≤ inner ℝ (V 2) Z[SY25] Lemma 23  {YEuc(3) ZEuc(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. }
      {VLocal.Vec3 : Local.Vec3Local.Vec3 : TypeThree ℝ³ vectors
    -} (hYZ‖Y‖ = ‖Z‖ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. YEuc(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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. ZEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )
      (hYY ∈ Local.Spanp V : YEuc(3) 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  VLocal.Vec3)
      (hZZ ∈ Local.Spanp V : ZEuc(3) 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  VLocal.Vec3) :
      innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 0) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 0) ZEuc(3) Or (a b : Prop) : Prop`Or a b`, or `a ∨ b`, is the disjunction of propositions. There are two
    constructors for `Or`, called `Or.inl : a → a ∨ b` and `Or.inr : b → a ∨ b`,
    and you can use `match` or `cases` to destruct an `Or` assumption into the
    two cases.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∨` in identifiers is `or`.
        innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 1) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 1) ZEuc(3) Or (a b : Prop) : Prop`Or a b`, or `a ∨ b`, is the disjunction of propositions. There are two
    constructors for `Or`, called `Or.inl : a → a ∨ b` and `Or.inr : b → a ∨ b`,
    and you can use `match` or `cases` to destruct an `Or` assumption into the
    two cases.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `∨` in identifiers is `or`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 2) YEuc(3) 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (VLocal.Vec3 2) ZEuc(3)
    [SY25] Lemma 23 
Proof

See polyhedron.without.rupert, Lemma 23.

Lemma6.4
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

For A,\overline{A},B,\overline{B}\in \mathbb{R}^{n\times n} and P_1,P_2\in \mathbb{R}^n it holds that

|\langle AP_1,BP_2\rangle-\langle \overline{A}P_1,\overline{B}P_2\rangle| \leq \|P_1\|\,\|P_2\|\,\big( \|A-\overline{A}\|\,\|\overline{B}\| + \|\overline{A}\|\,\|B-\overline{B}\|+\|A-\overline{A}\|\,\|B-\overline{B}\|\big).

Lean code for Lemma6.41 theorem
  • complete
    theorem Local.abs_sub_inner_bars_leLocal.abs_sub_inner_bars_le {m n : ℕ} (A B A_ B_ : Euc(m) →L[ℝ] Euc(n)) (P₁ P₂ : Euc(m)) :
      |inner ℝ (A P₁) (B P₂) - inner ℝ (A_ P₁) (B_ P₂)| ≤
        ‖P₁‖ * ‖P₂‖ * (‖A - A_‖ * ‖B_‖ + ‖A_‖ * ‖B - B_‖ + ‖A - A_‖ * ‖B - B_‖)[SY25] Lemma 24  {m 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.
    } (AEuc(m) →L[ℝ] Euc(n) BEuc(m) →L[ℝ] Euc(n) A_Euc(m) →L[ℝ] Euc(n) B_Euc(m) →L[ℝ] Euc(n) : 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. m)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.  →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  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. )
      (P₁Euc(m) P₂Euc(m) : 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. m)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. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (AEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (BEuc(m) →L[ℝ] Euc(n) P₂Euc(m)) -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). innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (A_Euc(m) →L[ℝ] Euc(n) P₁Euc(m)) (B_Euc(m) →L[ℝ] Euc(n) P₂Euc(m))|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`.
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₁Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₂Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`.
          (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n) -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). B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n) -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). B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    theorem Local.abs_sub_inner_bars_leLocal.abs_sub_inner_bars_le {m n : ℕ} (A B A_ B_ : Euc(m) →L[ℝ] Euc(n)) (P₁ P₂ : Euc(m)) :
      |inner ℝ (A P₁) (B P₂) - inner ℝ (A_ P₁) (B_ P₂)| ≤
        ‖P₁‖ * ‖P₂‖ * (‖A - A_‖ * ‖B_‖ + ‖A_‖ * ‖B - B_‖ + ‖A - A_‖ * ‖B - B_‖)[SY25] Lemma 24  {m 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.
    }
      (AEuc(m) →L[ℝ] Euc(n) BEuc(m) →L[ℝ] Euc(n) A_Euc(m) →L[ℝ] Euc(n) B_Euc(m) →L[ℝ] Euc(n) : 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. m)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.  →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  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. )
      (P₁Euc(m) P₂Euc(m) : 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. m)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. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (AEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (BEuc(m) →L[ℝ] Euc(n) P₂Euc(m)) -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).
            innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (A_Euc(m) →L[ℝ] Euc(n) P₁Euc(m)) (B_Euc(m) →L[ℝ] Euc(n) P₂Euc(m))|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`.
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₁Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₂Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`.
          (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n) -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). B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`.
            Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). A_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n) -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). B_Euc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    [SY25] Lemma 24 
Proof

See polyhedron.without.rupert, Lemma 24.

Lemma6.5
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

For A,B\in \mathbb{R}^{n\times n} and P_1,P_2\in \mathbb{R}^n one has

|\langle AP_1,AP_2\rangle-\langle BP_1,BP_2\rangle| \leq \|P_1\|\,\|P_2\|\,\|A-B\|\,(\|A\|+\|B\| + \|A-B\|).

Lean code for Lemma6.51 theorem
  • complete
    theorem Local.abs_sub_inner_leLocal.abs_sub_inner_le {m n : ℕ} (A B : Euc(m) →L[ℝ] Euc(n)) (P₁ P₂ : Euc(m)) :
      |inner ℝ (A P₁) (A P₂) - inner ℝ (B P₁) (B P₂)| ≤ ‖P₁‖ * ‖P₂‖ * ‖A - B‖ * (‖A‖ + ‖B‖ + ‖A - B‖)[SY25] Lemma 25  {m 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.
    } (AEuc(m) →L[ℝ] Euc(n) BEuc(m) →L[ℝ] Euc(n) : 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. m)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.  →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  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. )
      (P₁Euc(m) P₂Euc(m) : 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. m)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. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (AEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (AEuc(m) →L[ℝ] Euc(n) P₂Euc(m)) -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). innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (BEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (BEuc(m) →L[ℝ] Euc(n) P₂Euc(m))|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`.
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₁Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₂Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    theorem Local.abs_sub_inner_leLocal.abs_sub_inner_le {m n : ℕ} (A B : Euc(m) →L[ℝ] Euc(n)) (P₁ P₂ : Euc(m)) :
      |inner ℝ (A P₁) (A P₂) - inner ℝ (B P₁) (B P₂)| ≤ ‖P₁‖ * ‖P₂‖ * ‖A - B‖ * (‖A‖ + ‖B‖ + ‖A - B‖)[SY25] Lemma 25  {m 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.
    }
      (AEuc(m) →L[ℝ] Euc(n) BEuc(m) →L[ℝ] Euc(n) : 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. m)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.  →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  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. )
      (P₁Euc(m) P₂Euc(m) : 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. m)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. ) :
      |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (AEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (AEuc(m) →L[ℝ] Euc(n) P₂Euc(m)) -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).
            innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (BEuc(m) →L[ℝ] Euc(n) P₁Euc(m)) (BEuc(m) →L[ℝ] Euc(n) P₂Euc(m))|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`.
        Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₁Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. P₂Euc(m)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`.
          (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. AEuc(m) →L[ℝ] Euc(n) -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). BEuc(m) →L[ℝ] Euc(n)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    [SY25] Lemma 25 
Proof

See polyhedron.without.rupert, Lemma 25.

Lemma6.6
Group: Linear-algebra lemmas for local geometry. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let A,B,C\in \mathbb{R}^2 be such that \langle R(\pi/2) A,B\rangle, \langle R(\pi/2) B,C\rangle, \langle R(\pi/2) C,A\rangle > 0. Then the origin lies strictly in triangle ABC.

Lean code for Lemma6.61 theorem
  • complete
    theorem Local.origin_in_triangleLocal.origin_in_triangle {A B C : Euc(2)} (hA : 0 < inner ℝ ((rotR (Real.pi / 2)) A) B)
      (hB : 0 < inner ℝ ((rotR (Real.pi / 2)) B) C) (hC : 0 < inner ℝ ((rotR (Real.pi / 2)) C) A) :
      ∃ a b c, 0 < a ∧ 0 < b ∧ 0 < c ∧ a • A + b • B + c • C = 0[SY25] Lemma 26  {AEuc(2) BEuc(2) CEuc(2) : 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. 2)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. }
      (hA0 < inner ℝ ((rotR (Real.pi / 2)) A) B : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) AEuc(2)) BEuc(2))
      (hB0 < inner ℝ ((rotR (Real.pi / 2)) B) C : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) BEuc(2)) CEuc(2))
      (hC0 < inner ℝ ((rotR (Real.pi / 2)) C) A : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) CEuc(2)) AEuc(2)) :
       a b c, 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. a 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`. 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. b 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`. 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. c 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`. a HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. AEuc(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`. b HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. BEuc(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`. c HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. CEuc(2) =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`. 0
    theorem Local.origin_in_triangleLocal.origin_in_triangle {A B C : Euc(2)} (hA : 0 < inner ℝ ((rotR (Real.pi / 2)) A) B)
      (hB : 0 < inner ℝ ((rotR (Real.pi / 2)) B) C) (hC : 0 < inner ℝ ((rotR (Real.pi / 2)) C) A) :
      ∃ a b c, 0 < a ∧ 0 < b ∧ 0 < c ∧ a • A + b • B + c • C = 0[SY25] Lemma 26  {AEuc(2) BEuc(2) CEuc(2) : 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. 2)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. }
      (hA0 < inner ℝ ((rotR (Real.pi / 2)) A) B :
        0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) AEuc(2)) BEuc(2))
      (hB0 < inner ℝ ((rotR (Real.pi / 2)) B) C :
        0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) BEuc(2)) CEuc(2))
      (hC0 < inner ℝ ((rotR (Real.pi / 2)) C) A :
        0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) CEuc(2))
            AEuc(2)) :
       a b c,
        0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. a 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`.
          0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. b 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`.
            0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. c 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`. a HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. AEuc(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`. b HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. BEuc(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`. c HSMul.hSMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSMul α β γ] : α → β → γ`a • b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent, but it is intended to be used for left actions. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `•` in identifiers is `smul`. CEuc(2) =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`. 0
    [SY25] Lemma 26 
Proof

See polyhedron.without.rupert, Lemma 26.

Definition6.7
groupL∃∀Nused by 1

Let \theta, \varphi \in \mathbb{R}, \varepsilon > 0, and set M := M(\theta, \varphi). Three points P_1, P_2, P_3 \in \mathbb{R}^3 with \|P_1\|, \|P_2\|, \|P_3\| \leq 1 are called \varepsilon-spanning for (\theta, \varphi) if:

  • \langle R(\pi/2) M P_1,M P_{2}\rangle > 2 \epsilon(\sqrt{2} + \varepsilon)

  • \langle R(\pi/2) M P_2,M P_{3}\rangle > 2 \epsilon(\sqrt{2} + \varepsilon)

  • \langle R(\pi/2) M P_3,M P_{1}\rangle > 2 \epsilon(\sqrt{2} + \varepsilon)

Lean code for Definition6.71 definition
  • structure(2 fields)defined in Noperthedron/Local/EpsSpanning.lean
    complete
    structure Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  (PLocal.Triangle : Local.TriangleLocal.Triangle : Type) (θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    structure Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps. 
      (PLocal.Triangle : Local.TriangleLocal.Triangle : Type) (θ φ ε : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    [SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps. 

    Fields

    pos0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε
    lt∀ (i : Fin 3), 2 * ε * (√2 + ε) < inner ℝ ((rotR (Real.pi / 2)) ((rotM θ φ) (P i))) ((rotM θ φ) (P (i + 1))) :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), 2 *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`. ε *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`. (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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 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`. <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) (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`.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`. 2)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`.) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) (PLocal.Triangle iFin 3))) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ) (PLocal.Triangle (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`.iFin 3 +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`. 1)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`.))
Lemma6.8
groupL∃∀N
Used by 2
Hover a use site to preview it.
Preview
Theorem 6.14
Loading preview
Hover a use site to preview it.

Using Definition 6.7 and Definition 6.2.

Let P_1, P_2, P_3 \in \mathbb{R}^3 with \|P_1\|,\|P_2\|,\|P_3\| \leq 1 be \epsilon-spanning for (\bar\theta, \bar\phi) and let \theta, \phi \in \mathbb{R} satisfy |\theta - \bar{\theta}|, |\phi - \bar{\phi}| \leq \epsilon. If \langle X(\theta, \phi), P_i \rangle > 0 for i=1,2,3, then X(\theta, \phi) \in \spanp(P_1, P_2, P_3).

Lean code for Lemma6.81 theorem
  • complete
    theorem Local.vecX_spanningLocal.vecX_spanning {ε θ θ_ φ φ_ : ℝ} (P : Local.Triangle) (hθ : |θ - θ_| ≤ ε) (hφ : |φ - φ_| ≤ ε)
      (hSpanning : P.Spanning θ_ φ_ ε) (hP : ∀ (i : Fin 3), ‖P i‖ ≤ 1) (hX : ∀ (i : Fin 3), 0 < inner ℝ (vecX θ φ) (P i)) :
      vecX θ φ ∈ Local.Spanp P[SY25] Lemma 28  {ε θ θ_ φ φ_ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (PLocal.Triangle : Local.TriangleLocal.Triangle : Type)
      (|θ - θ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ -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). θ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) (|φ - φ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ -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). φ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hSpanningP.Spanning θ_ φ_ ε : PLocal.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  θ_ φ_ ε) (hP∀ (i : Fin 3), ‖P i‖ ≤ 1 :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PLocal.Triangle iFin 3Norm.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)
      (hX∀ (i : Fin 3), 0 < inner ℝ (vecX θ φ) (P i) :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ φ) (PLocal.Triangle iFin 3)) :
      vecXvecX (θ φ : ℝ) : Euc(3) θ φ 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  PLocal.Triangle
    theorem Local.vecX_spanningLocal.vecX_spanning {ε θ θ_ φ φ_ : ℝ} (P : Local.Triangle) (hθ : |θ - θ_| ≤ ε) (hφ : |φ - φ_| ≤ ε)
      (hSpanning : P.Spanning θ_ φ_ ε) (hP : ∀ (i : Fin 3), ‖P i‖ ≤ 1) (hX : ∀ (i : Fin 3), 0 < inner ℝ (vecX θ φ) (P i)) :
      vecX θ φ ∈ Local.Spanp P[SY25] Lemma 28  {ε θ θ_ φ φ_ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (PLocal.Triangle : Local.TriangleLocal.Triangle : Type) (|θ - θ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ -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). θ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (|φ - φ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ -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). φ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hSpanningP.Spanning θ_ φ_ ε : PLocal.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  θ_ φ_ ε)
      (hP∀ (i : Fin 3), ‖P i‖ ≤ 1 :  (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3), Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PLocal.Triangle iFin 3Norm.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)
      (hX∀ (i : Fin 3), 0 < inner ℝ (vecX θ φ) (P i) :
         (iFin 3 : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3),
          0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (vecXvecX (θ φ : ℝ) : Euc(3) θ φ) (PLocal.Triangle iFin 3)) :
      vecXvecX (θ φ : ℝ) : Euc(3) θ φ 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`. Local.SpanpLocal.Spanp {n : ℕ} (v : Fin n → Euc(n)) : Set Euc(n)The positive cone of a finite collection of vectors  PLocal.Triangle
    [SY25] Lemma 28 
Proof

Using Lemma 6.4, Lemma 6.6, and Lemma 3.11. See polyhedron.without.rupert, Lemma 28.

Lemma6.9
Group: Distance and local-maximality sector estimates. (3)
Hover another entry in this group to preview it.
Preview
Definition 6.10
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Let P, Q \in \mathbb{R}^3 with \|P\|, \|Q\| \leq 1, and let \epsilon>0, \bar\theta_1,\bar\phi_1,\bar\theta_2,\bar\phi_2,\bar\alpha \in \mathbb{R}. Set

T := \left(R(\bar\alpha) M(\bar\theta_1, \bar\phi_1) P + M(\bar\theta_2, \bar\phi_2) Q\right)/2 \in \mathbb{R}^2,

and assume \delta \geq \|T - M(\bar\theta_2, \bar\phi_2) Q\|. If |\bar\theta_1-\theta_1|, |\bar\phi_1-\phi_1|, |\bar\theta_2-\theta_2|, |\bar\phi_2-\phi_2|, |\bar\alpha - \alpha| \leq \epsilon, then R(\alpha)M(\theta_1, \phi_1) P and M(\theta_2, \phi_2) Q lie in \mathrm{Circ}_{\delta + \sqrt{5} \epsilon}(T).

Lean code for Lemma6.91 theorem
  • theoremdefined in Noperthedron/Local.lean
    complete
    theorem Local.inCircLocal.inCirc {δ ε θ₁ θ₁_ θ₂ θ₂_ φ₁ φ₁_ φ₂ φ₂_ α α_ : ℝ} {P Q : Euc(3)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (hε : 0 < ε)
      (hθ₁ : |θ₁ - θ₁_| ≤ ε) (hφ₁ : |φ₁ - φ₁_| ≤ ε) (hθ₂ : |θ₂ - θ₂_| ≤ ε) (hφ₂ : |φ₂ - φ₂_| ≤ ε) (hα : |α - α_| ≤ ε) :
      have T := midpoint ℝ ((rotR α_) ((rotM θ₁_ φ₁_) P)) ((rotM θ₂_ φ₂_) Q);
      ‖T - (rotM θ₂_ φ₂_) Q‖ ≤ δ →
        (rotR α) ((rotM θ₁ φ₁) P) ∈ Metric.ball T (√5 * ε + δ) ∧ (rotM θ₂ φ₂) Q ∈ Metric.ball T (√5 * ε + δ)[SY25] Lemma 30  {δ ε θ₁ θ₁_ θ₂ θ₂_ φ₁ φ₁_ φ₂ φ₂_ α α_ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } {PEuc(3) QEuc(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. }
      (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)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) (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)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) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε) (hθ₁|θ₁ - θ₁_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ₁ -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). θ₁_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hφ₁|φ₁ - φ₁_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ₁ -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). φ₁_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) (hθ₂|θ₂ - θ₂_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ₂ -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). θ₂_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) (hφ₂|φ₂ - φ₂_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ₂ -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). φ₂_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (|α - α_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` α -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). α_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) :
      have TEuc(2) :=
        midpointmidpoint.{u_1, u_2, u_4} (R : Type u_1) {V : Type u_2} {P : Type u_4} [Ring R] [Invertible 2] [AddCommGroup V]
      [Module R V] [AddTorsor V P] (x y : P) : P`midpoint x y` is the midpoint of the segment `[x, y]`.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α_) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₁_ φ₁_) PEuc(3))) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂_ φ₂_) QEuc(3));
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. TEuc(2) -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). (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂_ φ₂_) QEuc(3)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`. δ 
        (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₁ φ₁) PEuc(3)) 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`. Metric.ballMetric.ball.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`ball x ε` is the set of all points `y` with `dist y x < ε`  TEuc(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`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 5 *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`. ε +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`. 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`.
          (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂ φ₂) QEuc(3) 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`. Metric.ballMetric.ball.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`ball x ε` is the set of all points `y` with `dist y x < ε`  TEuc(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`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 5 *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`. ε +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`.
    theorem Local.inCircLocal.inCirc {δ ε θ₁ θ₁_ θ₂ θ₂_ φ₁ φ₁_ φ₂ φ₂_ α α_ : ℝ} {P Q : Euc(3)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (hε : 0 < ε)
      (hθ₁ : |θ₁ - θ₁_| ≤ ε) (hφ₁ : |φ₁ - φ₁_| ≤ ε) (hθ₂ : |θ₂ - θ₂_| ≤ ε) (hφ₂ : |φ₂ - φ₂_| ≤ ε) (hα : |α - α_| ≤ ε) :
      have T := midpoint ℝ ((rotR α_) ((rotM θ₁_ φ₁_) P)) ((rotM θ₂_ φ₂_) Q);
      ‖T - (rotM θ₂_ φ₂_) Q‖ ≤ δ →
        (rotR α) ((rotM θ₁ φ₁) P) ∈ Metric.ball T (√5 * ε + δ) ∧ (rotM θ₂ φ₂) Q ∈ Metric.ball T (√5 * ε + δ)[SY25] Lemma 30 
      {δ ε θ₁ θ₁_ θ₂ θ₂_ φ₁ φ₁_ φ₂ φ₂_ α α_ :
        Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      {PEuc(3) QEuc(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. } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)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)
      (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)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) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (hθ₁|θ₁ - θ₁_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ₁ -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). θ₁_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hφ₁|φ₁ - φ₁_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ₁ -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). φ₁_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hθ₂|θ₂ - θ₂_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ₂ -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). θ₂_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (hφ₂|φ₂ - φ₂_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ₂ -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). φ₂_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (|α - α_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` α -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). α_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) :
      have TEuc(2) :=
        midpointmidpoint.{u_1, u_2, u_4} (R : Type u_1) {V : Type u_2} {P : Type u_4} [Ring R] [Invertible 2] [AddCommGroup V]
      [Module R V] [AddTorsor V P] (x y : P) : P`midpoint x y` is the midpoint of the segment `[x, y]`.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. 
          ((rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α_) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₁_ φ₁_) PEuc(3)))
          ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂_ φ₂_) QEuc(3));
      Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. TEuc(2) -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). (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂_ φ₂_) QEuc(3)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`. δ 
        (rotRrotR : AddChar ℝ (Euc(2) →L[ℝ] Euc(2)) α) ((rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₁ φ₁) PEuc(3)) 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`.
            Metric.ballMetric.ball.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`ball x ε` is the set of all points `y` with `dist y x < ε`  TEuc(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`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 5 *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`. ε +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`. 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`.
          (rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ₂ φ₂) QEuc(3) 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`.
            Metric.ballMetric.ball.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`ball x ε` is the set of all points `y` with `dist y x < ε`  TEuc(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`.Real.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 5 *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`. ε +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`.
    [SY25] Lemma 30 
Proof

Using Lemma 3.11 and Lemma 3.17. See polyhedron.without.rupert, Lemma 30.

Definition6.10
Group: Distance and local-maximality sector estimates. (3)
Hover another entry in this group to preview it.
Preview
Lemma 6.9
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Let \PP \subset \R^2 be a convex polygon and Q \in \PP one of its vertices. Assume that for some \overline{Q} \in \R^2 it holds that Q \in \Circ_{\delta}(\overline{Q}), i.e. \|Q - \overline{Q}\| < \delta. Define \Sect_\delta(\overline{Q}) \coloneqq \Circ_{\delta}(\overline{Q}) \cap \PP^\circ as the intersection between \Circ_{\delta}(\overline{Q}) and the interior of the convex hull of \PP.

Moreover, Q \in \PP is called \delta-locally maximally distant with respect to \overline{Q} (\delta-LMD(\overline{Q})) if for all A \in \Sect_\delta(\overline{Q}) it holds that \|Q\| > \|A\|.

Lean code for Definition6.101 definition
  • def Local.LocallyMaximallyDistantLocal.LocallyMaximallyDistant (δ : ℝ) (Q Q_ : Euc(2)) (P : Finset Euc(2)) : Prop[SY25] Definition 31
    "Q is δ-locally maximally distant with respect to Q_" or "Q is δ-LMD(Q_)".
     (δ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (QEuc(2) Q_Euc(2) : 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. 2)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. )
      (PFinset Euc(2) : 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. 2)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 Local.LocallyMaximallyDistantLocal.LocallyMaximallyDistant (δ : ℝ) (Q Q_ : Euc(2)) (P : Finset Euc(2)) : Prop[SY25] Definition 31
    "Q is δ-locally maximally distant with respect to Q_" or "Q is δ-LMD(Q_)".
     (δ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. )
      (QEuc(2) Q_Euc(2) : 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. 2)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. ) (PFinset Euc(2) : 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. 2)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`. 
    [SY25] Definition 31
    "Q is δ-locally maximally distant with respect to Q_" or "Q is δ-LMD(Q_)".
    
Lemma6.11
Group: Distance and local-maximality sector estimates. (3)
Hover another entry in this group to preview it.
Preview
Lemma 6.9
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Using Definition 6.10.

Let \mathbf{P} be a convex polygon and Q \in \mathbf{P} a vertex. Let \overline{Q} \in \mathbb{R}^2 with \|Q - \overline{Q}\| < \delta for some \delta>0. Assume there exists r > 0 with \|Q\| > r such that

\frac{\langle Q, Q - P_j \rangle}{\|Q\|\|Q - P_j\|} \geq \delta/r

for all other vertices P_j \in \mathbf{P} \setminus Q. Then Q is \delta-locally maximally distant with respect to \overline{Q}.

Lean code for Lemma6.111 theorem
  • theorem Local.inner_ge_implies_LMDLocal.inner_ge_implies_LMD {P : Finset Euc(2)} {Q Q_ : Euc(2)} {δ r : ℝ} (hQ : Q ∈ P) (hQ_ : ‖Q - Q_‖ < δ) (hr : 0 < r)
      (hrQ : r < ‖Q‖) (hle : ∀ Pᵢ ∈ P, Pᵢ ≠ Q → δ / r ≤ inner ℝ Q (Q - Pᵢ) / (‖Q‖ * ‖Q - Pᵢ‖)) :
      Local.LocallyMaximallyDistant δ Q Q_ P[SY25] Lemma 32
     {PFinset Euc(2) : 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. 2)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. } {QEuc(2) Q_Euc(2) : 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. 2)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. } {δ r : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      (hQQ ∈ P : QEuc(2) 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`. PFinset Euc(2)) (hQ_‖Q - Q_‖ < δ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2) -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). Q_Euc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. δ) (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r) (hrQr < ‖Q‖ : r <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )
      (hle∀ Pᵢ ∈ P, Pᵢ ≠ Q → δ / r ≤ inner ℝ Q (Q - Pᵢ) / (‖Q‖ * ‖Q - Pᵢ‖) :
         PᵢEuc(2)  PFinset Euc(2), PᵢEuc(2) Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`,
    and asserts that `a` and `b` are not equal.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≠` in identifiers is `ne`. QEuc(2)  δ /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`. r 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`. innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  QEuc(2) (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).QEuc(2) -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). PᵢEuc(2))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). /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`. (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2) -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). PᵢEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.) :
      Local.LocallyMaximallyDistantLocal.LocallyMaximallyDistant (δ : ℝ) (Q Q_ : Euc(2)) (P : Finset Euc(2)) : Prop[SY25] Definition 31
    "Q is δ-locally maximally distant with respect to Q_" or "Q is δ-LMD(Q_)".
     δ QEuc(2) Q_Euc(2) PFinset Euc(2)
    theorem Local.inner_ge_implies_LMDLocal.inner_ge_implies_LMD {P : Finset Euc(2)} {Q Q_ : Euc(2)} {δ r : ℝ} (hQ : Q ∈ P) (hQ_ : ‖Q - Q_‖ < δ) (hr : 0 < r)
      (hrQ : r < ‖Q‖) (hle : ∀ Pᵢ ∈ P, Pᵢ ≠ Q → δ / r ≤ inner ℝ Q (Q - Pᵢ) / (‖Q‖ * ‖Q - Pᵢ‖)) :
      Local.LocallyMaximallyDistant δ Q Q_ P[SY25] Lemma 32
    
      {PFinset Euc(2) : 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. 2)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. } {QEuc(2) Q_Euc(2) : 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. 2)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. }
      {δ r : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } (hQQ ∈ P : QEuc(2) 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`. PFinset Euc(2))
      (hQ_‖Q - Q_‖ < δ : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2) -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). Q_Euc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. δ) (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r)
      (hrQr < ‖Q‖ : r <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )
      (hle∀ Pᵢ ∈ P, Pᵢ ≠ Q → δ / r ≤ inner ℝ Q (Q - Pᵢ) / (‖Q‖ * ‖Q - Pᵢ‖) :
         PᵢEuc(2)  PFinset Euc(2),
          PᵢEuc(2) Ne.{u} {α : Sort u} (a b : α) : Prop`a ≠ b`, or `Ne a b` is defined as `¬ (a = b)` or `a = b → False`,
    and asserts that `a` and `b` are not equal.
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≠` in identifiers is `ne`. QEuc(2) 
            δ /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`. r 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`.
              innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  QEuc(2) (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).QEuc(2) -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). PᵢEuc(2))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). /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`.
                (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(2) -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). PᵢEuc(2)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.) :
      Local.LocallyMaximallyDistantLocal.LocallyMaximallyDistant (δ : ℝ) (Q Q_ : Euc(2)) (P : Finset Euc(2)) : Prop[SY25] Definition 31
    "Q is δ-locally maximally distant with respect to Q_" or "Q is δ-LMD(Q_)".
     δ QEuc(2) Q_Euc(2) PFinset Euc(2)
    [SY25] Lemma 32
    
Proof

See polyhedron.without.rupert, Lemma 32.

Lemma6.12
Group: Distance and local-maximality sector estimates. (3)
Hover another entry in this group to preview it.
Preview
Lemma 6.9
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 1

Let \epsilon>0 and \theta,\bar\theta, \phi, \bar\phi \in \mathbb{R} with |\theta - \bar{\theta}|, |\phi - \bar{\phi}| \leq \epsilon. Define M = M(\theta, \phi) and \overline{M} = M(\bar\theta, \bar\phi), and let P, Q \in \mathbb{R}^3 with \|P\|, \|Q\| \leq 1. Assume that

\frac{\langle \overline{M} P,\overline{M} (P-Q)\rangle - 2 \epsilon \|P-Q\| \cdot (\sqrt{2}+\varepsilon)}{ \big(\|\overline{M} P\|+\sqrt{2} \varepsilon \big) \cdot \big(\|\overline{M}(P-Q)\|+2 \sqrt{2} \varepsilon\big)} > 0. $$

Then:

\frac{\langle MP,M(P-Q)\rangle}{\|MP\|\,\|M(P-Q)\|} \geq \frac{\langle \overline{M} P,\overline{M} (P-Q)\rangle - 2 \epsilon \|P-Q\| \cdot (\sqrt{2}+\varepsilon)}{ (\|\overline{M} P\|+\sqrt{2} \varepsilon ) \cdot (\|\overline{M}(P-Q)\|+2 \sqrt{2} \varepsilon)}.

Lean code for Lemma6.121 theorem
  • theoremdefined in Noperthedron/Local/Coss.lean
    complete
    theorem Local.cossLocal.coss {ε θ θ_ φ φ_ : ℝ} {P Q : Euc(3)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (hε : 0 < ε) (hθ : |θ - θ_| ≤ ε)
      (hφ : |φ - φ_| ≤ ε) :
      have M := rotM θ φ;
      have M_ := rotM θ_ φ_;
      0 < (inner ℝ (M_ P) (M_ (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) / ((‖M_ P‖ + √2 * ε) * (‖M_ (P - Q)‖ + 2 * √2 * ε)) →
        (inner ℝ (M_ P) (M_ (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) / ((‖M_ P‖ + √2 * ε) * (‖M_ (P - Q)‖ + 2 * √2 * ε)) ≤
          inner ℝ (M P) (M (P - Q)) / (‖M P‖ * ‖M (P - Q)‖)[SY25] Lemma 33  {ε θ θ_ φ φ_ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. } {PEuc(3) QEuc(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. } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)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)
      (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)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) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε) (|θ - θ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ -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). θ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) (|φ - φ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ -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). φ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) :
      have MEuc(3) →L[ℝ] Euc(2) := rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ;
      have M_Euc(3) →L[ℝ] Euc(2) := rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_ φ_;
      0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
          (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).innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (M_Euc(3) →L[ℝ] Euc(2) PEuc(3)) (M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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). 2 *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`. ε *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -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). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. (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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 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`.)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). /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`.
            (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`.(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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`. *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`. (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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 *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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`.)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`. 
        (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).innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (M_Euc(3) →L[ℝ] Euc(2) PEuc(3)) (M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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). 2 *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`. ε *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -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). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. (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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 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`.)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). /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`.
            (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`.(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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`. *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`. (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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 *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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`.)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`. 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`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (MEuc(3) →L[ℝ] Euc(2) PEuc(3)) (MEuc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).) /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`. (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. MEuc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. MEuc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    theorem Local.cossLocal.coss {ε θ θ_ φ φ_ : ℝ} {P Q : Euc(3)} (hP : ‖P‖ ≤ 1) (hQ : ‖Q‖ ≤ 1) (hε : 0 < ε) (hθ : |θ - θ_| ≤ ε)
      (hφ : |φ - φ_| ≤ ε) :
      have M := rotM θ φ;
      have M_ := rotM θ_ φ_;
      0 < (inner ℝ (M_ P) (M_ (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) / ((‖M_ P‖ + √2 * ε) * (‖M_ (P - Q)‖ + 2 * √2 * ε)) →
        (inner ℝ (M_ P) (M_ (P - Q)) - 2 * ε * ‖P - Q‖ * (√2 + ε)) / ((‖M_ P‖ + √2 * ε) * (‖M_ (P - Q)‖ + 2 * √2 * ε)) ≤
          inner ℝ (M P) (M (P - Q)) / (‖M P‖ * ‖M (P - Q)‖)[SY25] Lemma 33  {ε θ θ_ φ φ_ : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. }
      {PEuc(3) QEuc(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. } (hP‖P‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3)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)
      (hQ‖Q‖ ≤ 1 : Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. QEuc(3)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) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (|θ - θ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` θ -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). θ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε)
      (|φ - φ_| ≤ ε : |abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a` φ -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). φ_|abs.{u_1} {α : Type u_1} [Lattice α] [AddGroup α] (a : α) : α`abs a`, denoted `|a|`, is the absolute value of `a`  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`. ε) :
      have MEuc(3) →L[ℝ] Euc(2) := rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ φ;
      have M_Euc(3) →L[ℝ] Euc(2) := rotMrotM (θ φ : ℝ) : Euc(3) →L[ℝ] Euc(2) θ_ φ_;
      0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.
          (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).innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (M_Euc(3) →L[ℝ] Euc(2) PEuc(3)) (M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).
              2 *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`. ε *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -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). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. (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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 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`.)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). /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`.
            (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`.(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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`. *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`.
              (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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 *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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`.)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`. 
        (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).innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (M_Euc(3) →L[ℝ] Euc(2) PEuc(3)) (M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).
              2 *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`. ε *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. PEuc(3) -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). QEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. (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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 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`.)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). /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`.
            (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`.(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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`. *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`.
              (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. M_Euc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  +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 *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.sqrt (x : ℝ) : ℝThe square root of a real number. This returns 0 for negative inputs.
    
    This has notation `√x`. Note that `√x⁻¹` is parsed as `√(x⁻¹)`. 2 *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`. ε)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`.)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`. 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`.
          innerInner.inner.{u_4, u_5} (𝕜 : Type u_4) {E : Type u_5} [self : Inner 𝕜 E] : E → E → 𝕜The inner product function.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (MEuc(3) →L[ℝ] Euc(2) PEuc(3)) (MEuc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).) /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`.
            (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`.Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. MEuc(3) →L[ℝ] Euc(2) PEuc(3)Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function.  *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`. Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. MEuc(3) →L[ℝ] Euc(2) (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).PEuc(3) -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). QEuc(3))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).Norm.norm.{u_8} {E : Type u_8} [self : Norm E] : E → ℝthe `ℝ`-valued norm function. )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`.
    [SY25] Lemma 33 
Proof

Using Lemma 6.5 and Lemma 3.11. See polyhedron.without.rupert, Lemma 33.

Lemma6.13
L∃∀Nused by 1

Let P_1,P_2,P_3, Q_1,Q_2,Q_3 \in \mathbb{R}^3. Define P := (P_1|P_2|P_3) and Q := (Q_1|Q_2|Q_3) and assume Q is invertible. Then P_1, P_2, P_3 and Q_1, Q_2, Q_3 are congruent iff P^t P = Q^t Q.

Lean code for Lemma6.131 theorem
  • complete
    theorem Local.congruent_iff_sym_matrix_eqLocal.congruent_iff_sym_matrix_eq (P Q : Local.Triangle) (hQ : Invertible Q.toMatrix) :
      P.Congruent Q ↔ P.toSymMatrix = Q.toSymMatrix[SY25] Lemma 35
     (PLocal.Triangle QLocal.Triangle : Local.TriangleLocal.Triangle : Type)
      (hQInvertible Q.toMatrix : InvertibleInvertible.{u} {α : Type u} [Mul α] [One α] (a : α) : Type u`Invertible a` gives a two-sided multiplicative inverse of `a`.  QLocal.Triangle.toMatrixLocal.Triangle.toMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 3) ℝ) :
      PLocal.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
     QLocal.Triangle 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 `<->`). PLocal.Triangle.toSymMatrixLocal.Triangle.toSymMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 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`. QLocal.Triangle.toSymMatrixLocal.Triangle.toSymMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 3) ℝ
    theorem Local.congruent_iff_sym_matrix_eqLocal.congruent_iff_sym_matrix_eq (P Q : Local.Triangle) (hQ : Invertible Q.toMatrix) :
      P.Congruent Q ↔ P.toSymMatrix = Q.toSymMatrix[SY25] Lemma 35
    
      (PLocal.Triangle QLocal.Triangle : Local.TriangleLocal.Triangle : Type)
      (hQInvertible Q.toMatrix : InvertibleInvertible.{u} {α : Type u} [Mul α] [One α] (a : α) : Type u`Invertible a` gives a two-sided multiplicative inverse of `a`.  QLocal.Triangle.toMatrixLocal.Triangle.toMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 3) ℝ) :
      PLocal.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
     QLocal.Triangle 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 `<->`).
        PLocal.Triangle.toSymMatrixLocal.Triangle.toSymMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 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`. QLocal.Triangle.toSymMatrixLocal.Triangle.toSymMatrix (P : Local.Triangle) : Matrix (Fin 3) (Fin 3) ℝ
    [SY25] Lemma 35
    
Proof

From polyhedron.without.rupert, Lemma 35. Note that P^t P = Q^t Q is equivalent to saying that \langle P_i,P_j\rangle = \langle Q_i,Q_j\rangle for all 1 \leq i,j \leq 3. Moreover, the condition on invertibility of Q can be dropped, however then the proof becomes somewhat less straightforward.

If P_1, P_2, P_3 and Q_1, Q_2, Q_3 are congruent then \langle P_i,P_j\rangle = \langle LQ_i,LQ_j\rangle = \langle Q_i,Q_j\rangle, thus P^t P = Q^t Q. For the other direction, we claim that L \coloneqq PQ^{-1} is orthonormal and satisfies that P_i = LQ_i for all i=1,2,3. Indeed, L^t L = (PQ^{-1})^t (PQ^{-1}) = (Q^t)^{-1} P^t P Q^{-1} = \mathrm{Id} and it holds that LQ=PQ^{-1}Q=P, thus LQ_i = P_i.

Theorem6.14
L∃∀Nused by 1

Let \PPP be a polyhedron with radius \rho=1 and P_1, P_2, P_3, Q_1, Q_2, Q_3 \in \PPP be not necessarily distinct. Assume that P_1, P_2, P_3 and Q_1, Q_2, Q_3 are congruent.

Let \epsilon>0 and \thetab_1,\phib_1,\thetab_2,\phib_2,\alphab \in \R, then set \Xib \coloneqq X(\thetab_1,\phib_1), \Xiib \coloneqq X(\thetab_2,\phib_2) as well as \Mib \coloneqq M(\thetab_1,\phib_1), \Miib \coloneqq M(\thetab_2,\phib_2). Assume that there exist \sigma_P, \sigma_Q \in \{0,1\} such that

(-1)^{\sigma_P} \langle \Xib,P_i\rangle>\sqrt{2}\varepsilon \quad \text{and} \quad (-1)^{\sigma_Q} \langle \Xiib , Q_i\rangle>\sqrt{2}\varepsilon, $$

for all i=1,2,3. Moreover, assume that P_1,P_2,P_3 are \epsilon-spanning for (\thetab_1,\phib_1) and that Q_1,Q_2,Q_3 are \epsilon-spanning for (\thetab_2,\phib_2). Finally, assume that for all i = 1,2,3 and any Q_j \in \PPP \setminus Q_i it holds that

\frac{\langle \Miib Q_i,\Miib (Q_i-Q_j)\rangle - 2 \epsilon \|Q_i-Q_j\| \cdot (\sqrt{2}+\varepsilon)}{ \big(\|\Miib Q_i\|+\sqrt{2} \varepsilon \big) \cdot \big(\|\Miib(Q_i-Q_j)\|+2 \sqrt{2} \varepsilon\big)} > \frac{\sqrt{5} \epsilon + \delta}{r}, $$

for some r >0 such that \min_{i=1,2,3}\| \Miib Q_i \| > r + \sqrt{2} \epsilon and for some \delta \in \R with

\delta \geq \max_{i=1,2,3}\left\|R(\alphab) \Mib P_i - \Miib Q_i\right\|/2. $$

Then there exists no solution to Rupert's problem R(\alpha) M(\theta_1,\phi_1)\PPP \subset M(\theta_2,\phi_2)\PPP^\circ with

(\theta_1, \phi_1, \theta_2, \phi_2, \alpha) \in [\thetab_1\pm\epsilon,\phib_1\pm\epsilon,\thetab_2\pm\epsilon,\phib_2\pm\epsilon,\alphab\pm\epsilon] \coloneqq U \subseteq \R^5.

Lean code for Theorem6.141 theorem
  • theoremdefined in Noperthedron/Local.lean
    complete
    theorem Local.local_theoremLocal.local_theorem {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) (Pi Qi : Fin 3 → ι)
      (cong_tri : Local.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi)) (p_ : Pose ℝ) (ε δ r : ℝ)
      (hε : 0 < ε) (hr : 0 < r) (hr₁ : Local.BoundR r ε p_ (poly.vertices.v ∘ Qi))
      (hδ : Local.BoundDelta δ p_ (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi))
      (ae₁ : Local.Triangle.Aε p_.vecX₁ (poly.vertices.v ∘ Pi) ε)
      (ae₂ : Local.Triangle.Aε p_.vecX₂ (poly.vertices.v ∘ Qi) ε)
      (span₁ : Local.Triangle.Spanning (poly.vertices.v ∘ Pi) p_.θ₁ p_.φ₁ ε)
      (span₂ : Local.Triangle.Spanning (poly.vertices.v ∘ Qi) p_.θ₂ p_.φ₂ ε)
      (be : Local.Triangle.Bε (poly.vertices.v ∘ Qi) Qi poly.vertices.v p_ ε δ r) :
      ¬∃ p ∈ Metric.closedBall p_ ε, RupertPose p poly.hull[SY25] Theorem 36
     {ιType : 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] [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]
      (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType) (PiFin 3 → ι QiFin 3 → ι : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  ιType)
      (cong_triLocal.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
     (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`.
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (p_Pose ℝ : PosePose (R : Type) : Type Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (ε δ r : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε) (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r)
      (hr₁Local.BoundR r ε p_ (poly.vertices.v ∘ Qi) : Local.BoundRLocal.BoundR (r ε : ℝ) (p : Pose ℝ) (Q : Local.Triangle) : PropThe condition on r in the Local Theorem  r ε p_Pose ℝ (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (Local.BoundDelta δ p_ (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.BoundDeltaLocal.BoundDelta (δ : ℝ) (p : Pose ℝ) (P Q : Local.Triangle) : PropThe condition on δ in the Local Theorem  δ p_Pose ℝ (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`. (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (ae₁Local.Triangle.Aε p_.vecX₁ (poly.vertices.v ∘ Pi) ε : Local.Triangle.AεLocal.Triangle.Aε (X : Euc(3)) (P : Local.Triangle) (ε : ℝ) : PropCondition A_ε from [SY25] Theorem 36
     p_Pose ℝ.vecX₁Pose.vecX₁ (p : Pose ℝ) : Euc(3) (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`. ε)
      (ae₂Local.Triangle.Aε p_.vecX₂ (poly.vertices.v ∘ Qi) ε : Local.Triangle.AεLocal.Triangle.Aε (X : Euc(3)) (P : Local.Triangle) (ε : ℝ) : PropCondition A_ε from [SY25] Theorem 36
     p_Pose ℝ.vecX₂Pose.vecX₂ (p : Pose ℝ) : Euc(3) (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. ε)
      (span₁Local.Triangle.Spanning (poly.vertices.v ∘ Pi) p_.θ₁ p_.φ₁ ε : Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`. p_Pose ℝ.θ₁Pose.θ₁ {R : Type} (self : Pose R) : R p_Pose ℝ.φ₁Pose.φ₁ {R : Type} (self : Pose R) : R ε)
      (span₂Local.Triangle.Spanning (poly.vertices.v ∘ Qi) p_.θ₂ p_.φ₂ ε : Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps.  (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. p_Pose ℝ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R p_Pose ℝ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R ε)
      (beLocal.Triangle.Bε (poly.vertices.v ∘ Qi) Qi poly.vertices.v p_ ε δ r :
        Local.Triangle.BεLocal.Triangle.Bε {ι : Type} (Q : Local.Triangle) (Qi : Fin 3 → ι) (v : ι → Euc(3)) (p : Pose ℝ) (ε δ r : ℝ) : PropCondition B_ε from [SY25] Theorem 36
     (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. QiFin 3 → ι polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X p_Pose ℝ ε δ
          r) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. pPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  p_Pose ℝ ε, 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 ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    theorem Local.local_theoremLocal.local_theorem {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) (Pi Qi : Fin 3 → ι)
      (cong_tri : Local.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi)) (p_ : Pose ℝ) (ε δ r : ℝ)
      (hε : 0 < ε) (hr : 0 < r) (hr₁ : Local.BoundR r ε p_ (poly.vertices.v ∘ Qi))
      (hδ : Local.BoundDelta δ p_ (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi))
      (ae₁ : Local.Triangle.Aε p_.vecX₁ (poly.vertices.v ∘ Pi) ε)
      (ae₂ : Local.Triangle.Aε p_.vecX₂ (poly.vertices.v ∘ Qi) ε)
      (span₁ : Local.Triangle.Spanning (poly.vertices.v ∘ Pi) p_.θ₁ p_.φ₁ ε)
      (span₂ : Local.Triangle.Spanning (poly.vertices.v ∘ Qi) p_.θ₂ p_.φ₂ ε)
      (be : Local.Triangle.Bε (poly.vertices.v ∘ Qi) Qi poly.vertices.v p_ ε δ r) :
      ¬∃ p ∈ Metric.closedBall p_ ε, RupertPose p poly.hull[SY25] Theorem 36
     {ιType : 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]
      [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] (polyGoodPoly ι : GoodPolyGoodPoly (ι : Type) [Fintype ι] [Nonempty ι] : Type ιType)
      (PiFin 3 → ι QiFin 3 → ι : FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     3  ιType)
      (cong_triLocal.Triangle.Congruent (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.Triangle.CongruentLocal.Triangle.Congruent (P Q : Local.Triangle) : Prop[SY25] Definition 34.
    We define "congruent" to mean "there exists a linear isometry". Note that this is
    stronger than "there exists an *affine* isometry", which might be the definition
    you usually think of.
    
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`.
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (p_Pose ℝ : PosePose (R : Type) : Type Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (ε δ r : Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers. ) (0 < ε : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. ε)
      (hr0 < r : 0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. r)
      (hr₁Local.BoundR r ε p_ (poly.vertices.v ∘ Qi) :
        Local.BoundRLocal.BoundR (r ε : ℝ) (p : Pose ℝ) (Q : Local.Triangle) : PropThe condition on r in the Local Theorem  r ε p_Pose ℝ
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (Local.BoundDelta δ p_ (poly.vertices.v ∘ Pi) (poly.vertices.v ∘ Qi) :
        Local.BoundDeltaLocal.BoundDelta (δ : ℝ) (p : Pose ℝ) (P Q : Local.Triangle) : PropThe condition on δ in the Local Theorem  δ p_Pose ℝ
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`.
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`.)
      (ae₁Local.Triangle.Aε p_.vecX₁ (poly.vertices.v ∘ Pi) ε :
        Local.Triangle.AεLocal.Triangle.Aε (X : Euc(3)) (P : Local.Triangle) (ε : ℝ) : PropCondition A_ε from [SY25] Theorem 36
     p_Pose ℝ.vecX₁Pose.vecX₁ (p : Pose ℝ) : Euc(3)
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`. ε)
      (ae₂Local.Triangle.Aε p_.vecX₂ (poly.vertices.v ∘ Qi) ε :
        Local.Triangle.AεLocal.Triangle.Aε (X : Euc(3)) (P : Local.Triangle) (ε : ℝ) : PropCondition A_ε from [SY25] Theorem 36
     p_Pose ℝ.vecX₂Pose.vecX₂ (p : Pose ℝ) : Euc(3)
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. ε)
      (span₁Local.Triangle.Spanning (poly.vertices.v ∘ Pi) p_.θ₁ p_.φ₁ ε :
        Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps. 
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. PiFin 3 → ι)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`. p_Pose ℝ.θ₁Pose.θ₁ {R : Type} (self : Pose R) : R p_Pose ℝ.φ₁Pose.φ₁ {R : Type} (self : Pose R) : R
          ε)
      (span₂Local.Triangle.Spanning (poly.vertices.v ∘ Qi) p_.θ₂ p_.φ₂ ε :
        Local.Triangle.SpanningLocal.Triangle.Spanning (P : Local.Triangle) (θ φ ε : ℝ) : Prop[SY25] Definition 27. Note that the "+ 1" at the type Fin 3 wraps. 
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. p_Pose ℝ.θ₂Pose.θ₂ {R : Type} (self : Pose R) : R p_Pose ℝ.φ₂Pose.φ₂ {R : Type} (self : Pose R) : R
          ε)
      (beLocal.Triangle.Bε (poly.vertices.v ∘ Qi) Qi poly.vertices.v p_ ε δ r :
        Local.Triangle.BεLocal.Triangle.Bε {ι : Type} (Q : Local.Triangle) (Qi : Fin 3 → ι) (v : ι → Euc(3)) (p : Pose ℝ) (ε δ r : ℝ) : PropCondition B_ε from [SY25] Theorem 36
    
          (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`.polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X 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`. QiFin 3 → ι)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`. QiFin 3 → ι
          polyGoodPoly ι.verticesGoodPoly.vertices {ι : Type} [Fintype ι] [Nonempty ι] (self : GoodPoly ι) : Polyhedron ι Euc(3).vPolyhedron.v {ι X : Type} (self : Polyhedron ι X) : ι → X p_Pose ℝ ε δ r) :
      ¬Not (a : Prop) : Prop`Not p`, or `¬p`, is the negation of `p`. It is defined to be `p → False`,
    so if your goal is `¬p` you can use `intro h` to turn the goal into
    `h : p ⊢ False`, and if you have `hn : ¬p` and `h : p` then `hn h : False`
    and `(hn h).elim` will prove anything.
    For more information: [Propositional Logic](https://lean-lang.org/theorem_proving_in_lean4/propositions_and_proofs.html#propositional-logic)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `¬` in identifiers is `not`. pPose ℝ  Metric.closedBallMetric.closedBall.{u} {α : Type u} [PseudoMetricSpace α] (x : α) (ε : ℝ) : Set α`closedBall x ε` is the set of all points `y` with `dist y x ≤ ε`  p_Pose ℝ ε,
          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 ℝ polyGoodPoly ι.hullGoodPoly.hull {ι : Type} [Fintype ι] [Nonempty ι] (poly : GoodPoly ι) : Set Euc(3)
    [SY25] Theorem 36
    
Proof

Using Lemma 6.3, Lemma 3.13, Lemma 6.8, Lemma 3.15, Lemma 6.9, Lemma 6.12, Lemma 6.11, and Lemma 6.1. See polyhedron.without.rupert, Theorem 36.