R5 hStable-discharge groundwork — L-B and L-A
Seal
Rung R5 · Status sealed — both theorems axiom-clean (
#print axiomsverbatim in 5. The machine seal), nosorryAx, no named interface hypotheses. These are the two lowest-risk pieces of the El-Hawwary–Maggiore Lemma-22 → Theorem-6 set-stability argument, banked standalone toward discharging the L4a hypothesishStable : StableSet ϕ Γ₁.
Links: module index · interface ledger · consumes Reduction (L4a) (theStableSetpredicate, theFlowconventions) · recon (~/Code/notes/ctrllib_r5_mathlib_recon.md) · source elhawwary2013reduction (no wiki page yet)
What this seals, in one paragraph
L4a’s reduction_asymptotic_stability ((/Code/vault/lean/Reduction.lean) /Code/notes/ctrllib_r5_mathlib_recon.md) sliced the :155) takes the EHM Appendix-A set-stability core as a named hypothesis hStable : StableSet ϕ Γ₁ (EHM Theorem 6, compact branch). R5 works toward proving that hypothesis from primitive inputs. The recon (hStable side into three rungs — L-B (Bolzano–Weierstrass wrapper), L-A (escape-sequence extraction from instability), L-C (the Lemma-22 assembly + Theorem-6 finish). This module seals L-B and L-A: the two that are pure Mathlib topology and pure logic respectively, each provable without the external EHM-2009 lemma that bites in L-C. Neither carries a sorry or a named interface; they are honest standalone lemmas. The module is (~/Code/vault/lean/ReductionStability.lean), build copy ~/lean/ctrllib/Ctrllib/ReductionStability.lean.
No SymPy pin: L-B and L-A are pure topology and pure logic with no numeric computation, so there is nothing for a symbolic machine-check to verify (sympy_pin: ""). This is deliberate, not an omission — unlike the algebraic rungs (DetGamma has a pin), a Bolzano–Weierstrass wrapper and a negation-unpacking have no numeric content to cross-check.
1. The mathematical objects
We work on a real normed space ([NormedAddCommGroup E] [NormedSpace ℝ E]), matching the L4a conventions. is the point-to-set distance Metric.infDist x Γ; the EHM ball is the predicate . The set-stability predicate is L4a’s
verbatim from (~/Code/vault/lean/Reduction.lean) :62. The flow is a Mathlib Flow ℝ E, application written ϕ t x.
2. L-B — Bolzano–Weierstrass wrapper (proved)
Theorem (exists_subseq_tendsto_mem_of_infDist_tendsto_zero). Let be finite-dimensional, nonempty closed and bounded, and a sequence with . Then some subsequence .
Proof idea. Because , eventually , so the tail of lies in the open -thickening Metric.thickening 1 Γ, which is bounded since is. Bolzano–Weierstrass (tendsto_subseq_of_frequently_bounded) then extracts a strictly monotone with . The limit lies in : the two limits (continuity of along the subsequence) and (a subsequence of a null sequence) force by uniqueness of limits, and closed gives .
Why is required, not cosmetic. In Mathlib . So for empty the hypothesis holds vacuously while the conclusion is false — the statement is simply untrue without nonemptiness. IsClosed.mem_iff_infDist_zero demands it too. In the application is the compact (hence nonempty) target set , so the hypothesis is free.
Mathlib lemmas used (paths relative to ~/lean/ctrllib/.lake/packages/mathlib/Mathlib/):
| lemma | file:line |
|---|---|
Metric.tendsto_atTop (ε–N unfolding, as in Reduction.lean:127) | Topology/MetricSpace/Pseudo/Defs |
Metric.mem_thickening_iff_infDist_lt | Topology/MetricSpace/Thickening.lean:145 |
Bornology.IsBounded.thickening | Topology/MetricSpace/Thickening.lean:172 |
tendsto_subseq_of_frequently_bounded | Topology/MetricSpace/Sequences.lean:29 |
FiniteDimensional.proper_real (the ProperSpace gate, priority-900 instance) | Analysis/Normed/Module/FiniteDimension.lean:532 |
Metric.continuous_infDist_pt | Topology/MetricSpace/HausdorffDistance.lean:673 |
StrictMono.tendsto_atTop ({φ : ℕ → ℕ}) | Order/Filter/AtTopBot/Tendsto.lean:84 |
tendsto_nhds_unique | Topology/Separation/Hausdorff.lean:179 |
IsClosed.mem_iff_infDist_zero | Topology/MetricSpace/HausdorffDistance.lean:697 |
Metric.infDist_nonneg | Topology/MetricSpace/HausdorffDistance.lean:582 |
The [FiniteDimensional ℝ E] gate is what unlocks the whole family: proper_real is a priority-900 instance, so ProperSpace E and Bolzano–Weierstrass fire by typeclass resolution with no manual witness — exactly the recon’s linchpin.
3. L-A — escape sequence from instability (proved)
Theorem (escape_sequence_of_not_stableSet). From the negation of set-stability, extract an escape magnitude and two sequences:
Proof idea. Pure logic. Unfold StableSet and push_neg: the negation yields one such that for every there is an with and a with (push-neg turns into ). Instantiate and choose the sequences with their properties. Finally is a squeeze: (Metric.infDist_nonneg) and , with .
This is the first-exit-time-free version: it delivers , not the equality of the full Lemma 22. The refinement needs the intermediate-value first-hitting-time construction, which the recon flags as an interface-cut candidate; that is L-C’s problem, deliberately not this lane’s.
Mathlib lemmas / tactics used:
| lemma / tactic | file:line |
|---|---|
push_neg, choose (core tactics) | — |
tendsto_of_tendsto_of_tendsto_of_le_of_le (the squeeze) | Topology/Order/Basic.lean:230 |
tendsto_const_nhds | Topology/Basic |
tendsto_one_div_add_atTop_nhds_zero_nat | Analysis/SpecificLimits/Basic.lean:69 |
Metric.infDist_nonneg | Topology/MetricSpace/HausdorffDistance.lean:582 |
4. How L-B and L-A feed the hStable discharge (L-C)
Lemma 22’s compact-branch reading (recon §4) is: instability of produces an escape and a sequence with but bounded away from by — that sequence is L-A’s output. When is compact the sequence is automatically bounded, so L-B hands back a subsequence . L-C then forms the escape set (closed via isClosed_le), lifts the neighbourhood of to a uniform tube (IsCompact.exists_cthickening_subset_open), and closes the contradiction with positive invariance () to conclude StableSet ϕ Γ₁. L-C is the long pole — it leans on an external El-Hawwary–Maggiore 2009 lemma not in the corpus (recon §5) — and is the second interface-cut candidate. R5 banks L-B and L-A first precisely because they seal cleanly on their own; the go/no-go on L-C is a separate call.
5. The machine seal
#print axioms on the two sealed theorems, verbatim from the per-file build (lake build Ctrllib.ReductionStability, 2026-07-09; the full project builds clean at 2658 jobs):
info: Ctrllib/ReductionStability.lean:111:0: 'Ctrllib.exists_subseq_tendsto_mem_of_infDist_tendsto_zero' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Ctrllib/ReductionStability.lean:112:0: 'Ctrllib.escape_sequence_of_not_stableSet' depends on axioms: [propext, Classical.choice, Quot.sound]Nothing beyond {propext, Classical.choice, Quot.sound}; no sorryAx.
6. Scope, honestly (ponytail)
- Proved outright: L-B (BW wrapper, thin glue over
tendsto_subseq_of_frequently_bounded+IsClosed.mem_iff_infDist_zero) and L-A (negation-unpacking + reciprocal squeeze). - Corrections vs. the recon sketch:
squeeze_zerodoes not exist in this Mathlib pin — the squeeze istendsto_of_tendsto_of_tendsto_of_le_of_le(Topology/Order/Basic.lean:230); the bounded-set step uses the openBornology.IsBounded.thickening+ strict-<membershipMetric.mem_thickening_iff_infDist_ltrather thancthickening, matching the<1eventual bound directly; L-B needs the extra hypothesis (else false, since ); the binderx̄was renamedxbar(a combining macron is not a valid Lean identifier token). - Not built here: L-C (Lemma-22 assembly + Theorem-6 finish, the
StableSetproducer) and the first-exit-time refinement — both flagged interface-cut candidates, out of this lane.