The stiffness-residual injectivity step, formalized — L4b (TARGET 5)

Seal

Rung rung-1 · Status sealed · #print axioms verbatim in 7. The machine seal — no interface hypotheses in the theorems themselves. This module seals the algebra behind Prop IV.1’s hzero step; the coordinate wiring through the closed-loop field stays with coupled_collapse — see interfaces.
Links: module index · interface ledger · related reduction_cascade, coupled_collapse, rayleigh_sandwich · source giordano2019coordinated · pin pin_stiffness_residual.py

Sealed theorems

stiffness_residual_injective

For and square with injective mulVec, forces .

stiffness_residual_injective’

The physical grouping , matching eq 31 verbatim.

stiffness_gram_posDef

The rectangular-safe congruence: full column rank and give .

What this seals, in one paragraph

Giordano 2019 Prop IV.1 closes its cascade proof with one algebraic sentence: “Applying LaSalle to (34b), implies .” L4a (/Code/vault/lean/reduction_cascade.md) carried the LaSalle output through the reduction engine to the paper’s convergence conclusion, but had to keep that closing sentence as the named hypothesis hzero in the sealed propIV1_tendsto, because it needs field-specific linear algebra no Flow fact supplies. L4b seals exactly that linear algebra: on the -limit set where , the driven dynamics (eq 34b) collapse to the stiffness residual , and with and of full column rank this forces . The module is (/Code/vault/lean/StiffnessResidual.lean), build copy ~/lean/leanpunov/Leanpunov/StiffnessResidual.lean; the SymPy pin is (~/Code/vault/lean/pin_stiffness_residual.py).

1. Where the residual comes from (the physical setup)

The framing paper partitions the closed-loop state into the decoupled CoM-error driver (eq 34a, Hurwitz) and the coupled base+end-effector block (eq 34b-d). The relevant quantities, read from the clean source (not the OCR — see §5):

  • the velocity (eq 15/27),
  • the pose error with (base attitude, eq 25) and (end-effector pose, eq 24),
  • the block stiffness , symmetric positive definite ( by eqs 29-30),
  • the representation Jacobian , defined by (eq 26).

The driven dynamics (eq 34b) read

On the invariant set LaSalle isolates, (from with ), hence ; and on . Every velocity term drops and what remains is the stiffness residual

\boldsymbol J_{\tilde x}^\top\breve{\boldsymbol K}\tilde{\boldsymbol x}=0 \tag{eq 31/34b, on the invariant set}

This is a linear equation in . The whole content of "" is that this linear map is injective.

2. The exact claim, pinned before formalizing

The crucial reading question — flagged in the L4a charter — is what ” full column rank” buys, and whether the prose map is genuinely injective. The SymPy pin settles it before any Lean is written (all four blocks pass):

(A) The faithful square claim is TRUE. Because is square (eq 26 maps ), “full column rank” means nonsingular. Then , so is invertible and . Verified symbolically ( generic) and on 5000 random instances (min ).

(B) The rectangular reduced form is FALSE — and this is why the statement must pin square. For a genuinely rectangular full-column-rank (, ), maps and always has a nontrivial kernel. The pin exhibits the counterexample: (full column rank), , then satisfies . So a Lean lemma stated for rectangular with the reduced residual would be a false seal. The square hypothesis is load-bearing, not cosmetic. This resolves the reduction_cascade.md §7 wording flag (” full column rank on ”): for the square it is correct and means nonsingular.

(C) The rank-robust reason is sign-definiteness. The general (rectangular-safe) truth is the congruence: for full-column-rank (-mulVec injective) and , , because off the origin. Pinned symbolically () and on 3000 random instances (all eigenvalues ). This is the “sign-definiteness on generic full-column-rank ” the charter asked to verify. Note it is not the eq-34b residual (which is , not ) — it is recorded as the reason the square map is injective and as the honest rectangular statement.

(D) really is nonsingular near the target. The base block (unit quaternion ) has (pinned: on , ), and has . So is nonsingular exactly when each quaternion scalar part — automatic near the target (), which is the neighbourhood the local Prop IV.1 claim lives in. (Provenance refinement: the true nonsingularity condition for is , a quaternion-representation condition, distinct from which excludes the manipulator-Jacobian singularities. Both hold near .)

3. The Lean statements

Over n : Type* with [Fintype n] [DecidableEq n] (the thesis uses Fin 9), K J : Matrix n n ℝ.

Headline — stiffness_residual_injective. Given hK : K.PosDef and hJ : Function.Injective J.mulVec (full column rank; for the square J this is nonsingularity), if (Jᵀ * K) *ᵥ x = 0 then x = 0.

Physical grouping — stiffness_residual_injective'. The same with the residual written Jᵀ *ᵥ (K *ᵥ x) = 0 (transpose Jacobian applied to the elastic wrench , matching eq 31 verbatim). One mulVec_mulVec rewrite off the headline.

