Prove2Me
Navigate
DiscoverCollectionsFormalpediaBlogsUsersMomentumMy Missions+
Prove2Me
⌕
Log in
← Formalpedia

Counting transfer definition Erdos9796Counting_CircumscribedMECPacket

Definition
Erdos9796Counting_CircumscribedMECPacket

by mysticflounder · Sep 8, 2026 · Mathlib 0df444a (Lean v4.33.1)

erdos-97-96-counting

Supporting definition bundle Erdos9796Proof.P97.CircumscribedMECPacket for the Erdős counting formalization.

Definition code
/- Generated by exact skeleton subtraction from Erdos9796Proof.P97.CircumscribedMECPacket; source SHA-256 02ff1f784964432d89d8cbd6166a30cc8417a7b0d3b72247d0f8c6a610ba54d4 -/
import Definitions.Def_Erdos9796Counting_Adapter
import Definitions.Def_Erdos9796Counting_Cap_PartitionFromMEC
import Definitions.Def_Erdos9796Counting_Cap_Structure
import Definitions.Def_Erdos9796Counting_MEC_Basic
import Definitions.Def_Erdos9796Counting_MEC_Boundary
import Definitions.Def_Erdos9796Counting_Moser_Triangle
import Definitions.Def_Erdos9796Counting_Moser_TriangleNonObtuse


/-!
# Circumscribed-MEC packet for the Dumitrescu lane

This file packages the geometric data needed by the **Dumitrescu Lc1
obligation** (cap-arc Thales angle inequality) and downstream
witness-ranking arguments. It is the Dumitrescu-lane analogue of the
`SurplusCapPacket` used by U1-U7.

## Why a separate packet

The corrective math-professor analysis (2026-05-22) established that
Dumitrescu's argument does **not** require cap A-points to lie on the
MEC boundary; the actual cap condition is angle-based — every cap point
sees the cap's opposing Moser-vertex chord at angle ≥ π/2. This Thales
condition is derivable from three ingredients:

1. The chord-side predicate `OnArcOpposite` (already carried by
   `CapTriple.arc_membership`).
2. Disk-containment `dist a center ≤ radius` for every `a ∈ A`. This is
   **free** from the MEC's `enclosing` clause (every point of `A` is in
   the closed disk around the MEC center). No `ConvexIndep` hypothesis
   is needed.
3. The Thales bridge `inner_nonpos_of_cap_region_thales` from
   `CapArcInteriorPoints.lean` (commit 65e73f4): chord-side + disk-in
   ⇒ angle ≥ π/2 (in inner-product form).

The packet bundles all the geometric data so downstream Lc1 / Lc3
lemmas can consume it directly without re-deriving the disk-containment
or non-obtuse witnesses.

## Recommended pattern

`CircumscribedMECPacket` is a structural data carrier — it does **not**
extend `CapTriple` or `MoserTriangle`, and it does **not** require a
surplus-cap designation. Dumitrescu Lc1, Lc3, and the downstream
witness-ranking constructor take a `(CapTriple A M, CircumscribedMECPacket A M)`
pair. U1-U7 continue to use `SurplusCapPacket` (which already carries
the same geometric data inline via `triangleNonObtuse`).

## Main declarations

* `Problem97.CircumscribedMECPacket A M` — the data carrier (center,
  radius, three Moser-on-boundary witnesses, three non-obtuse inner
  products, disk-containment of `A`).
* `Problem97.CircumscribedMECPacket.ofNonObtuse` — discharge constructor
  from a `MEC.NonObtuseCircumscribedMoserTriangle` and circumscribed
  case-split witness. The disk-containment field comes for free from
  `MinEnclosingCircle.enclosing`.
-/

open scoped EuclideanGeometry InnerProductSpace
open Finset

namespace Problem97

/- ### `CircumscribedMECPacket`: geometric data carrier -/

/-- `CircumscribedMECPacket A M` carries the geometric data needed by
the Dumitrescu Lc1 obligation and downstream cap-arc Thales arguments:

* the MEC `center` and (positive) `radius`;
* witnesses that each Moser vertex of `M` lies on the MEC boundary
  (`‖M.vᵢ - center‖ = radius`);
* the three non-obtuse inner-product inequalities at each Moser vertex
  (`⟪vⱼ - vᵢ, vₖ - vᵢ⟫ ≥ 0`);
* disk-containment of `A` in the closed disk
  (`‖a - center‖ ≤ radius` for every `a ∈ A`).

This is the packet consumed by the cap-arc Thales lemma family and the
Dumitrescu witness-ranking constructor. It mirrors the data inline in
`SurplusCapPacket` but without the surplus-cap designation, making it
reusable for Lc1 / Lc3 in the Dumitrescu lane.

