R5 hStable-discharge groundwork — L-B and L-A

Seal

Rung R5 · Status sealed — both theorems axiom-clean (#print axioms verbatim in 5. The machine seal), no sorryAx, 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 hypothesis hStable : StableSet ϕ Γ₁.
Links: module index · interface ledger · consumes Reduction (L4a) (the StableSet predicate, the Flow conventions) · 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) :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 (/Code/notes/ctrllib_r5_mathlib_recon.md) sliced the 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/):

lemmafile:line
Metric.tendsto_atTop (ε–N unfolding, as in Reduction.lean:127)Topology/MetricSpace/Pseudo/Defs
Metric.mem_thickening_iff_infDist_ltTopology/MetricSpace/Thickening.lean:145
Bornology.IsBounded.thickeningTopology/MetricSpace/Thickening.lean:172
tendsto_subseq_of_frequently_boundedTopology/MetricSpace/Sequences.lean:29
FiniteDimensional.proper_real (the ProperSpace gate, priority-900 instance)Analysis/Normed/Module/FiniteDimension.lean:532
Metric.continuous_infDist_ptTopology/MetricSpace/HausdorffDistance.lean:673
StrictMono.tendsto_atTop ({φ : ℕ → ℕ})Order/Filter/AtTopBot/Tendsto.lean:84
tendsto_nhds_uniqueTopology/Separation/Hausdorff.lean:179
IsClosed.mem_iff_infDist_zeroTopology/MetricSpace/HausdorffDistance.lean:697
Metric.infDist_nonnegTopology/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 / tacticfile:line
push_neg, choose (core tactics)
tendsto_of_tendsto_of_tendsto_of_le_of_le (the squeeze)Topology/Order/Basic.lean:230
tendsto_const_nhdsTopology/Basic
tendsto_one_div_add_atTop_nhds_zero_natAnalysis/SpecificLimits/Basic.lean:69
Metric.infDist_nonnegTopology/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_zero does not exist in this Mathlib pin — the squeeze is tendsto_of_tendsto_of_tendsto_of_le_of_le (Topology/Order/Basic.lean:230); the bounded-set step uses the open Bornology.IsBounded.thickening + strict-< membership Metric.mem_thickening_iff_infDist_lt rather than cthickening, matching the <1 eventual bound directly; L-B needs the extra hypothesis (else false, since ); the binder was renamed xbar (a combining macron is not a valid Lean identifier token).
  • Not built here: L-C (Lemma-22 assembly + Theorem-6 finish, the StableSet producer) and the first-exit-time refinement — both flagged interface-cut candidates, out of this lane.