Sign-definiteness — stiffness_gram_posDef. For K.PosDef and hJ : Function.Injective J.mulVec with J : Matrix n m ℝ (rectangular allowed), (Jᵀ * K * J).PosDef. The (C) statement.

4. Proof narrative and the Mathlib stones

The headline is a three-line invertibility argument.

  1. K is a unit. Matrix.PosDef.isUnit (over a field with DecidableEq): a positive-definite matrix has trivial mulVec kernel, hence is invertible. So IsUnit K.
  2. J is a unit. For a square matrix over a field, injective mulVec invertible: Matrix.mulVec_injective_iff_isUnit. The hypothesis hJ (full column rank) therefore gives IsUnit J; Jᵀ is a unit too, via isUnit_iff_isUnit_det and det_transpose ().
  3. The product Jᵀ * K is a unit (IsUnit.mul), so its action is injective: Matrix.mulVec_injective_of_isUnit gives Function.Injective (Jᵀ * K).mulVec. Applying injectivity to (Jᵀ * K) *ᵥ x = 0 = (Jᵀ * K) *ᵥ 0 (mulVec_zero) closes x = 0.

The sign-definiteness lemma is one Mathlib congruence stone: Matrix.PosDef.conjTranspose_mul_mul_same (for A.PosDef and B.mulVec injective, (Bᴴ * A * B).PosDef), with conjTranspose_eq_transpose_of_trivial turning into over (trivial star). This is the same real-conjTranspose peeling used in the sealed Rayleigh module.

No new heavy machinery: the lemma stands on Mathlib’s positive-definite and nonsingular-inverse libraries. It is a genuinely small stone (cost feel: below an L2-scale push — one SymPy pin, one module, one omit/linter fixup cycle, no proof-search struggle).

5. The OCR reconciliation (charter mandatory step, discharged — no PDF needed)

The L4a extraction flagged two garbles to reconcile before committing any coordinate-level set definition. Both are resolved against the rendered clean source, unambiguously, so the original PDF is not required:

  • Prop IV.1 set symbols "", "" are OCR corruption of and . Forced by the explicit state partition (giordano eq 21/26): and . The set has no other consistent reading; "" is not a defined symbol anywhere in the paper. Not ambiguous.
  • The eq-34b residual appears mangled in the OCR (, as ) but the clean eq 31 (line 235 of the source md) gives it verbatim as , and the eq-38 line confirms the term . The residual is unambiguous.

TARGET 5’s lemma is symbol-independent of the set garble anyway (it is pure matrix algebra), so nothing here blocked the seal.

6. What is proven vs. what stays an interface

Proven (real content, non-vacuous, machine-checked): the finite-dimensional injectivity of the stiffness residual — the exact algebra of Prop IV.1’s "" — and the sign-definiteness behind it.

Interface boundary (honest, unchanged from L4a). This module does not by itself discharge propIV1_tendsto.hzero ({y | fderiv V y (f y) = 0} ⊆ Γ₁) at the abstract Flow level. Doing so additionally needs the coordinate-level closed-loop field (eq 34b) to turn the abstract derivative condition fderiv V y (f y) = 0 into (via and the sealed Rayleigh machinery) and then into the residual . That field is deliberately un-formalized across this campaign — the IsSolutionTo interface precedent — so the coordinate wiring stays applier-side. L4b is the final, machine-checked link of that chain: once an applier supplies the field and the collapse to the residual, this lemma delivers , i.e. membership in (with free).

7. The machine seal

#print axioms, verbatim from the build (lake build, 2639 jobs, 2026-07-06):

info: Leanpunov/StiffnessResidual.lean:118:0: 'Leanpunov.stiffness_residual_injective' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Leanpunov/StiffnessResidual.lean:119:0: 'Leanpunov.stiffness_residual_injective'' depends on axioms: [propext, Classical.choice, Quot.sound]
info: Leanpunov/StiffnessResidual.lean:120:0: 'Leanpunov.stiffness_gram_posDef' depends on axioms: [propext, Classical.choice, Quot.sound]

Nothing beyond {propext, Classical.choice, Quot.sound}; no sorryAx. The full project (L1-L4b) builds clean.

Mathlib stones used

  • Matrix.PosDef.isUnit — positive-definite invertible.
  • Matrix.mulVec_injective_iff_isUnit — square, over a field: full column rank nonsingular.
  • Matrix.mulVec_injective_of_isUnit — a unit acts injectively.
  • Matrix.isUnit_iff_isUnit_det, Matrix.det_transpose — transpose of a unit is a unit.
  • Matrix.PosDef.conjTranspose_mul_mul_same, Matrix.conjTranspose_eq_transpose_of_trivial — the congruence sign-definiteness over .