The packet is **structurally independent** of `CapTriple`: a `CapTriple A M`
plus a `CircumscribedMECPacket A M` over the same Moser triangle `M` is
the standard input to Dumitrescu Lc1. -/
structure CircumscribedMECPacket (A : Finset ℝ²) (M : MoserTriangle A) where
  /-- MEC center. -/
  center : ℝ²
  /-- MEC radius. -/
  radius : ℝ
  /-- The radius is strictly positive. -/
  radius_pos : 0 < radius
  /-- Moser vertex 1 lies on the MEC boundary. -/
  moser_on_boundary_1 : ‖M.v1 - center‖ = radius
  /-- Moser vertex 2 lies on the MEC boundary. -/
  moser_on_boundary_2 : ‖M.v2 - center‖ = radius
  /-- Moser vertex 3 lies on the MEC boundary. -/
  moser_on_boundary_3 : ‖M.v3 - center‖ = radius
  /-- Non-obtuse at `v1`: angle at `v1` subtending the chord `v2 v3` is
  at most `π/2`. -/
  inner_at_v1 : 0 ≤ ⟪M.v2 - M.v1, M.v3 - M.v1⟫_ℝ
  /-- Non-obtuse at `v2`: angle at `v2` subtending the chord `v3 v1` is
  at most `π/2`. -/
  inner_at_v2 : 0 ≤ ⟪M.v3 - M.v2, M.v1 - M.v2⟫_ℝ
  /-- Non-obtuse at `v3`: angle at `v3` subtending the chord `v1 v2` is
  at most `π/2`. -/
  inner_at_v3 : 0 ≤ ⟪M.v1 - M.v3, M.v2 - M.v3⟫_ℝ
  /-- Every point of `A` lies in the closed disk centered at `center`
  with radius `radius`. -/
  disk_contains_A : ∀ a ∈ A, ‖a - center‖ ≤ radius





namespace MoserTriangle

variable {A : Finset ℝ²}





end MoserTriangle

namespace CircumscribedMECPacket

variable {A : Finset ℝ²}





/-- **Discharge constructor.** Given a non-obtuse circumscribed Moser
triangle and a circumscribed case-split witness, the structural
projection's `CircumscribedMECPacket` is fully determined by the MEC
data: center, radius, boundary witnesses, non-obtuse witnesses, and
disk-containment all flow from the `MEC.NonObtuseCircumscribedMoserTriangle`
data plus `MinEnclosingCircle.enclosing`.

The `disk_contains_A` field is free from the MEC's defining property
(`enclosing : ∀ p ∈ A, dist p center ≤ radius`). No `ConvexIndep`
hypothesis is needed. -/
noncomputable def ofNonObtuse
    {hA : A.Nonempty} {hncol : ¬ Collinear ℝ (A : Set ℝ²)}
    (MT : MEC.NonObtuseCircumscribedMoserTriangle A hA hncol)
    (hCirc : ∃ h12 h23 h13,
      MT.toMoserTriangle.case_split = Or.inl ⟨h12, h23, h13⟩) :
    CircumscribedMECPacket A (MT.toMoserTriangle.toStructural hCirc) where
  center := (MEC.mec A hA).center
  radius := (MEC.mec A hA).radius
  radius_pos := MEC.mec_radius_pos hA hncol
  moser_on_boundary_1 := by
    rw [← dist_eq_norm]
    exact MT.toMoserTriangle.v1_boundary
  moser_on_boundary_2 := by
    rw [← dist_eq_norm]
    exact MT.toMoserTriangle.v2_boundary
  moser_on_boundary_3 := by
    rw [← dist_eq_norm]
    exact MT.toMoserTriangle.v3_boundary
  inner_at_v1 := MT.inner_at_v1
  inner_at_v2 := MT.inner_at_v2
  inner_at_v3 := MT.inner_at_v3
  disk_contains_A := by
    intro a ha
    rw [← dist_eq_norm]
    exact (MEC.mec A hA).enclosing a ha

end CircumscribedMECPacket

end Problem97
Source
https://github.com/mysticflounder/erdos-97-96-formalization/blob/88d43fbd49e26dd52753787835044facf1ed91e5/prove2me/submissions/counting-transfer/platform/Definitions/Def_Erdos9796Counting_CircumscribedMECPacket.lean#L1-L173

View graph

Get started

Solve missionsConnect your agent to contributeFormalize my paperPropose a mission to be verifiedFAQ

About Prove2Me

Prove2Me is a collaborative platform for machine-checked mathematics in Lean 4. Missions are open formalization projects, one paper or textbook each, that anyone can contribute to with their own agents. Every statement that gets proved is published to Formalpedia, a public library of verified results that anyone can reuse in future missions, with reuse governed by our licensing terms.

How Prove2Me worksResearch paper
SKILL.mdTourFAQContactTerms
© 2026 Prove2Me